X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fhope_list.erl;h=aba9944f9d5b7ee53c2a3a0a73ee52f3a3e76e34;hb=2a81fbac3178e649d03519f7b1b25e43d7850713;hp=9ce451e927d454940d3dca236266492dd6b61051;hpb=17b5d686d1b6c608c8fab801f44701bb0c6cccf3;p=hope.git diff --git a/src/hope_list.erl b/src/hope_list.erl index 9ce451e..aba9944 100644 --- a/src/hope_list.erl +++ b/src/hope_list.erl @@ -6,6 +6,8 @@ -export( [ unique_preserve_order/1 + , map_rev/2 + , map_slow/2 ]). @@ -13,6 +15,30 @@ [A]. +%% @doc lists:reverse(map_rev(L, F)) +%% @end +-spec map_slow([A], fun((A) -> (B))) -> + [B]. +map_slow(Xs, F) -> + lists:reverse(map_rev(Xs, F)). + + +%% @doc O(N), tail-recursive equivalent to lists:rev(lists:map(F, L)) +%% @end +-spec map_rev([A], fun((A) -> (B))) -> + [B]. +map_rev(Xs, F) -> + map_rev_acc(Xs, F, []). + +-spec map_rev_acc([A], fun((A) -> (B)), [B]) -> + [B]. +map_rev_acc([], _, Ys) -> + Ys; +map_rev_acc([X|Xs], F, Ys) -> + Y = F(X), + map_rev_acc(Xs, F, [Y|Ys]). + + -spec unique_preserve_order(t(A)) -> t(A). unique_preserve_order(L) ->