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