aboutsummaryrefslogtreecommitdiff
path: root/src/list.gleam
diff options
context:
space:
mode:
Diffstat (limited to 'src/list.gleam')
-rw-r--r--src/list.gleam39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/list.gleam b/src/list.gleam
index d191b1e..9b85260 100644
--- a/src/list.gleam
+++ b/src/list.gleam
@@ -119,6 +119,13 @@ pub fn map(list, fun) {
do_map(list, fun, [])
}
+fn do_map(list, fun, acc) {
+ case list {
+ | [] -> reverse(acc)
+ | x :: xs -> do_map(xs, fun, fun(x) :: acc)
+ }
+}
+
test map {
[]
|> map(_, fn(x) { x * 2 })
@@ -129,13 +136,39 @@ test map {
|> expect:equal(_, [0, 8, 10, 14, 6])
}
-fn do_map(list, fun, acc) {
+pub fn traverse(list, fun) {
+ do_traverse(list, fun, [])
+}
+
+pub fn do_traverse(list, fun, acc) {
case list {
- | [] -> reverse(acc)
- | x :: xs -> do_map(xs, fun, fun(x) :: acc)
+ | [] -> Ok(reverse(acc))
+ | x :: xs ->
+ case fun(x) {
+ Ok(y) -> do_traverse(xs, fun, y :: acc)
+ error -> error
+ }
+ }
+}
+
+test traverse {
+ fun = fn(x) {
+ case x < 6 {
+ True -> Ok(x * 2)
+ False -> Error(x)
+ }
}
+
+ [0, 4, 5, 6, 3]
+ |> traverse(_, fun)
+ |> expect:equal(_, Ok([0, 8, 10, 12, 6]))
+
+ [0, 4, 5, 7, 3]
+ |> traverse(_, fun)
+ |> expect:equal(_, Error(7)))
}
+
pub fn drop(list, n) {
case n <= 0 {
| True -> list