aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2018-10-29 17:21:20 +0000
committerLouis Pilfold <louis@lpil.uk>2018-10-29 18:58:18 +0000
commita7615f479ff1b09cde9e99c5989abcf2f12b8930 (patch)
tree1aaeb6adeed313ae8099d61f97785658f46b434f
parentf3b6ac1c3e681a4d1a240b9aa93375d830ef4c40 (diff)
downloadgleam_stdlib-a7615f479ff1b09cde9e99c5989abcf2f12b8930.tar.gz
gleam_stdlib-a7615f479ff1b09cde9e99c5989abcf2f12b8930.zip
Decode lib sketch
-rw-r--r--src/any.gleam2
-rw-r--r--src/list.gleam39
-rw-r--r--src/result.gleam2
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
}