diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/any.gleam | 2 | ||||
-rw-r--r-- | src/list.gleam | 39 | ||||
-rw-r--r-- | src/result.gleam | 2 |
3 files changed, 38 insertions, 5 deletions
diff --git a/src/any.gleam b/src/any.gleam index 05a789b..7721ad8 100644 --- a/src/any.gleam +++ b/src/any.gleam @@ -9,7 +9,7 @@ pub external type Any doc """ Convert any Gleam data into `Any` data. """ -pub external fn new(a) -> Any = 'gleam_foreign' 'identity' +pub external fn from(a) -> Any = 'gleam_foreign' 'identity' doc """ Unsafely cast any type into any other type.o 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 diff --git a/src/result.gleam b/src/result.gleam index d5aa59e..ad74bb7 100644 --- a/src/result.gleam +++ b/src/result.gleam @@ -83,7 +83,7 @@ test flatten { pub fn flat_map(result, fun) { result - |> unwrap(_, fun) + |> map(_, fun) |> flatten } |