diff --git a/CHANGELOG.md b/CHANGELOG.md index 14edbeb..57d98de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ Bugfixes: Other improvements: +## [v3.1.0](https://github.com/purescript-web/purescript-web-promise/releases/tag/v3.0.0) - 2022-07-30 + +New features: +- Added `thenOrCatch` (#16 by @garyb) + ## [v3.0.0](https://github.com/purescript-web/purescript-web-promise/releases/tag/v3.0.0) - 2022-04-27 Breaking changes: diff --git a/src/Web/Promise.purs b/src/Web/Promise.purs index d39042f..61af045 100644 --- a/src/Web/Promise.purs +++ b/src/Web/Promise.purs @@ -7,7 +7,7 @@ module Web.Promise import Prelude import Effect (Effect) -import Effect.Uncurried (mkEffectFn1, mkEffectFn2, runEffectFn1, runEffectFn2) +import Effect.Uncurried (mkEffectFn1, mkEffectFn2, runEffectFn1, runEffectFn2, runEffectFn3) import Web.Promise.Internal (Promise, reject) import Web.Promise.Internal as P import Web.Promise.Rejection (Rejection) @@ -27,6 +27,15 @@ new k = runEffectFn1 P.new $ mkEffectFn2 \onResolve onReject -> then_ :: forall a b c. Flatten b c => (a -> Effect (Promise b)) -> Promise a -> Effect (Promise c) then_ k p = runEffectFn2 P.then_ (mkEffectFn1 k) p +thenOrCatch + :: forall a b c + . Flatten b c + => (a -> Effect (Promise b)) + -> (Rejection -> Effect (Promise b)) + -> Promise a + -> Effect (Promise c) +thenOrCatch k c p = runEffectFn3 P.thenOrCatch (mkEffectFn1 k) (mkEffectFn1 c) p + catch :: forall a b. (Rejection -> Effect (Promise b)) -> Promise a -> Effect (Promise b) catch k p = runEffectFn2 P.catch (mkEffectFn1 k) p @@ -40,4 +49,4 @@ all :: forall a. Array (Promise a) -> Effect (Promise (Array a)) all = runEffectFn1 P.all race :: forall a. Array (Promise a) -> Effect (Promise a) -race = runEffectFn1 P.race \ No newline at end of file +race = runEffectFn1 P.race diff --git a/src/Web/Promise/Internal.js b/src/Web/Promise/Internal.js index f3b6e8a..1b58ca7 100644 --- a/src/Web/Promise/Internal.js +++ b/src/Web/Promise/Internal.js @@ -7,6 +7,10 @@ export function then_(k, p) { return p.then(k); } +export function thenOrCatch(k, c, p) { + return p.then(k, c); +} + const catchImpl = function (k, p) { return p.catch(k); }; diff --git a/src/Web/Promise/Internal.purs b/src/Web/Promise/Internal.purs index e421fa8..a36ec20 100644 --- a/src/Web/Promise/Internal.purs +++ b/src/Web/Promise/Internal.purs @@ -3,7 +3,7 @@ module Web.Promise.Internal where import Prelude import Effect (Effect) -import Effect.Uncurried (EffectFn1, EffectFn2) +import Effect.Uncurried (EffectFn1, EffectFn2, EffectFn3) import Web.Promise.Rejection (Rejection) foreign import data Promise :: Type -> Type @@ -14,6 +14,8 @@ foreign import new :: forall a b. EffectFn1 (EffectFn2 (EffectFn1 a Unit) (Effec foreign import then_ :: forall a b c. EffectFn2 (EffectFn1 a (Promise b)) (Promise a) (Promise c) +foreign import thenOrCatch :: forall a b c. EffectFn3 (EffectFn1 a (Promise b)) (EffectFn1 Rejection (Promise b)) (Promise a) (Promise c) + foreign import catch :: forall a b. EffectFn2 (EffectFn1 Rejection (Promise b)) (Promise a) (Promise b) foreign import finally :: forall a. EffectFn2 (Effect (Promise Unit)) (Promise a) (Promise a) @@ -24,4 +26,4 @@ foreign import reject :: forall a. Rejection -> Promise a foreign import all :: forall a. EffectFn1 (Array (Promise a)) (Promise (Array a)) -foreign import race :: forall a. EffectFn1 (Array (Promise a)) (Promise a) \ No newline at end of file +foreign import race :: forall a. EffectFn1 (Array (Promise a)) (Promise a)