Current section

Files

Jump to
lustre src lustre@cli@step.erl
Raw

src/lustre@cli@step.erl

-module(lustre@cli@step).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/2, done/2, run/3, 'try'/3, return/1, execute/1]).
-export_type([spinner_status/0, env/0, step/2]).
-type spinner_status() :: {running, binary()} | stopped.
-type env() :: {env, spinner:spinner(), spinner_status()}.
-opaque step(NWQ, NWR) :: {step,
fun((env()) -> {env(), {ok, NWQ} | {error, NWR}})}.
-spec new(binary(), fun(() -> step(NWS, NWT))) -> step(NWS, NWT).
new(Message, Continue) ->
{step,
fun(_use0) ->
{env, Spinner, Spinner_status} = _use0,
case Spinner_status of
{running, _} ->
spinner:set_text(Spinner, Message),
(erlang:element(2, Continue()))(
{env, Spinner, {running, Message}}
);
stopped ->
New_spinner = begin
_pipe = spinner:new(Message),
_pipe@1 = spinner:with_frames(
_pipe,
[<<"⠋"/utf8>>,
<<"⠙"/utf8>>,
<<"⠹"/utf8>>,
<<"⠸"/utf8>>,
<<"⠼"/utf8>>,
<<"⠴"/utf8>>,
<<"⠦"/utf8>>,
<<"⠧"/utf8>>,
<<"⠇"/utf8>>,
<<"⠏"/utf8>>]
),
spinner:start(_pipe@1)
end,
(erlang:element(2, Continue()))(
{env, New_spinner, {running, Message}}
)
end
end}.
-spec done(binary(), fun(() -> step(NWY, NWZ))) -> step(NWY, NWZ).
done(Message, Continue) ->
{step,
fun(_use0) ->
{env, Spinner, Spinner_status} = _use0,
case Spinner_status of
{running, _} ->
spinner:stop(Spinner);
stopped ->
nil
end,
gleam@io:println(gleam_community@ansi:green(Message)),
(erlang:element(2, Continue()))({env, Spinner, stopped})
end}.
-spec run(step(NXE, NXF), fun((NXF) -> NXI), fun((NXE) -> step(NXJ, NXI))) -> step(NXJ, NXI).
run(Step, Map_error, Continue) ->
{step, fun(Env) -> case (erlang:element(2, Step))(Env) of
{New_env, {ok, Res}} ->
(erlang:element(2, Continue(Res)))(New_env);
{New_env@1, {error, E}} ->
{New_env@1, {error, Map_error(E)}}
end end}.
-spec 'try'(
{ok, NXO} | {error, NXP},
fun((NXP) -> NXS),
fun((NXO) -> step(NXT, NXS))
) -> step(NXT, NXS).
'try'(Result, Map_error, Continue) ->
_pipe = {step, fun(Env) -> {Env, Result} end},
run(_pipe, Map_error, Continue).
-spec return(NXY) -> step(NXY, any()).
return(Value) ->
{step, fun(Env) -> {Env, {ok, Value}} end}.
-spec execute(step(NYC, NYD)) -> {ok, NYC} | {error, NYD}.
execute(Step) ->
Initial_spinner = begin
_pipe = spinner:new(<<""/utf8>>),
_pipe@1 = spinner:with_frames(
_pipe,
[<<"⠋"/utf8>>,
<<"⠙"/utf8>>,
<<"⠹"/utf8>>,
<<"⠸"/utf8>>,
<<"⠼"/utf8>>,
<<"⠴"/utf8>>,
<<"⠦"/utf8>>,
<<"⠧"/utf8>>,
<<"⠇"/utf8>>,
<<"⠏"/utf8>>]
),
spinner:start(_pipe@1)
end,
{{env, Spinner, Status}, Res} = (erlang:element(2, Step))(
{env, Initial_spinner, {running, <<""/utf8>>}}
),
case Status of
{running, Message} ->
spinner:stop(Spinner),
gleam@io:println(
<<"❌ "/utf8, (gleam_community@ansi:red(Message))/binary>>
);
stopped ->
nil
end,
Res.