-module(cmd). -compile(no_auto_import). -export([exec/5]). -export_type([timing/0]). -type timing() :: endless | {ending, integer()}. -spec exec( list(integer()), timing(), fun((integer()) -> {ok, HDO} | {error, HDP}), fun((binary()) -> HDP), fun(({integer(), {ok, HDO} | {error, HDP}}) -> binary()) ) -> list(binary()). exec(Days, Timing, Do, Other, Collect) -> _pipe = Days, _pipe@1 = task_map(_pipe, Do), _pipe@2 = try_await_many(_pipe@1, Timing), _pipe@3 = gleam@iterator:from_list(_pipe@2), _pipe@6 = gleam@iterator:map( _pipe@3, fun(X) -> _pipe@4 = X, _pipe@5 = gleam@pair:map_second( _pipe@4, fun(_capture) -> gleam@result:map_error(_capture, Other) end ), gleam@pair:map_second(_pipe@5, fun gleam@result:flatten/1) end ), _pipe@7 = gleam@iterator:map(_pipe@6, Collect), gleam@iterator:to_list(_pipe@7). -spec now_ms() -> integer(). now_ms() -> gleam@erlang:system_time(millisecond). -spec task_map(list(HDW), fun((HDW) -> HDY)) -> list({HDW, gleam@otp@task:task(HDY)}). task_map(L, F) -> gleam@list:map( L, fun(X) -> {X, gleam@otp@task:async(fun() -> F(X) end)} end ). -spec try_await_many(list({HEB, gleam@otp@task:task(HEC)}), timing()) -> list({HEB, {ok, HEC} | {error, binary()}}). try_await_many(Tasks, Timing) -> _pipe@4 = case Timing of endless -> fun(_capture) -> gleam@pair:map_second( _capture, fun(T) -> _pipe = gleam@otp@task:try_await_forever(T), gleam@result:map_error(_pipe, fun await_err_to_string/1) end ) end; {ending, Timeout} -> End = now_ms() + Timeout, fun(_capture@1) -> gleam@pair:map_second( _capture@1, fun(T@1) -> _pipe@1 = End - now_ms(), _pipe@2 = gleam@int:clamp(_pipe@1, 0, Timeout), _pipe@3 = gleam@otp@task:try_await(T@1, _pipe@2), gleam@result:map_error( _pipe@3, fun await_err_to_string/1 ) end ) end end, gleam@list:map(Tasks, _pipe@4). -spec await_err_to_string(gleam@otp@task:await_error()) -> binary(). await_err_to_string(Err) -> case Err of timeout -> <<"task timed out"/utf8>>; {exit, _@1} -> <<"task exited for some reason"/utf8>> end.