From a7615f479ff1b09cde9e99c5989abcf2f12b8930 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Mon, 29 Oct 2018 17:21:20 +0000 Subject: Decode lib sketch --- src/any.gleam | 2 +- src/list.gleam | 39 ++++++++++++++++++++++++++++++++++++--- src/result.gleam | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) (limited to 'src') 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 } -- cgit v1.2.3