@fpjs/overture
Version:
A Javascript prelude
37 lines (36 loc) • 1.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.runCallback = exports.recover = exports.error = exports.Callback = void 0;
var _base = require("@fpjs/overture/base");
var _functor = require("@fpjs/overture/algebras/functor");
const mkcont = cb => f => done => cb((err, x) => err != null ? done(err) : f(x)(done));
const Callback = cb => ({
'@@type': 'Callback',
'constructor': Callback,
'_callback': cb,
'fantasy-land/map': f => Callback(mkcont(cb)(x => done => done(null, f(x)))),
'fantasy-land/ap': ab => Callback(mkcont(cb)(x => (0, _functor.map)((0, _base.rapply)(x))(ab)['_callback'])),
'fantasy-land/chain': f => Callback(mkcont(cb)(x => f(x)['_callback']))
});
exports.Callback = Callback;
Callback['fantasy-land/of'] = x => Callback(done => done(null, x));
const runCallback = f => o => {
const op = o['_callback'];
if (op === undefined) {
throw TypeError(`${(0, _base.type)(o)} is not Callback`);
}
return op(f);
};
exports.runCallback = runCallback;
const error = e => Callback(done => done(e));
exports.error = error;
const recover = f => o => {
const cb = o['_callback'];
if (cb === undefined) {
throw TypeError(`${(0, _base.type)(o)} is not Callback`);
}
return Callback(done => cb((e, r) => e === null ? done(null, r) : runCallback(done)(f(e))));
};
exports.recover = recover;