@jsoldi/hkt
Version:
Higher kinded types for typescript and a few utility monads.
39 lines • 1.47 kB
JavaScript
import { AbortError } from "./task.js";
import { functor } from "../classes/functor.js";
/** The promise module, providing a set of functions for working with promises. For monadic promises use `task` instead. */
export const promise = (() => {
const unit = a => Promise.resolve(a);
const apply = fab => fa => fab.then(fa.then);
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const all = fa => Promise.all(fa);
const race = fa => Promise.race(fa);
const any = fa => Promise.any(fa);
const abortable = signal => fa => new Promise((resolve, reject) => {
const doAbort = () => reject(new AbortError());
if (signal.aborted)
return doAbort();
signal.addEventListener('abort', doAbort);
fa.then(resolve, reject).finally(() => signal.removeEventListener('abort', doAbort));
});
const expirable = ms => {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), ms);
return fa => abortable(controller.signal)(fa).finally(() => clearTimeout(id));
};
const _catch = f => fa => fa.catch(f);
const _finally = f => fa => fa.finally(f);
return {
...functor({
map: (fa, f) => fa.then(f)
}),
delay,
all,
race,
any,
abortable,
expirable,
catch: _catch,
finally: _finally,
};
})();
//# sourceMappingURL=promise.js.map