diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/gleam/javascript/promise.gleam | 13 | ||||
-rw-r--r-- | test/gleam/javascript/promise_test.gleam | 18 |
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 }) +} |