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