Implement a tail-recursive list map.
[hope.git] / src / hope_list.erl
index 0d71ece..91ab916 100644 (file)
@@ -6,15 +6,62 @@
 
 -export(
     [ unique_preserve_order/1
+    , map/2
     , map_rev/2
     , map_slow/2
     ]).
 
 
+-define(RECURSION_LIMIT, 1000).
+
+
 -type t(A) ::
     [A].
 
 
+%% @doc Tail-recursive equivalent of lists:map/2
+%% @end
+-spec map([A], fun((A) -> (B))) ->
+    [B].
+map(Xs, F) ->
+    map(Xs, F, 0).
+
+-spec map([A], fun((A) -> (B)), non_neg_integer()) ->
+    [B].
+map([], _, _) ->
+    [];
+map([X1], F, _) ->
+    Y1 = F(X1),
+    [Y1];
+map([X1, X2], F, _) ->
+    Y1 = F(X1),
+    Y2 = F(X2),
+    [Y1, Y2];
+map([X1, X2, X3], F, _) ->
+    Y1 = F(X1),
+    Y2 = F(X2),
+    Y3 = F(X3),
+    [Y1, Y2, Y3];
+map([X1, X2, X3, X4], F, _) ->
+    Y1 = F(X1),
+    Y2 = F(X2),
+    Y3 = F(X3),
+    Y4 = F(X4),
+    [Y1, Y2, Y3, Y4];
+map([X1, X2, X3, X4, X5 | Xs], F, Count) ->
+    Y1 = F(X1),
+    Y2 = F(X2),
+    Y3 = F(X3),
+    Y4 = F(X4),
+    Y5 = F(X5),
+    Ys =
+        case Count > ?RECURSION_LIMIT
+        of  true  -> map_slow(Xs, F)
+        ;   false -> map     (Xs, F, Count + 1)
+        end,
+    [Y1, Y2, Y3, Y4, Y5 | Ys].
+
+
 %% @doc lists:reverse(map_rev(L, F))
 %% @end
 -spec map_slow([A], fun((A) -> (B))) ->
This page took 0.026792 seconds and 4 git commands to generate.