-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).