Skip to content

Instantly share code, notes, and snippets.

@fhammerschmidt
Created January 14, 2020 13:06
Show Gist options
  • Save fhammerschmidt/a62d268d4d3800027d376333c9ef3eee to your computer and use it in GitHub Desktop.
Save fhammerschmidt/a62d268d4d3800027d376333c9ef3eee to your computer and use it in GitHub Desktop.
Some bindings/helpers for dealing with Promises in ReasonML/BuckleScript
type t(+'a, +'err);
type noError;
external fromJsPromise: Js.Promise.t('a) => t('a, Js.Promise.error) = "%identity";
external toJsPromise: t('a, 'err) => Js.Promise.t('a) = "%identity";
external relax: t('a, noError) => t('a, 'err) = "%identity";
[@bs.new] external make: ((~resolve: (. 'a) => unit, ~reject: (. 'err) => unit) => unit) => t('a, 'err) = "Promise";
[@bs.val] [@bs.scope "Promise"] external return: 'a => t('a, 'err) = "resolve";
[@bs.val] [@bs.scope "Promise"] external fail: 'err => t('a, 'err) = "reject";
[@bs.send] external bind: (t('a, 'err), [@bs.uncurry] ('a => t('b, 'err))) => t('b, 'err) = "then";
let map = (p, f) => p->bind(res => return(f(res)));
[@bs.send]
external bind2:
(t('a, 'err), [@bs.uncurry] ('a => t('b, 'err2)), [@bs.uncurry] ('err => t('b, 'err2))) => t('b, 'err2) =
"then";
let map2 = (p, f, g) => p->bind2(res => return(f(res)), err => return(g(err)));
[@bs.send] external catch: (t('a, 'err), [@bs.uncurry] ('err => t('a, noError))) => t('a, noError) = "catch";
[@bs.val] [@bs.scope "Promise"] external all: array(t('a, 'err)) => t(array('a), 'err) = "all";
[@bs.val] [@bs.scope "Promise"] external all2: ((t('a0, 'err), t('a1, 'err))) => t(('a0, 'a1), 'err) = "all";
[@bs.val] [@bs.scope "Promise"]
external all3: ((t('a0, 'err), t('a1, 'err), t('a2, 'err))) => t(('a0, 'a1, 'a2), 'err) = "all";
[@bs.val] [@bs.scope "Promise"]
external all4: ((t('a0, 'err), t('a1, 'err), t('a2, 'err), t('a3, 'err))) => t(('a0, 'a1, 'a2, 'a3), 'err) =
"all";
[@bs.val] [@bs.scope "Promise"]
external all5:
((t('a0, 'err), t('a1, 'err), t('a2, 'err), t('a3, 'err), t('a4, 'err))) =>
t(('a0, 'a1, 'a2, 'a3, 'a4), 'err) =
"all";
[@bs.val] [@bs.scope "Promise"]
external all6:
((t('a0, 'err), t('a1, 'err), t('a2, 'err), t('a3, 'err), t('a4, 'err), t('a5, 'err))) =>
t(('a0, 'a1, 'a2, 'a3, 'a4, 'a5), 'err) =
"all";
[@bs.val] [@bs.scope "Promise"] external race: array(t('a, 'err)) => t('a, 'err) = "race";
[@bs.send] external wait: (t('a, noError), [@bs.uncurry] ('a => unit)) => unit = "then";
[@bs.send] external wait2: (t('a, 'err), [@bs.uncurry] ('a => unit), [@bs.uncurry] ('err => unit)) => unit = "then";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment