-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.