-module(docs@utils@timer). -compile([no_auto_import, nowarn_unused_vars]). -export([timer/2, interval/2]). -export_type([timer_msg/0]). -type timer_msg() :: cancel | {timeout, fun(() -> nil)} | {interval, gleam@erlang@process:subject(timer_msg()), integer(), fun(() -> nil)}. -spec handle_timer_message(timer_msg(), integer()) -> gleam@otp@actor:next(integer()). handle_timer_message(Msg, State) -> case Msg of cancel -> {stop, normal}; {timeout, Cb} -> Cb(), {stop, normal}; {interval, Actor, Interval_ms, Cb@1} -> Cb@1(), gleam@erlang@process:send_after( Actor, Interval_ms, {interval, Actor, Interval_ms, Cb@1} ), {continue, State} end. -spec timer(integer(), fun(() -> nil)) -> gleam@erlang@process:timer(). timer(Interval_ms, Callback) -> _assert_subject = gleam@otp@actor:start( Interval_ms, fun handle_timer_message/2 ), {ok, Actor} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"docs/utils/timer"/utf8>>, function => <<"timer"/utf8>>, line => 34}) end, gleam@erlang@process:send_after(Actor, Interval_ms, {timeout, Callback}). -spec interval(integer(), fun(() -> nil)) -> fun(() -> nil). interval(Interval_ms, Callback) -> _assert_subject = gleam@otp@actor:start( Interval_ms, fun handle_timer_message/2 ), {ok, Actor} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"docs/utils/timer"/utf8>>, function => <<"interval"/utf8>>, line => 41}) end, gleam@erlang@process:send_after( Actor, Interval_ms, {interval, Actor, Interval_ms, Callback} ), fun() -> gleam@otp@actor:send(Actor, cancel) end.