diff options
author | Robert Peterson <robert.peterson@gmail.com> | 2019-04-17 10:33:42 -0700 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2019-04-17 22:14:16 +0100 |
commit | 6af96f1c5eb9bca79b8b8751f8f2d7292f959a75 (patch) | |
tree | 135248312a371009e0467326dc5a513bfb696465 /src | |
parent | e5c151ddfe1d083336ae0e912418cf1e35a954ec (diff) | |
download | gleam_stdlib-6af96f1c5eb9bca79b8b8751f8f2d7292f959a75.tar.gz gleam_stdlib-6af96f1c5eb9bca79b8b8751f8f2d7292f959a75.zip |
Add list:intersperse list:at list:unique list:sort
Diffstat (limited to 'src')
-rw-r--r-- | src/list.gleam | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/list.gleam b/src/list.gleam index 5ea2ee3..5aa1e8e 100644 --- a/src/list.gleam +++ b/src/list.gleam @@ -184,3 +184,57 @@ pub fn zip(l1, l2) { | {[x1 | rest1], [x2 | rest2] } -> [ {x1, x2} | zip(rest1, rest2) ] } } + +pub fn intersperse(list, elem) { + case list { + | [] -> [] + | [x | []] -> [x] + | [x | rest] -> [x | [elem | intersperse(rest, elem)]] + } +} + +pub fn at(list, i) { + case i < 0 { + | True -> Error(NotFound) + | False -> + case list { + | [] -> Error(NotFound) + | [x | rest] -> + case i == 0 { + | True -> Ok(x) + | False -> at(rest, i - 1) + } + } + } +} + +pub fn unique(list) { + case list { + | [] -> [] + | [x | rest] -> [x | unique(filter(rest, fn(y) { y != x }))] + } +} + +fn merge_sort(a, b) { + case {a, b} { + | {[], _} -> b + | {_, []} -> a + | {[ax | ar], [bx | br]} -> + case ax < bx { + | True -> [ax | merge_sort(ar, b)] + | False -> [bx | merge_sort(a, br)] + } + } +} + +pub fn sort(list) { + let list_length = length(list) + case list_length < 2 { + | True -> list + | False -> + let split_length = list_length / 2 + let a_list = take(list, split_length) + let b_list = drop(list, split_length) + merge_sort(sort(a_list), sort(b_list)) + } +} |