Current section
Files
Jump to
Current section
Files
src/utils@tally_counter.erl
-module(utils@tally_counter).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([start/0, stop/1, increment/1, get_count/1]).
-export_type([state/0, message/0]).
-opaque state() :: {state, integer()}.
-opaque message() :: shutdown |
increment |
{get_count, gleam@erlang@process:subject(integer())}.
-spec handle_message(message(), state()) -> gleam@otp@actor:next(message(), state()).
handle_message(Message, State) ->
case Message of
shutdown ->
{stop, normal};
increment ->
gleam@otp@actor:continue({state, erlang:element(2, State) + 1});
{get_count, Reply_with} ->
gleam@erlang@process:send(Reply_with, erlang:element(2, State)),
gleam@otp@actor:continue(State)
end.
-spec start() -> {ok, gleam@erlang@process:subject(message())} |
{error, gleam@otp@actor:start_error()}.
start() ->
gleam@otp@actor:start({state, 0}, fun handle_message/2).
-spec stop(gleam@erlang@process:subject(message())) -> nil.
stop(Actor) ->
gleam@otp@actor:send(Actor, shutdown).
-spec increment(gleam@erlang@process:subject(message())) -> nil.
increment(Actor) ->
gleam@otp@actor:send(Actor, increment).
-spec get_count(gleam@erlang@process:subject(message())) -> integer().
get_count(Actor) ->
gleam@erlang@process:call(
Actor,
fun(_capture) -> {get_count, _capture} end,
1000
).