diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-06-25 22:48:07 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2019-06-25 22:48:07 +0100 |
commit | 2c2541750ca4b7b604070c75c18d84be833c97d5 (patch) | |
tree | f5e63d941a1c7e2c2d4dff1d81c43fa2766308ae /gen/src/gleam@list.erl | |
parent | 96c20b8ebf8420fbba75c97fa08eaeb34e8dc394 (diff) | |
download | gleam_stdlib-2c2541750ca4b7b604070c75c18d84be833c97d5.tar.gz gleam_stdlib-2c2541750ca4b7b604070c75c18d84be833c97d5.zip |
stdlib namespace std -> gleam
Diffstat (limited to 'gen/src/gleam@list.erl')
-rw-r--r-- | gen/src/gleam@list.erl | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/gen/src/gleam@list.erl b/gen/src/gleam@list.erl new file mode 100644 index 0000000..548e983 --- /dev/null +++ b/gen/src/gleam@list.erl @@ -0,0 +1,369 @@ +-module(gleam@list). +-compile(no_auto_import). + +-export([length/1, reverse/1, is_empty/1, contains/2, head/1, tail/1, filter/2, map/2, index_map/2, traverse/2, drop/2, take/2, new/0, append/2, flatten/1, fold/3, fold_right/3, find/2, all/2, any/2, zip/2, strict_zip/2, intersperse/2, at/2, unique/1, sort/1, range/2, repeat/2, split/2, split_while/2]). + +length(A) -> + erlang:length(A). + +reverse(A) -> + lists:reverse(A). + +is_empty(List) -> + List =:= []. + +contains(List, Elem) -> + case List of + [] -> + false; + + [Head | Rest] -> + Head =:= Elem orelse contains(Rest, Elem) + end. + +head(List) -> + case List of + [] -> + {error, empty}; + + [X | _] -> + {ok, X} + end. + +tail(List) -> + case List of + [] -> + {error, empty}; + + [_ | Xs] -> + {ok, Xs} + end. + +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, []). + +do_map(List, Fun, Acc) -> + case List of + [] -> + reverse(Acc); + + [X | Xs] -> + do_map(Xs, Fun, [Fun(X) | Acc]) + end. + +map(List, Fun) -> + do_map(List, Fun, []). + +do_index_map(List, Fun, Index, Acc) -> + case List of + [] -> + reverse(Acc); + + [X | Xs] -> + do_index_map(Xs, Fun, Index + 1, [Fun(Index, X) | Acc]) + end. + +index_map(List, Fun) -> + do_index_map(List, Fun, 0, []). + +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, []). + +drop(List, N) -> + case N =< 0 of + true -> + List; + + false -> + case List of + [] -> + []; + + [_ | Xs] -> + drop(Xs, N - 1) + end + end. + +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, []). + +new() -> + []. + +append(A, B) -> + lists:append(A, B). + +do_flatten(Lists, Acc) -> + case Lists of + [] -> + Acc; + + [L | Rest] -> + do_flatten(Rest, append(Acc, L)) + end. + +flatten(Lists) -> + do_flatten(Lists, []). + +fold(List, Acc, Fun) -> + case List of + [] -> + Acc; + + [X | Rest] -> + fold(Rest, Fun(X, Acc), Fun) + end. + +fold_right(List, Acc, Fun) -> + case List of + [] -> + Acc; + + [X | Rest] -> + Fun(X, fold_right(Rest, Acc, Fun)) + end. + +find(Haystack, F) -> + case Haystack of + [] -> + {error, not_found}; + + [X | Rest] -> + case F(X) of + {ok, X1} -> + {ok, X1}; + + _ -> + find(Rest, F) + end + end. + +all(List, F) -> + case List of + [] -> + true; + + [X | Rest] -> + case F(X) of + true -> + all(Rest, F); + + _ -> + false + end + end. + +any(List, F) -> + case List of + [] -> + false; + + [X | Rest] -> + case F(X) of + false -> + any(Rest, F); + + _ -> + true + end + end. + +zip(L1, L2) -> + case {L1, L2} of + {[], _} -> + []; + + {_, []} -> + []; + + {[X1 | Rest1], [X2 | Rest2]} -> + [{X1, X2} | zip(Rest1, Rest2)] + end. + +strict_zip(L1, L2) -> + case length(L1) =:= length(L2) of + true -> + {ok, zip(L1, L2)}; + + false -> + {error, length_mismatch} + end. + +intersperse(List, Elem) -> + case List of + [] -> + []; + + [X] -> + [X]; + + [X1 | Rest] -> + [X1, Elem | intersperse(Rest, Elem)] + end. + +at(List, I) -> + case I < 0 of + true -> + {error, not_found}; + + false -> + case List of + [] -> + {error, not_found}; + + [X | Rest] -> + case I =:= 0 of + true -> + {ok, X}; + + false -> + at(Rest, I - 1) + end + end + end. + +unique(List) -> + case List of + [] -> + []; + + [X | Rest] -> + [X | unique(filter(Rest, fun(Y) -> Y /= X end))] + end. + +merge_sort(A, B) -> + case {A, B} of + {[], _} -> + B; + + {_, []} -> + A; + + {[Ax | Ar], [Bx | Br]} -> + case Ax < Bx of + true -> + [Ax | merge_sort(Ar, B)]; + + false -> + [Bx | merge_sort(A, Br)] + end + end. + +sort(List) -> + ListLength = length(List), + case ListLength < 2 of + true -> + List; + + false -> + SplitLength = ListLength div 2, + AList = take(List, SplitLength), + BList = drop(List, SplitLength), + merge_sort(sort(AList), sort(BList)) + end. + +range(Start, Stop) -> + case gleam@int:compare(Start, Stop) of + eq -> + []; + + gt -> + [Start | range(Start - 1, Stop)]; + + lt -> + [Start | range(Start + 1, Stop)] + end. + +do_repeat(A, Times, Acc) -> + case Times =< 0 of + true -> + Acc; + + false -> + do_repeat(A, Times - 1, [A | Acc]) + end. + +repeat(A, Times) -> + do_repeat(A, Times, []). + +do_split(List, N, Taken) -> + case N =< 0 of + true -> + {reverse(Taken), List}; + + false -> + case List of + [] -> + {reverse(Taken), []}; + + [X | Xs] -> + do_split(Xs, N - 1, [X | Taken]) + end + end. + +split(List, N) -> + do_split(List, N, []). + +do_split_while(List, F, Acc) -> + case List of + [] -> + {reverse(Acc), []}; + + [X | Xs] -> + case F(X) of + false -> + {reverse(Acc), List}; + + _ -> + do_split_while(Xs, F, [X | Acc]) + end + end. + +split_while(List, F) -> + do_split_while(List, F, []). |