aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/gleam/javascript/promise.gleam13
-rw-r--r--test/gleam/javascript/promise_test.gleam18
3 files changed, 32 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 845f2ac..e99cc60 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,4 +8,4 @@
`to_list`, `from_list`, `map`, `fold`, `fold_right`, `get`, and `length`
functions.
- The `javascript/promise` module was created with the `Promise(value)` type and
- `resolve`, `tap`, `map`, and `then` functions.
+ `resolve`, `tap`, `map_try`, `map`, and `then` functions.
diff --git a/src/gleam/javascript/promise.gleam b/src/gleam/javascript/promise.gleam
index 2437dc0..7e3670a 100644
--- a/src/gleam/javascript/promise.gleam
+++ b/src/gleam/javascript/promise.gleam
@@ -18,3 +18,16 @@ pub fn tap(promise: Promise(a), callback: fn(a) -> b) -> Promise(a) {
a
})
}
+
+pub fn map_try(
+ promise: Promise(Result(a, e)),
+ callback: fn(a) -> Result(b, e),
+) -> Promise(Result(b, e)) {
+ promise
+ |> map(fn(result) {
+ case result {
+ Ok(a) -> callback(a)
+ Error(e) -> Error(e)
+ }
+ })
+}
diff --git a/test/gleam/javascript/promise_test.gleam b/test/gleam/javascript/promise_test.gleam
index 289714b..9d37984 100644
--- a/test/gleam/javascript/promise_test.gleam
+++ b/test/gleam/javascript/promise_test.gleam
@@ -35,3 +35,21 @@ pub fn tap_test() -> Promise(Int) {
|> promise.tap(fn(a) { a + 1 })
|> promise.tap(fn(a) { assert 1 = a })
}
+
+pub fn map_try_ok_ok_test() -> Promise(Result(Int, Int)) {
+ promise.resolve(Ok(1))
+ |> promise.map_try(fn(a) { Ok(a + 1) })
+ |> promise.tap(fn(a) { assert Ok(2) = a })
+}
+
+pub fn map_try_ok_error_test() -> Promise(Result(Int, Int)) {
+ promise.resolve(Ok(1))
+ |> promise.map_try(fn(a) { Error(a + 1) })
+ |> promise.tap(fn(a) { assert Error(2) = a })
+}
+
+pub fn map_try_error_test() -> Promise(Result(Int, Int)) {
+ promise.resolve(Error(1))
+ |> promise.map_try(fn(a) { Ok(a + 1) })
+ |> promise.tap(fn(a) { assert Error(1) = a })
+}