Current section

Files

Jump to
chip src chip.erl
Raw

src/chip.erl

-module(chip).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([register/3, members/3, stop/1, from/1, start/1]).
-export_type([named/0, message/2, state/2, process_down/0]).
-type named() :: {named, binary()} | unnamed.
-opaque message(IRS, IRT) :: {register, gleam@erlang@process:subject(IRS), IRT} |
{deregister, gleam@erlang:reference_(), gleam@erlang@process:pid_()} |
{group_store2,
gleam@erlang@process:subject(lamb:table(IRT, gleam@erlang@process:subject(IRS)))} |
{no_operation, gleam@dynamic:dynamic_()} |
stop.
-type state(IRU, IRV) :: {state,
integer(),
lamb:table(gleam@erlang@process:pid_(), nil),
lamb:table(IRV, gleam@erlang@process:subject(IRU))}.
-type process_down() :: {process_down,
gleam@erlang:reference_(),
gleam@erlang@process:pid_()}.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 139).
-spec register(
gleam@erlang@process:subject(message(ISN, ISO)),
ISO,
gleam@erlang@process:subject(ISN)
) -> nil.
register(Registry, Group, Subject) ->
gleam@erlang@process:send(Registry, {register, Subject, Group}).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 162).
-spec members(gleam@erlang@process:subject(message(ISS, IST)), IST, integer()) -> list(gleam@erlang@process:subject(ISS)).
members(Registry, Group, Timeout) ->
Group_store = gleam@erlang@process:call(
Registry,
fun(_capture) -> {group_store2, _capture} end,
Timeout
),
lamb:lookup(Group_store, Group).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 180).
-spec stop(gleam@erlang@process:subject(message(any(), any()))) -> nil.
stop(Registry) ->
gleam@erlang@process:send(Registry, stop).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 334).
-spec monitor(
lamb:table(gleam@erlang@process:pid_(), nil),
gleam@erlang@process:pid_()
) -> nil.
monitor(Monitors, Pid) ->
case lamb:any(Monitors, Pid) of
true ->
nil;
false ->
_ = gleam@erlang@process:monitor_process(Pid),
nil
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 320).
-spec process_down(gleam@dynamic:dynamic_()) -> message(any(), any()).
process_down(Message) ->
case chip_erlang_ffi:decode_down_message(Message) of
{ok, {process_down, Monitor, Pid}} ->
{deregister, Monitor, Pid};
{error, nil} ->
{no_operation, Message}
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 348).
-spec schedulers() -> integer().
schedulers() ->
erlang:system_info(erlang:binary_to_atom(<<"schedulers"/utf8>>)).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 358).
-spec demonitor(gleam@erlang:reference_()) -> nil.
demonitor(Reference) ->
_ = erlang:demonitor(Reference, [erlang:binary_to_atom(<<"flush"/utf8>>)]),
nil.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 240).
-spec loop(message(ITK, ITL), state(ITK, ITL)) -> gleam@otp@actor:next(message(ITK, ITL), state(ITK, ITL)).
loop(Message, State) ->
case Message of
{group_store2, Client} ->
gleam@erlang@process:send(Client, erlang:element(4, State)),
_pipe = State,
gleam@otp@actor:continue(_pipe);
{register, Subject, Group} ->
Pid = gleam@erlang@process:subject_owner(Subject),
nil = monitor(erlang:element(3, State), Pid),
lamb:insert(erlang:element(3, State), Pid, nil),
lamb:insert(erlang:element(4, State), Group, Subject),
_pipe@1 = State,
gleam@otp@actor:continue(_pipe@1);
{deregister, Monitor, Pid@1} ->
nil = demonitor(Monitor),
lamb:remove(
erlang:element(3, State),
begin
_pipe@2 = lamb@query:new(),
lamb@query:index(_pipe@2, Pid@1)
end
),
lamb:remove(
erlang:element(4, State),
begin
_pipe@3 = lamb@query:new(),
lamb@query:record(
_pipe@3,
{lamb@query@term:tag(<<"subject"/utf8>>),
Pid@1,
lamb@query@term:any()}
)
end
),
_pipe@4 = State,
gleam@otp@actor:continue(_pipe@4);
{no_operation, _} ->
_pipe@5 = State,
gleam@otp@actor:continue(_pipe@5);
stop ->
{stop, normal}
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 105).
-spec from(binary()) -> {ok,
gleam@erlang@process:subject(message(any(), any()))} |
{error, nil}.
from(Name) ->
gleam@result:'try'(
lamb:from_name(<<"chip_registries"/utf8>>),
fun(Table) -> case lamb:lookup(Table, Name) of
[] ->
{error, nil};
[Registry] ->
{ok, Registry};
[_ | _] ->
erlang:error(#{gleam_error => panic,
message => (<<<<<<"Unexpected error trying to retrieve registry "/utf8,
Name/binary>>/binary,
" from ETS table: "/utf8>>/binary,
"chip_registries"/utf8>>),
module => <<"chip"/utf8>>,
function => <<"from"/utf8>>,
line => 112})
end end
).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 289).
-spec initialize_named_registries_store() -> lamb:table(binary(), gleam@erlang@process:subject(message(any(), any()))).
initialize_named_registries_store() ->
case lamb:from_name(<<"chip_registries"/utf8>>) of
{ok, Table} ->
Table;
{error, nil} ->
case lamb:create(<<"chip_registries"/utf8>>, public, set, true) of
{ok, Table@1} ->
Table@1;
{error, _} ->
erlang:error(#{gleam_error => panic,
message => (<<"Unexpected error trying to initialize chip's ETS store"/utf8>>),
module => <<"chip"/utf8>>,
function => <<"initialize_named_registries_store"/utf8>>,
line => 299})
end
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 304).
-spec initialize_monitors_store() -> lamb:table(gleam@erlang@process:pid_(), nil).
initialize_monitors_store() ->
case lamb:create(<<"chip_monitors"/utf8>>, private, set, false) of
{ok, Table} ->
Table;
{error, _} ->
erlang:error(#{gleam_error => panic,
message => (<<"Unexpected error trying to initialize chip's monitor store"/utf8>>),
module => <<"chip"/utf8>>,
function => <<"initialize_monitors_store"/utf8>>,
line => 308})
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 312).
-spec initialize_groups_store() -> lamb:table(any(), gleam@erlang@process:subject(any())).
initialize_groups_store() ->
case lamb:create(<<"chip_groups"/utf8>>, protected, bag, false) of
{ok, Groups} ->
Groups;
{error, _} ->
erlang:error(#{gleam_error => panic,
message => (<<"Unexpected error trying to initialize chip's subject store"/utf8>>),
module => <<"chip"/utf8>>,
function => <<"initialize_groups_store"/utf8>>,
line => 316})
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 213).
-spec init(named()) -> gleam@otp@actor:init_result(state(ITC, ITD), message(ITC, ITD)).
init(Named) ->
Self = gleam@erlang@process:new_subject(),
Table = initialize_named_registries_store(),
case Named of
{named, Name} ->
lamb:insert(Table, Name, Self);
unnamed ->
nil
end,
Concurrency = schedulers(),
Monitors = initialize_monitors_store(),
Groups = initialize_groups_store(),
State = {state, Concurrency, Monitors, Groups},
Selector = begin
_pipe = gleam_erlang_ffi:new_selector(),
_pipe@1 = gleam@erlang@process:selecting(
_pipe,
Self,
fun gleam@function:identity/1
),
gleam@erlang@process:selecting_anything(_pipe@1, fun process_down/1)
end,
{ready, State, Selector}.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 70).
-spec start(named()) -> {ok,
gleam@erlang@process:subject(message(any(), any()))} |
{error, gleam@otp@actor:start_error()}.
start(Named) ->
Init = fun() -> init(Named) end,
gleam@otp@actor:start_spec({spec, Init, 100, fun loop/2}).