@typed/fp
Version:
Data Structures and Resources for fp-ts
353 lines • 9.46 kB
JavaScript
;
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