X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fhope_list.erl;h=aba9944f9d5b7ee53c2a3a0a73ee52f3a3e76e34;hb=2a81fbac3178e649d03519f7b1b25e43d7850713;hp=5ce527c613cae6dad47c75bf61eb1b4b4d849806;hpb=a6244ba215ae16c32adce3b1c98468e007f3c582;p=hope.git diff --git a/src/hope_list.erl b/src/hope_list.erl index 5ce527c..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,14 +15,38 @@ [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) -> - AppendIfNew = + PrependIfNew = fun (X, Xs) -> case lists:member(X, Xs) - of true -> Xs - ; false -> Xs ++ [X] + of true -> Xs + ; false -> [X | Xs] end end, - lists:foldl(AppendIfNew, [], L). + lists:reverse(lists:foldl(PrependIfNew, [], L)).