Skip to content

Commit f7d6fe3

Browse files
scriptteaselpil
authored andcommitted
Adds split to list stdlib
1 parent 1d91cb0 commit f7d6fe3

File tree

5 files changed

+64
-3
lines changed

5 files changed

+64
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
- The `map_dict` module gains `update`, `merge` and `delete` functions.
66
- The `bool` module gains a `compare` function.
77
- The `int` module gains a `compare` function.
8-
- The `list` module gains `range`, `repeat`, and `strict_zip` functions.
8+
- The `list` module gains `range`, `repeat`, `split`, and `strict_zip` functions.
99

1010
## v0.1.2 - 2019-04-25
1111

gen/src/list.erl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
-module(list).
22
-compile(no_auto_import).
33

4-
-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]).
4+
-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]).
55

66
length(A) ->
77
erlang:length(A).
@@ -331,3 +331,21 @@ do_repeat(A, Times, Acc) ->
331331

332332
repeat(A, Times) ->
333333
do_repeat(A, Times, []).
334+
335+
do_split(List, N, Taken) ->
336+
case N =< 0 of
337+
true ->
338+
{reverse(Taken), List};
339+
340+
false ->
341+
case List of
342+
[] ->
343+
{reverse(Taken), []};
344+
345+
[X | Xs] ->
346+
do_split(Xs, N - 1, [X | Taken])
347+
end
348+
end.
349+
350+
split(List, N) ->
351+
do_split(List, N, []).

gen/test/list_test.erl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
-module(list_test).
22
-compile(no_auto_import).
33

4-
-export([length_test/0, reverse_test/0, is_empty_test/0, contains_test/0, head_test/0, tail_test/0, filter_test/0, map_test/0, traverse_test/0, drop_test/0, take_test/0, new_test/0, append_test/0, flatten_test/0, fold_test/0, fold_right_test/0, find_test/0, all_test/0, any_test/0, zip_test/0, strict_zip_test/0, intersperse_test/0, at_test/0, unique_test/0, sort_test/0, index_map_test/0, range_test/0, repeat_test/0]).
4+
-export([length_test/0, reverse_test/0, is_empty_test/0, contains_test/0, head_test/0, tail_test/0, filter_test/0, map_test/0, traverse_test/0, drop_test/0, take_test/0, new_test/0, append_test/0, flatten_test/0, fold_test/0, fold_right_test/0, find_test/0, all_test/0, any_test/0, zip_test/0, strict_zip_test/0, intersperse_test/0, at_test/0, unique_test/0, sort_test/0, index_map_test/0, range_test/0, repeat_test/0, split_test/0]).
55

66
length_test() ->
77
expect:equal(list:length([]), 0),
@@ -162,3 +162,11 @@ repeat_test() ->
162162
expect:equal(list:repeat(2, 3), [2, 2, 2]),
163163
expect:equal(list:repeat(<<"x">>, 5),
164164
[<<"x">>, <<"x">>, <<"x">>, <<"x">>, <<"x">>]).
165+
166+
split_test() ->
167+
expect:equal(list:split([], 0), {[], []}),
168+
expect:equal(list:split([0, 1, 2, 3, 4], 0), {[], [0, 1, 2, 3, 4]}),
169+
expect:equal(list:split([0, 1, 2, 3, 4], -2), {[], [0, 1, 2, 3, 4]}),
170+
expect:equal(list:split([0, 1, 2, 3, 4], 1), {[0], [1, 2, 3, 4]}),
171+
expect:equal(list:split([0, 1, 2, 3, 4], 3), {[0, 1, 2], [3, 4]}),
172+
expect:equal(list:split([0, 1, 2, 3, 4], 9), {[0, 1, 2, 3, 4], []}).

src/list.gleam

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,18 @@ fn do_repeat(a, times, acc) {
274274
pub fn repeat(a, times) {
275275
do_repeat(a, times, [])
276276
}
277+
278+
fn do_split(list, n, taken) {
279+
case n <= 0 {
280+
| True -> {reverse(taken), list}
281+
| False ->
282+
case list {
283+
| [] -> {reverse(taken), []}
284+
| [x | xs] -> do_split(xs, n - 1, [x | taken])
285+
}
286+
}
287+
}
288+
289+
pub fn split(list, n) {
290+
do_split(list, n, [])
291+
}

test/list_test.gleam

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,23 @@ pub fn repeat_test() {
312312
list:repeat("x", 5)
313313
|> expect:equal(_, ["x", "x", "x", "x", "x"])
314314
}
315+
316+
pub fn split_test() {
317+
list:split([], 0)
318+
|> expect:equal(_, {[], []})
319+
320+
list:split([0, 1, 2, 3, 4], 0)
321+
|> expect:equal(_, {[], [0, 1, 2, 3, 4]})
322+
323+
list:split([0, 1, 2, 3, 4], -2)
324+
|> expect:equal(_, {[], [0, 1, 2, 3, 4]})
325+
326+
list:split([0, 1, 2, 3, 4], 1)
327+
|> expect:equal(_, {[0], [1, 2, 3, 4]})
328+
329+
list:split([0, 1, 2, 3, 4], 3)
330+
|> expect:equal(_, {[0, 1, 2], [3, 4]})
331+
332+
list:split([0, 1, 2, 3, 4], 9)
333+
|> expect:equal(_, {[0, 1, 2, 3, 4], []})
334+
}

0 commit comments

Comments
 (0)