Current section
Files
Jump to
Current section
Files
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(IQQ, IQR) :: {register, gleam@erlang@process:subject(IQQ), IQR} |
{demonitor, gleam@erlang:reference_(), gleam@erlang@process:pid_()} |
{group_store,
gleam@erlang@process:subject(lamb:table({IQR,
gleam@erlang@process:pid_()}, gleam@erlang@process:subject(IQQ)))} |
{no_operation, gleam@dynamic:dynamic_()} |
stop.
-type state(IQS, IQT) :: {state,
integer(),
lamb:table({IQT, gleam@erlang@process:pid_()}, gleam@erlang@process:subject(IQS))}.
-type process_down() :: {process_down,
gleam@erlang:reference_(),
gleam@erlang@process:pid_()}.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 150).
-spec register(
gleam@erlang@process:subject(message(IRL, IRM)),
IRM,
gleam@erlang@process:subject(IRL)
) -> nil.
register(Registry, Group, Subject) ->
gleam@erlang@process:send(Registry, {register, Subject, Group}).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 173).
-spec members(gleam@erlang@process:subject(message(IRQ, IRR)), IRR, integer()) -> list(gleam@erlang@process:subject(IRQ)).
members(Registry, Group, Timeout) ->
Group_store = gleam@erlang@process:call(
Registry,
fun(_capture) -> {group_store, _capture} end,
Timeout
),
Query = begin
_pipe = lamb@query:new(),
_pipe@1 = lamb@query:index(_pipe, {Group, lamb@query@term:any()}),
_pipe@2 = lamb@query:record(_pipe@1, lamb@query@term:var(1)),
lamb@query:map(_pipe@2, fun(_, Record) -> Record end)
end,
lamb:search(Group_store, Query).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 197).
-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", 328).
-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}} ->
{demonitor, Monitor, Pid};
{error, nil} ->
{no_operation, Message}
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 343).
-spec schedulers() -> integer().
schedulers() ->
erlang:system_info(erlang:binary_to_atom(<<"schedulers"/utf8>>)).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 353).
-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", 253).
-spec loop(message(ISI, ISJ), state(ISI, ISJ)) -> gleam@otp@actor:next(message(ISI, ISJ), state(ISI, ISJ)).
loop(Message, State) ->
case Message of
{register, Subject, Group} ->
Pid = gleam@erlang@process:subject_owner(Subject),
_ = gleam@erlang@process:monitor_process(Pid),
lamb:insert(erlang:element(3, State), {Group, Pid}, Subject),
{continue, State, none};
{demonitor, Monitor, Pid@1} ->
nil = demonitor(Monitor),
Query = begin
_pipe = lamb@query:new(),
lamb@query:index(_pipe, {lamb@query@term:any(), Pid@1})
end,
lamb:remove(erlang:element(3, State), Query),
{continue, State, none};
{group_store, Client} ->
gleam@erlang@process:send(Client, erlang:element(3, State)),
{continue, State, none};
{no_operation, Message@1} ->
gleam_stdlib:println(
<<"chip: received an out of bound message from a non-selected process.\n"/utf8,
(gleam@string:inspect(Message@1))/binary>>
),
{continue, State, none};
stop ->
{stop, normal}
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 110).
-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) ->
Query = begin
_pipe = lamb@query:new(),
_pipe@1 = lamb@query:index(_pipe, Name),
_pipe@2 = lamb@query:record(_pipe@1, lamb@query@term:var(1)),
lamb@query:map(_pipe@2, fun(_, Record) -> Record end)
end,
case lamb:search(Table, Query) 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 => 123})
end
end
).
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 300).
-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 named registries ETS store"/utf8>>),
module => <<"chip"/utf8>>,
function => <<"initialize_named_registries_store"/utf8>>,
line => 310})
end
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 317).
-spec initialize_groups_store() -> lamb:table({any(),
gleam@erlang@process:pid_()}, 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 => 321})
end.
-file("/Users/chouzar/Bench/Projects/chip/src/chip.gleam", 228).
-spec init(named()) -> gleam@otp@actor:init_result(state(ISA, ISB), message(ISA, ISB)).
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(),
Groups = initialize_groups_store(),
State = {state, Concurrency, 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", 75).
-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, 10, fun loop/2}).