diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-03-15 16:32:58 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2019-03-15 16:32:58 +0000 |
commit | 4c7843f37978ad44ccf0639501ffb9adfbe53a11 (patch) | |
tree | 9bc156e4ea53161d6d90ca38647d29ac24f124b4 /gen | |
parent | d613e26ebd67b704ab58c28cc559ee01ae03b547 (diff) | |
download | gleam_stdlib-4c7843f37978ad44ccf0639501ffb9adfbe53a11.tar.gz gleam_stdlib-4c7843f37978ad44ccf0639501ffb9adfbe53a11.zip |
Comparison operators
Diffstat (limited to 'gen')
-rw-r--r-- | gen/list.erl | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/gen/list.erl b/gen/list.erl index 662b283..cf76f31 100644 --- a/gen/list.erl +++ b/gen/list.erl @@ -2,7 +2,7 @@ -compile(no_auto_import). -include_lib("eunit/include/eunit.hrl"). --export([length/1, reverse/1, is_empty/1, has_member/2, head/1, tail/1, map/2, do_traverse/3, traverse/2, new/0, append/2, flatten/1, foldl/3, foldr/3]). +-export([length/1, reverse/1, is_empty/1, has_member/2, head/1, tail/1, filter/2, map/2, do_traverse/3, traverse/2, drop/2, take/2, new/0, append/2, flatten/1, foldl/3, foldr/3]). length(A) -> erlang:length(A). @@ -80,6 +80,33 @@ tail_test() -> expect:equal(tail([]), {error, empty}). -endif. +do_filter(List, Fun, Acc) -> + case List of + [] -> + reverse(Acc); + + [X | Xs] -> + NewAcc = case Fun(X) of + true -> + [X | Acc]; + + false -> + Acc + end, + do_filter(Xs, Fun, NewAcc) + end. + +filter(List, Fun) -> + do_filter(List, Fun, []). + +-ifdef(TEST). +filter_test() -> + expect:equal(filter([], fun(X) -> true end), []), + expect:equal(filter([0, 4, 5, 7, 3], fun(X) -> true end), [0, 4, 5, 7, 3]), + expect:equal(filter([0, 4, 5, 7, 3], fun(X) -> X > 4 end), [5, 7]), + expect:equal(filter([0, 4, 5, 7, 3], fun(X) -> X < 4 end), [0, 3]). +-endif. + do_map(List, Fun, Acc) -> case List of [] -> @@ -129,6 +156,51 @@ traverse_test() -> expect:equal(traverse([4, 6, 5, 7, 3], Fun), {error, 7}). -endif. +drop(List, N) -> + case N =< 0 of + true -> + List; + + false -> + case List of + [] -> + []; + + [X | Xs] -> + drop(Xs, N - 1) + end + end. + +-ifdef(TEST). +drop_test() -> + expect:equal(drop([], 5), []), + expect:equal(drop([1, 2, 3, 4, 5, 6, 7, 8], 5), [6, 7, 8]). +-endif. + +do_take(List, N, Acc) -> + case N =< 0 of + true -> + reverse(Acc); + + false -> + case List of + [] -> + reverse(Acc); + + [X | Xs] -> + do_take(Xs, N - 1, [X | Acc]) + end + end. + +take(List, N) -> + do_take(List, N, []). + +-ifdef(TEST). +take_test() -> + expect:equal(take([], 5), []), + expect:equal(take([1, 2, 3, 4, 5, 6, 7, 8], 5), [1, 2, 3, 4, 5]). +-endif. + new() -> []. |