aboutsummaryrefslogtreecommitdiff
path: root/gen
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2019-03-15 16:32:58 +0000
committerLouis Pilfold <louis@lpil.uk>2019-03-15 16:32:58 +0000
commit4c7843f37978ad44ccf0639501ffb9adfbe53a11 (patch)
tree9bc156e4ea53161d6d90ca38647d29ac24f124b4 /gen
parentd613e26ebd67b704ab58c28cc559ee01ae03b547 (diff)
downloadgleam_stdlib-4c7843f37978ad44ccf0639501ffb9adfbe53a11.tar.gz
gleam_stdlib-4c7843f37978ad44ccf0639501ffb9adfbe53a11.zip
Comparison operators
Diffstat (limited to 'gen')
-rw-r--r--gen/list.erl74
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() ->
[].