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