Current section
Files
Jump to
Current section
Files
src/drift@internal@timer.erl
-module(drift@internal@timer).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/drift/internal/timer.gleam").
-export([new/0, add/3, cancel/3, cancel_all/1, expired/2, next_tick/1]).
-export_type([timed_input/1, timer/0, timers/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type timed_input(EJT) :: {timed_input, integer(), integer(), EJT}.
-opaque timer() :: {timer, integer()}.
-opaque timers(EJU) :: {timers, integer(), list(timed_input(EJU))}.
-file("src/drift/internal/timer.gleam", 17).
?DOC(false).
-spec new() -> timers(any()).
new() ->
{timers, 0, []}.
-file("src/drift/internal/timer.gleam", 21).
?DOC(false).
-spec add(timers(EJX), integer(), EJX) -> {timers(EJX), timer()}.
add(Timers, Due_time, Input) ->
Id = erlang:element(2, Timers),
Timer = {timed_input, Id, Due_time, Input},
{{timers, Id + 1, [Timer | erlang:element(3, Timers)]}, {timer, Id}}.
-file("src/drift/internal/timer.gleam", 27).
?DOC(false).
-spec cancel(timers(EKA), integer(), timer()) -> {timers(EKA),
gleam@option:option(integer())}.
cancel(Timers, Now, To_cancel) ->
{New_timers, Canceled@1} = begin
gleam@list:fold(
erlang:element(3, Timers),
{[], none},
fun(_use0, Timer) ->
{Timers@1, Canceled} = _use0,
case erlang:element(2, Timer) =:= erlang:element(2, To_cancel) of
true ->
{Timers@1, {some, erlang:element(3, Timer) - Now}};
false ->
{[Timer | Timers@1], Canceled}
end
end
)
end,
{{timers, erlang:element(2, Timers), New_timers}, Canceled@1}.
-file("src/drift/internal/timer.gleam", 42).
?DOC(false).
-spec cancel_all(timers(EKE)) -> timers(EKE).
cancel_all(Timers) ->
{timers, erlang:element(2, Timers), []}.
-file("src/drift/internal/timer.gleam", 47).
?DOC(false).
-spec expired(timers(EKH), integer()) -> {timers(EKH), list(EKH)}.
expired(Timers, Now) ->
{Expired, Remaining} = gleam@list:partition(
erlang:element(3, Timers),
fun(Timer) -> erlang:element(3, Timer) =< Now end
),
Expired@1 = begin
_pipe = Expired,
_pipe@1 = gleam@list:sort(
_pipe,
fun(A, B) ->
gleam@int:compare(erlang:element(3, A), erlang:element(3, B))
end
),
gleam@list:map(_pipe@1, fun(I) -> erlang:element(4, I) end)
end,
{{timers, erlang:element(2, Timers), Remaining}, Expired@1}.
-file("src/drift/internal/timer.gleam", 59).
?DOC(false).
-spec next_tick(timers(any())) -> gleam@option:option(integer()).
next_tick(Timers) ->
case erlang:element(3, Timers) of
[] ->
none;
[Timer | Rest] ->
{some,
gleam@list:fold(
Rest,
erlang:element(3, Timer),
fun(Min, Timer@1) ->
gleam@int:min(Min, erlang:element(3, Timer@1))
end
)}
end.