UNPKG

@jsoldi/hkt

Version:

Higher kinded types for typescript and a few utility monads.

39 lines 1.47 kB
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