diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-03-05 19:11:55 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2019-03-05 19:47:09 +0000 |
commit | d74af16e6a527f46730c3d35554ef55677c9caf4 (patch) | |
tree | abc22ce196abb2b466421f1197a72b14185b3494 /gen | |
parent | ea5e146cf5ffd26a1c77a6b7e3160d98fc503c3c (diff) | |
download | gleam_stdlib-d74af16e6a527f46730c3d35554ef55677c9caf4.tar.gz gleam_stdlib-d74af16e6a527f46730c3d35554ef55677c9caf4.zip |
Compile more of stdlib
Diffstat (limited to 'gen')
-rw-r--r-- | gen/list.erl | 37 |
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() -> []. |