Current section
Files
Jump to
Current section
Files
src/docs@utils@timer.erl
-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.