Packages

A lightweight Gleam library for formatting timestamps as human-readable relative time strings (e.g., '5 minutes ago', 'in 2 hours') with support for multiple locales.

Current section

Files

Jump to
timeago src timeago.erl
Raw

src/timeago.erl

-module(timeago).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/timeago.gleam").
-export([time_ago/3]).
-file("src/timeago.gleam", 46).
-spec unit_to_string(gleam@time@duration:unit()) -> binary().
unit_to_string(Unit) ->
case Unit of
nanosecond ->
<<"nanosecond"/utf8>>;
microsecond ->
<<"microsecond"/utf8>>;
millisecond ->
<<"millisecond"/utf8>>;
second ->
<<"second"/utf8>>;
minute ->
<<"minute"/utf8>>;
hour ->
<<"hour"/utf8>>;
day ->
<<"day"/utf8>>;
week ->
<<"week"/utf8>>;
month ->
<<"month"/utf8>>;
year ->
<<"year"/utf8>>
end.
-file("src/timeago.gleam", 6).
-spec time_ago(
gleam@time@timestamp:timestamp(),
gleam@option:option(gleam@time@timestamp:timestamp()),
gleam@option:option(binary())
) -> binary().
time_ago(Timestamp, Maybe_now, _) ->
Now = gleam@option:unwrap(Maybe_now, gleam@time@timestamp:system_time()),
{Amount, Unit} = gleam@time@duration:approximate(
gleam@time@timestamp:difference(Timestamp, Now)
),
case Unit of
nanosecond ->
<<"just now"/utf8>>;
microsecond ->
<<"just now"/utf8>>;
millisecond ->
<<"just now"/utf8>>;
_ ->
Unit_string = unit_to_string(Unit),
Magnitude = gleam@int:absolute_value(Amount),
Unit_string_suffix = case Magnitude of
1 ->
<<""/utf8>>;
_ ->
<<"s"/utf8>>
end,
case Amount < 0 of
true ->
<<<<<<<<"in "/utf8,
(erlang:integer_to_binary(Magnitude))/binary>>/binary,
" "/utf8>>/binary,
Unit_string/binary>>/binary,
Unit_string_suffix/binary>>;
false ->
<<<<<<<<(erlang:integer_to_binary(Magnitude))/binary,
" "/utf8>>/binary,
Unit_string/binary>>/binary,
Unit_string_suffix/binary>>/binary,
" ago"/utf8>>
end
end.