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(QDF, QDG) :: {step,
fun((env()) -> {env(), {ok, QDF} | {error, QDG}})}.
-spec new(binary(), fun(() -> step(QDH, QDI))) -> step(QDH, QDI).
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(QDN, QDO))) -> step(QDN, QDO).
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(QDT, QDU), fun((QDU) -> QDX), fun((QDT) -> step(QDY, QDX))) -> step(QDY, QDX).
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, QED} | {error, QEE},
fun((QEE) -> QEH),
fun((QED) -> step(QEI, QEH))
) -> step(QEI, QEH).
'try'(Result, Map_error, Continue) ->
_pipe = {step, fun(Env) -> {Env, Result} end},
run(_pipe, Map_error, Continue).
-spec return(QEN) -> step(QEN, any()).
return(Value) ->
{step, fun(Env) -> {Env, {ok, Value}} end}.
-spec execute(step(QER, QES)) -> {ok, QER} | {error, QES}.
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.