diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-08-29 17:56:01 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-08-29 17:56:01 +0100 |
commit | 30e5e540ab4edf6582ae77f9440044e22d6d197e (patch) | |
tree | 11196f6e11fbd6d2de7840b99d3a250166f047c1 | |
parent | 6abcea012a67ab6b4eafc3401b0e1ca6a368e21a (diff) | |
download | javascript-30e5e540ab4edf6582ae77f9440044e22d6d197e.tar.gz javascript-30e5e540ab4edf6582ae77f9440044e22d6d197e.zip |
Promise rescue
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/ffi.js | 4 | ||||
-rw-r--r-- | src/gleam/javascript/promise.gleam | 5 | ||||
-rw-r--r-- | test/gleam/javascript/promise_test.gleam | 13 |
4 files changed, 23 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 77f90e2..1ce8036 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_try`, `map`, `then_try` and `then` functions. + `rescue`, `resolve`, `tap`, `map_try`, `map`, `then_try` and `then` functions. @@ -94,3 +94,7 @@ export function map_promise(promise, fn) { PromiseLayer.wrap(fn(PromiseLayer.unwrap(value))) ); } + +export function rescue(promise, fn) { + return promise.catch((error) => fn(error)); +} diff --git a/src/gleam/javascript/promise.gleam b/src/gleam/javascript/promise.gleam index 8407c8c..3c7190c 100644 --- a/src/gleam/javascript/promise.gleam +++ b/src/gleam/javascript/promise.gleam @@ -1,3 +1,5 @@ +import gleam/dynamic.{Dynamic} + // TODO: docs // TODO: labels pub external type Promise(value) @@ -5,6 +7,9 @@ pub external type Promise(value) pub external fn resolve(value) -> Promise(value) = "../../ffi.js" "resolve" +pub external fn rescue(Promise(value), fn(Dynamic) -> value) -> Promise(value) = + "../../ffi.js" "rescue" + pub external fn then(Promise(a), fn(a) -> Promise(b)) -> Promise(b) = "../../ffi.js" "then" diff --git a/test/gleam/javascript/promise_test.gleam b/test/gleam/javascript/promise_test.gleam index ea7c3d3..c77cd5a 100644 --- a/test/gleam/javascript/promise_test.gleam +++ b/test/gleam/javascript/promise_test.gleam @@ -71,3 +71,16 @@ pub fn then_try_error_test() -> Promise(Result(Int, Int)) { |> promise.then_try(fn(a) { promise.resolve(Ok(a + 1)) }) |> promise.tap(fn(a) { assert Error(1) = a }) } + +pub fn rescue_healthy_test() { + promise.resolve(1) + |> promise.rescue(fn(_) { 100 }) + |> promise.tap(fn(a) { assert 1 = a }) +} + +pub fn rescue_poisoned_test() { + promise.resolve(1) + |> promise.map(fn(_) { assert 1 = 2 }) + |> promise.rescue(fn(_) { 100 }) + |> promise.tap(fn(a) { assert 100 = a }) +} |