aboutsummaryrefslogtreecommitdiff
path: root/gen
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2019-03-05 19:11:55 +0000
committerLouis Pilfold <louis@lpil.uk>2019-03-05 19:47:09 +0000
commitd74af16e6a527f46730c3d35554ef55677c9caf4 (patch)
treeabc22ce196abb2b466421f1197a72b14185b3494 /gen
parentea5e146cf5ffd26a1c77a6b7e3160d98fc503c3c (diff)
downloadgleam_stdlib-d74af16e6a527f46730c3d35554ef55677c9caf4.tar.gz
gleam_stdlib-d74af16e6a527f46730c3d35554ef55677c9caf4.zip
Compile more of stdlib
Diffstat (limited to 'gen')
-rw-r--r--gen/list.erl37
1 files changed, 36 insertions, 1 deletions
diff --git a/gen/list.erl b/gen/list.erl
index ae1ef24..2d87a6a 100644
--- a/gen/list.erl
+++ b/gen/list.erl
@@ -1,7 +1,7 @@
-module(list).
-include_lib("eunit/include/eunit.hrl").
--export([length/1, reverse/1, is_empty/1, has_member/2, head/1, tail/1, map/2, new/0, foldl/3, foldr/3]).
+-export([length/1, reverse/1, is_empty/1, has_member/2, head/1, tail/1, map/2, do_traverse/3, traverse/2, new/0, foldl/3, foldr/3]).
length(A) ->
erlang:length(A).
@@ -107,6 +107,41 @@ map_test() ->
end([0, 4, 5, 7, 3])).
-endif.
+do_traverse(List, Fun, Acc) ->
+ case List of
+ [] ->
+ {ok, reverse(Acc)};
+
+ [X | Xs] ->
+ case Fun(X) of
+ {ok, Y} ->
+ do_traverse(Xs, Fun, [Y | Acc]);
+
+ {error, Error} ->
+ {error, Error}
+ end
+ end.
+
+traverse(List, Fun) ->
+ do_traverse(List, Fun, []).
+
+-ifdef(TEST).
+traverse_test() ->
+ Fun = fun(X) -> case X =:= 6 orelse X =:= 5 of
+ true ->
+ {ok, X * 2};
+
+ false ->
+ {error, X}
+ end end,
+ _ = fun(Capture1) ->
+ expect:equal(Capture1, {ok, [10, 12, 10, 12]})
+ end(fun(Capture1) -> traverse(Capture1, Fun) end([5, 6, 5, 6])),
+ fun(Capture1) ->
+ expect:equal(Capture1, {error, 7})
+ end(fun(Capture1) -> traverse(Capture1, Fun) end([6, 5, 7, 3])).
+-endif.
+
new() ->
[].