Current section
Files
Jump to
Current section
Files
src/squirrel@internal@eval_extra.erl
-module(squirrel@internal@eval_extra).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([try_fold/3, try_map/2, try_index_fold/3, try_index_map/2]).
-spec try_fold(list(JSY), JTA, fun((JTA, JSY) -> eval:eval(JTA, JTG, JTH))) -> eval:eval(JTA, JTG, JTH).
try_fold(List, Acc, Fun) ->
case List of
[] ->
eval:return(Acc);
[First | Rest] ->
eval:'try'(
Fun(Acc, First),
fun(Acc@1) -> try_fold(Rest, Acc@1, Fun) end
)
end.
-spec try_map(list(JRW), fun((JRW) -> eval:eval(JRY, JVH, JVI))) -> eval:eval(list(JRY), JVH, JVI).
try_map(List, Fun) ->
_pipe = try_fold(
List,
[],
fun(Acc, Item) ->
eval:'try'(
Fun(Item),
fun(Mapped_item) -> eval:return([Mapped_item | Acc]) end
)
end
),
eval:map(_pipe, fun lists:reverse/1).
-spec do_try_index_fold(
integer(),
list(JTY),
JUA,
fun((JUA, JTY, integer()) -> eval:eval(JUA, JUG, JUH))
) -> eval:eval(JUA, JUG, JUH).
do_try_index_fold(Index, List, Acc, Fun) ->
case List of
[] ->
eval:return(Acc);
[First | Rest] ->
eval:'try'(
Fun(Acc, First, Index),
fun(Acc@1) -> do_try_index_fold(Index + 1, Rest, Acc@1, Fun) end
)
end.
-spec try_index_fold(
list(JTL),
JTN,
fun((JTN, JTL, integer()) -> eval:eval(JTN, JTO, JTP))
) -> eval:eval(JTN, JTO, JTP).
try_index_fold(List, Acc, Fun) ->
do_try_index_fold(0, List, Acc, Fun).
-spec try_index_map(
list(JSK),
fun((JSK, integer()) -> eval:eval(JSM, JWQ, JWR))
) -> eval:eval(list(JSM), JWQ, JWR).
try_index_map(List, Fun) ->
_pipe = try_index_fold(
List,
[],
fun(Acc, Item, I) ->
eval:'try'(
Fun(Item, I),
fun(Mapped_item) -> eval:return([Mapped_item | Acc]) end
)
end
),
eval:map(_pipe, fun lists:reverse/1).