Implement hope_list:map_rev/2
[hope.git] / src / hope_list.erl
index 5ce527c..b93ad2d 100644 (file)
@@ -6,6 +6,7 @@
 
 -export(
     [ unique_preserve_order/1
+    , map_rev/2
     ]).
 
 
     [A].
 
 
+%% @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)).
This page took 0.025216 seconds and 4 git commands to generate.