UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

353 lines 9.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getMonoid = exports.fromIOK = exports.chainIOK = exports.chainFirstIOK = exports.fromTaskK = exports.chainTaskK = exports.chainFirstTaskK = exports.zip = exports.traverseReadonlyArrayWithIndex = exports.traverseReadonlyArray = exports.tupled = exports.bind = exports.bindTo = exports.Do = exports.FromTask = exports.fromIO = exports.FromIO = exports.Alt = exports.MonadRec = exports.ChainRec = exports.Monad = exports.chainFirst = exports.Chain = exports.Applicative = exports.Apply = exports.map = exports.Functor = exports.Pointed = exports.URI = exports.race = exports.chainRec = exports.of = exports.chain = exports.toTask = exports.exec = exports.start = exports.run = exports.ap = exports.isAsync = exports.isSync = exports.sync = exports.fromTask = exports.async = void 0; const tslib_1 = require("tslib"); const Applicative_1 = require("fp-ts/Applicative"); const Ch = (0, tslib_1.__importStar)(require("fp-ts/Chain")); const E = (0, tslib_1.__importStar)(require("fp-ts/Either")); const FIO = (0, tslib_1.__importStar)(require("fp-ts/FromIO")); const FT = (0, tslib_1.__importStar)(require("fp-ts/FromTask")); const function_1 = require("fp-ts/function"); const Functor_1 = require("fp-ts/Functor"); const Option_1 = require("fp-ts/Option"); const RA = (0, tslib_1.__importStar)(require("fp-ts/ReadonlyArray")); const Disposable_1 = require("./Disposable"); /** * @since 0.9.2 * @category Constructor */ const async = (resume) => ({ _tag: 'async', resume }); exports.async = async; /** * @since 0.9.2 * @category Constructor */ const fromTask = (task) => (0, exports.async)((resume) => { const disposable = (0, Disposable_1.settable)(); task().then((r) => { if (!disposable.isDisposed()) { disposable.addDisposable(resume(r)); } }); return disposable; }); exports.fromTask = fromTask; /** * @since 0.9.2 * @category Constructor */ const sync = (resume) => ({ _tag: 'sync', resume }); exports.sync = sync; /** * @since 0.9.2 * @category Refinement */ const isSync = (resume) => resume._tag === 'sync'; exports.isSync = isSync; /** * @since 0.9.2 * @category Refinement */ const isAsync = (resume) => resume._tag === 'async'; exports.isAsync = isAsync; /** * @since 0.9.2 * @category Combinator */ const ap = (fa) => (fab) => { if ((0, exports.isSync)(fa) && (0, exports.isSync)(fab)) { return (0, exports.sync)(() => fab.resume()(fa.resume())); } // Concurrently return (0, exports.async)((resume) => { const disposable = (0, Disposable_1.settable)(); let ab = (0, exports.isSync)(fab) ? (0, Option_1.some)(fab.resume()) : Option_1.none; let a = (0, exports.isSync)(fa) ? (0, Option_1.some)(fa.resume()) : Option_1.none; function onReady() { if ((0, Option_1.isNone)(ab) || (0, Option_1.isNone)(a)) { return (0, Disposable_1.disposeNone)(); } if (!disposable.isDisposed()) { disposable.addDisposable(resume(ab.value(a.value))); } return disposable; } if ((0, exports.isAsync)(fab)) { disposable.addDisposable(fab.resume((f) => { ab = (0, Option_1.some)(f); return onReady(); })); } if ((0, exports.isAsync)(fa)) { disposable.addDisposable(fa.resume((x) => { a = (0, Option_1.some)(x); return onReady(); })); } return disposable; }); }; exports.ap = ap; /** * @since 0.9.2 * @category Deconstructor */ const run = (f) => (resume) => (0, exports.isAsync)(resume) ? resume.resume(f) : f(resume.resume()); exports.run = run; /** * @since 0.9.2 * @category Deconstructor */ const start = (f) => (0, exports.run)((0, Disposable_1.undisposable)(f)); exports.start = start; /** * @since 0.9.2 * @category Deconstructor */ exports.exec = (0, exports.start)(function_1.constVoid); /** * @since 0.9.2 * @category Deconstructor */ const toTask = (resume) => { const task = () => { const d = (0, Disposable_1.settable)(); const p = new Promise((resolve) => d.addDisposable((0, function_1.pipe)(resume, (0, exports.start)(resolve)))); p.dispose = () => d.dispose(); return p; }; return task; }; exports.toTask = toTask; /** * @since 0.9.2 * @category Combinator */ const chain = (f) => (resume) => (0, exports.isSync)(resume) ? f(resume.resume()) : (0, exports.async)((r) => resume.resume((0, function_1.flow)(f, (0, exports.run)(r)))); exports.chain = chain; /** * @since 0.9.2 * @category Constructor */ exports.of = (0, function_1.flow)(function_1.constant, exports.sync); /** * @since 0.9.2 * @category Combinator */ const chainRec = (f) => (value) => { let resume = f(value); while ((0, exports.isSync)(resume)) { const either = resume.resume(); if (E.isRight(either)) { return (0, exports.of)(either.right); } resume = f(either.left); } // Recursion is okay because Resume SHOULD be asynchronous return (0, function_1.pipe)(resume, (0, exports.chain)(E.match((0, exports.chainRec)(f), exports.of))); }; exports.chainRec = chainRec; /** * @since 0.9.2 * @category Combinator */ const race = (ra) => (rb) => { if ((0, exports.isSync)(rb)) { return rb; } if ((0, exports.isSync)(ra)) { return ra; } return (0, exports.async)((resume) => { const aDisposableLazy = (0, Disposable_1.settable)(); const bDisposable = (0, function_1.pipe)(rb, (0, exports.run)((b) => { aDisposableLazy.dispose(); return resume(b); })); const aDisposable = (0, function_1.pipe)(ra, (0, exports.run)((a) => { bDisposable.dispose(); return resume(a); })); aDisposableLazy.addDisposable(aDisposable); return (0, Disposable_1.disposeBoth)(bDisposable, aDisposable); }); }; exports.race = race; /** * @since 0.9.2 * @category URI */ exports.URI = '@typed/fp/Resume'; /** * @since 0.9.2 * @category Instance */ exports.Pointed = { of: exports.of, }; /** * @since 0.9.2 * @category Instance */ exports.Functor = { URI: exports.URI, map: (f) => (fa) => (0, function_1.pipe)(fa, (0, exports.chain)((0, function_1.flow)(f, exports.of))), }; /** * @since 0.9.2 * @category Combinator */ exports.map = exports.Functor.map; /** * @since 0.9.2 * @category Instance */ exports.Apply = { ...exports.Functor, ap: exports.ap, }; /** * @since 0.9.2 * @category Instance */ exports.Applicative = { ...exports.Apply, ...exports.Pointed, }; /** * @since 0.9.2 * @category Instance */ exports.Chain = { ...exports.Functor, chain: exports.chain, }; /** * @since 0.9.2 * @category Combinator */ exports.chainFirst = Ch.chainFirst(exports.Chain); /** * @since 0.9.2 * @category Instance */ exports.Monad = { ...exports.Chain, ...exports.Pointed, }; /** * @since 0.9.2 * @category Instance */ exports.ChainRec = { URI: exports.URI, chainRec: exports.chainRec, }; /** * @since 0.9.2 * @category Instance */ exports.MonadRec = { ...exports.Monad, chainRec: exports.chainRec, }; /** * @since 0.9.2 * @category Instance */ exports.Alt = { ...exports.Functor, alt: (snd) => (fst) => (0, function_1.pipe)(fst, (0, exports.race)(snd())), }; /** * @since 0.9.2 * @category Instance */ exports.FromIO = { URI: exports.URI, fromIO: exports.sync, }; /** * @since 0.9.2 * @category Constructor */ exports.fromIO = exports.FromIO.fromIO; /** * @since 0.9.2 * @category Instance */ exports.FromTask = { ...exports.FromIO, fromTask: exports.fromTask, }; /** * @since 0.9.2 * @category Constructor */ exports.Do = (0, exports.sync)(() => Object.create(null)); /** * @since 0.9.2 * @category Combinator */ exports.bindTo = (0, Functor_1.bindTo)(exports.Functor); /** * @since 0.9.2 * @category Combinator */ exports.bind = Ch.bind(exports.Monad); /** * @since 0.9.2 * @category Combinator */ exports.tupled = (0, Functor_1.tupled)(exports.Functor); /** * @since 0.9.2 * @category Combinator */ exports.traverseReadonlyArray = RA.traverse(exports.Applicative); /** * @since 0.9.2 * @category Combinator */ exports.traverseReadonlyArrayWithIndex = RA.traverseWithIndex(exports.Applicative); /** * @since 0.9.2 * @category Combinator */ exports.zip = (0, exports.traverseReadonlyArray)((x) => x); /** * @since 0.9.2 * @category Combinator */ exports.chainFirstTaskK = FT.chainFirstTaskK(exports.FromTask, exports.Chain); /** * @since 0.9.2 * @category Combinator */ exports.chainTaskK = FT.chainTaskK(exports.FromTask, exports.Chain); /** * @since 0.9.2 * @category Constructor */ exports.fromTaskK = FT.fromTaskK(exports.FromTask); /** * @since 0.9.2 * @category Combinator */ exports.chainFirstIOK = FIO.chainFirstIOK(exports.FromIO, exports.Chain); /** * @since 0.9.2 * @category Combinator */ exports.chainIOK = FIO.chainIOK(exports.FromIO, exports.Chain); /** * @since 0.9.2 * @category Constructor */ exports.fromIOK = FIO.fromIOK(exports.FromIO); /** * @since 0.9.2 * @category Typeclass Constructor */ exports.getMonoid = (0, Applicative_1.getApplicativeMonoid)(exports.Applicative); //# sourceMappingURL=Resume.js.map