Current section
Files
Jump to
Current section
Files
src/process_waiter.erl
-module(process_waiter).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([await_forever/1]).
-spec await_forever_loop(
gleam@dict:dict(gleam@erlang@process:pid_(), gleam@erlang@process:process_monitor()),
gleam@erlang@process:selector(gleam@erlang@process:pid_())
) -> nil.
await_forever_loop(Pids, Selector) ->
Pid = gleam_erlang_ffi:select(Selector),
Pids@1 = gleam@dict:delete(Pids, Pid),
case maps:size(Pids@1) of
0 ->
nil;
_ ->
await_forever_loop(Pids@1, Selector)
end.
-spec selector_for_monitors(
gleam@dict:dict(gleam@erlang@process:pid_(), gleam@erlang@process:process_monitor())
) -> gleam@erlang@process:selector(gleam@erlang@process:pid_()).
selector_for_monitors(Monitors) ->
_pipe = gleam@dict:values(Monitors),
gleam@list:fold(
_pipe,
gleam_erlang_ffi:new_selector(),
fun(Selector, Monitor) ->
gleam@erlang@process:selecting_process_down(
Selector,
Monitor,
fun(Msg) -> erlang:element(2, Msg) end
)
end
).
-spec await_forever(list(gleam@erlang@process:pid_())) -> nil.
await_forever(Pids) ->
Monitors = begin
_pipe = Pids,
_pipe@1 = gleam@list:map(
_pipe,
fun(Pid) -> {Pid, gleam@erlang@process:monitor_process(Pid)} end
),
maps:from_list(_pipe@1)
end,
Selector = selector_for_monitors(Monitors),
await_forever_loop(Monitors, Selector).