Current section

Files

Jump to
persevero src persevero.erl
Raw

src/persevero.erl

-module(persevero).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/2, apply_constant/2, apply_jitter/2, max_wait_time/2, execute_with_wait/5, execute/4]).
-export_type([error/1, retry_data/2]).
-type error(HPM) :: {retries_exhausted, list(HPM)} | {unallowed_error, HPM}.
-type retry_data(HPN, HPO) :: {retry_data,
{ok, HPN} | {error, error(HPO)},
list(integer())}.
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 33).
-spec new(integer(), fun((integer()) -> integer())) -> gleam@yielder:yielder(integer()).
new(Wait_time, Backoff) ->
gleam@yielder:unfold(Wait_time, fun(Acc) -> {next, Acc, Backoff(Acc)} end).
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 49).
-spec apply_constant(gleam@yielder:yielder(integer()), integer()) -> gleam@yielder:yielder(integer()).
apply_constant(Yielder, Adjustment) ->
_pipe = Yielder,
gleam@yielder:map(
_pipe,
fun(_capture) -> gleam@int:add(_capture, Adjustment) end
).
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 41).
-spec apply_jitter(gleam@yielder:yielder(integer()), integer()) -> gleam@yielder:yielder(integer()).
apply_jitter(Yielder, Upper_bound) ->
apply_constant(Yielder, gleam@int:random(Upper_bound) + 1).
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 57).
-spec max_wait_time(gleam@yielder:yielder(integer()), integer()) -> gleam@yielder:yielder(integer()).
max_wait_time(Yielder, Max_wait_time) ->
_pipe = Yielder,
gleam@yielder:map(
_pipe,
fun(_capture) -> gleam@int:min(_capture, Max_wait_time) end
).
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 117).
-spec do_execute(
gleam@yielder:yielder(integer()),
fun((HQQ) -> boolean()),
integer(),
fun((integer()) -> {ok, HQR} | {error, HQQ}),
fun((integer()) -> nil),
list(integer()),
list(HQQ),
integer()
) -> retry_data(HQR, HQQ).
do_execute(
Yielder,
Allow,
Max_attempts,
Operation,
Wait_function,
Wait_time_acc,
Errors_acc,
Attempt_number
) ->
case begin
_pipe = Yielder,
gleam@yielder:step(_pipe)
end of
{next, Wait_time, Yielder@1} ->
Wait_function(Wait_time),
Wait_time_acc@1 = [Wait_time | Wait_time_acc],
case Operation(Attempt_number) of
{ok, Result} ->
{retry_data,
{ok, Result},
begin
_pipe@1 = Wait_time_acc@1,
lists:reverse(_pipe@1)
end};
{error, Error} ->
case Allow(Error) of
true ->
do_execute(
Yielder@1,
Allow,
Max_attempts,
Operation,
Wait_function,
Wait_time_acc@1,
[Error | Errors_acc],
Attempt_number + 1
);
false ->
{retry_data,
{error, {unallowed_error, Error}},
begin
_pipe@2 = Wait_time_acc@1,
lists:reverse(_pipe@2)
end}
end
end;
done ->
{retry_data,
{error,
{retries_exhausted,
begin
_pipe@3 = Errors_acc,
lists:reverse(_pipe@3)
end}},
begin
_pipe@4 = Wait_time_acc,
lists:reverse(_pipe@4)
end}
end.
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 87).
-spec execute_with_wait(
gleam@yielder:yielder(integer()),
fun((HQJ) -> boolean()),
integer(),
fun((integer()) -> {ok, HQK} | {error, HQJ}),
fun((integer()) -> nil)
) -> retry_data(HQK, HQJ).
execute_with_wait(Yielder, Allow, Max_attempts, Operation, Wait_function) ->
case Max_attempts =< 0 of
true ->
{retry_data, {error, {retries_exhausted, []}}, []};
false ->
Yielder@1 = begin
_pipe = Yielder,
gleam@yielder:take(_pipe, Max_attempts - 1)
end,
Yielder@2 = begin
_pipe@1 = gleam@yielder:from_list([0]),
_pipe@2 = gleam@yielder:append(_pipe@1, Yielder@1),
gleam@yielder:map(
_pipe@2,
fun(_capture) -> gleam@int:max(_capture, 0) end
)
end,
do_execute(
Yielder@2,
Allow,
Max_attempts,
Operation,
Wait_function,
[],
[],
0
)
end.
-file("/Users/josephlyons/Projects/Personal/gleam/persevero/src/persevero.gleam", 71).
-spec execute(
gleam@yielder:yielder(integer()),
fun((HQC) -> boolean()),
integer(),
fun(() -> {ok, HQD} | {error, HQC})
) -> {ok, HQD} | {error, error(HQC)}.
execute(Yielder, Allow, Max_attempts, Operation) ->
erlang:element(
2,
execute_with_wait(
Yielder,
Allow,
Max_attempts,
fun(_) -> Operation() end,
fun gleam_erlang_ffi:sleep/1
)
).