Skip to content

Instantly share code, notes, and snippets.

@abradley2
Created January 9, 2022 13:49
Show Gist options
  • Save abradley2/0337757607cba2a014ac809ec3f3165d to your computer and use it in GitHub Desktop.
Save abradley2/0337757607cba2a014ac809ec3f3165d to your computer and use it in GitHub Desktop.
ReScript Fluture bindings
type t<'res, 'err> = Future('res, 'err)
type cancel = unit => unit
// Creation
@module("fluture")
external future: (('res => unit, 'err => unit) => cancel) => t<'res, 'err> = "Future"
let resolve = a =>
future((res, _rej) => {
res(a)
() => ()
})
let reject = a =>
future((_res, rej) => {
rej(a)
() => ()
})
let fromPromise = p =>
future((res, rej) => {
let _ = p()->Js.Promise.then_(val => {
res(val)
Js.Promise.resolve()
}, _)->Js.Promise.catch(err => {
rej(err)
Js.Promise.resolve()
}, _)
() => ()
})
// Consume
@module("fluture")
external _fork: ('res => unit, 'err => unit, t<'res, 'err>) => cancel = "fork"
let fork = (t, res, err) => _fork(res, err, t)
// Transform
@module("fluture")
external _map: ('a => 'b, t<'a, 'err>) => t<'b, 'err> = "map"
let map = (f, mapFn) => _map(mapFn, f)
@module("fluture")
external _chain: ('a => t<'b, 'err>, t<'a, 'err>) => t<'b, 'err> = "chain"
let chain = (f, mapFn) => _chain(mapFn, f)
@module("fluture")
external _mapRej: ('a => 'b, t<'res, 'a>) => t<'res, 'b> = "mapRej"
let mapRej = (f, mapFn) => _mapRej(mapFn, f)
@module("fluture")
external _chainRej: ('a => t<'res, 'b>, t<'res, 'a>) => t<'res, 'b> = "chainRej"
let chainRej = (f, mapFn) => _chainRej(mapFn, f)
let bimap = (f, mapResFn, mapRejFn) => f->map(mapResFn)->mapRej(mapRejFn)
let bichain = (f, mapResFn, mapRejFn) => f->chain(mapResFn)->chainRej(mapRejFn)
let swap = f => f->bichain(reject, resolve)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment