@typed/fp
Version:
Data Structures and Resources for fp-ts
573 lines • 14.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSome = exports.FromResume = exports.fromResume = exports.fromTask = exports.FromTask = exports.FromIO = exports.fromIO = exports.altAll = exports.altW = exports.alt = exports.Alt = exports.race = exports.raceW = exports.FromReader = exports.MonadRec = exports.ChainRec = exports.Monad = exports.flatten = exports.flattenW = exports.chainFirstW = exports.chainFirst = exports.Chain = exports.getMonoid = exports.Applicative = exports.getSemigroup = exports.apSecondW = exports.apSecond = exports.apFirstW = exports.apFirst = exports.apTW = exports.apT = exports.apSW = exports.apS = exports.Apply = exports.flap = exports.Functor = exports.Pointed = exports.URI = exports.chainRec = exports.asksTaskK = exports.asksIOK = exports.of = exports.constant = exports.tap = exports.map = exports.fromReader = exports.chainW = exports.chain = exports.apW = exports.ap = void 0;
exports.toResumeK = exports.op = exports.execWith = exports.runWith = exports.combineStruct = exports.combineAll = exports.zipW = exports.zip = exports.fromIOK = exports.chainIOK = exports.chainFirstIOK = exports.fromTaskK = exports.chainTaskK = exports.chainFirstTaskK = exports.fromResumeK = exports.chainResumeK = exports.chainFirstResumeK = exports.fromReaderK = exports.chainReaderK = exports.asksE = exports.asks = exports.ask = exports.tupled = exports.bindW = exports.bind = exports.bindTo = exports.Do = exports.Provide = exports.toResume = exports.askAndProvide = exports.askAndUse = exports.useSomeWith = exports.provideSomeWith = exports.useAllWith = exports.provideAllWith = exports.ProvideAll = exports.ProvideSome = exports.UseAll = exports.UseSome = exports.provideAll = exports.useAll = exports.provideSome = void 0;
const tslib_1 = require("tslib");
/**
* `Env` is the core of the higher-level modules like [Ref](./Ref.ts.md) and is a `ReaderT` of [Resume](./Resume.ts.md); but
* to be honest, being used so much, I didn't like writing `ReaderResume<E, A>` and chose to shorten to
* `Env<E, A>` for the "environmental" quality Reader provides. Combining Reader and Resume allows for
* creating APIs capable of utilizing dependency injection for their configuration and testability
* while still combining your sync/async workflows.
*
* While designing application APIs it is often better to describe the logic of your system separate
* from the implementation details. `Env` or rather `Reader` helps you accomplish this through the
* [Dependency Inversion Principle](https://alexnault.dev/dependency-inversion-principle-in-functional-typescript).
* This principle is one of the easiest ways to begin improving any codebase.
*
* @since 0.9.2
*/
const disposable_1 = require("@most/disposable");
const Alt_ = (0, tslib_1.__importStar)(require("fp-ts/Alt"));
const FpApplicative = (0, tslib_1.__importStar)(require("fp-ts/Applicative"));
const Ap = (0, tslib_1.__importStar)(require("fp-ts/Apply"));
const FpChain = (0, tslib_1.__importStar)(require("fp-ts/Chain"));
const FIO = (0, tslib_1.__importStar)(require("fp-ts/FromIO"));
const FR = (0, tslib_1.__importStar)(require("fp-ts/FromReader"));
const FT = (0, tslib_1.__importStar)(require("fp-ts/FromTask"));
const FN = (0, tslib_1.__importStar)(require("fp-ts/function"));
const Functor_1 = require("fp-ts/Functor");
const RT = (0, tslib_1.__importStar)(require("fp-ts/ReaderT"));
const RA = (0, tslib_1.__importStar)(require("fp-ts/ReadonlyArray"));
const ReadonlyArray_1 = require("fp-ts/ReadonlyArray");
const FRe = (0, tslib_1.__importStar)(require("./FromResume"));
const P = (0, tslib_1.__importStar)(require("./Provide"));
const R = (0, tslib_1.__importStar)(require("./Resume"));
const St = (0, tslib_1.__importStar)(require("./struct"));
/**
* @since 0.9.2
* @category Combinator
*/
exports.ap = RT.ap(R.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apW = RT.ap(R.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chain = RT.chain(R.Chain);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainW = RT.chain(R.Chain);
/**
* @since 0.9.2
* @category Constructor
*/
exports.fromReader = RT.fromReader(R.Pointed);
/**
* @since 0.9.2
* @category Combinator
*/
exports.map = RT.map(R.Functor);
/**
* @since 0.9.2
* @category Combinator
*/
const tap = (f) => (fa) => FN.pipe(fa, (0, exports.map)((a) => {
f(a);
return a;
}));
exports.tap = tap;
/**
* @since 0.9.2
* @category Combinator
*/
exports.constant = FN.flow(FN.constant, exports.map);
/**
* @since 0.9.2
* @category Constructor
*/
exports.of = RT.of(R.Pointed);
/**
* @since 0.9.2
* @category Constructor
*/
exports.asksIOK = RT.fromNaturalTransformation(R.fromIO);
/**
* @since 0.9.2
* @category Constructor
*/
exports.asksTaskK = RT.fromNaturalTransformation(R.fromTask);
/**
* @since 0.9.2
* @category Combinator
*/
function chainRec(f) {
return (value) => (env) => R.chainRec((a) => f(a)(env))(value);
}
exports.chainRec = chainRec;
/**
* @since 0.9.2
* @category URI
*/
exports.URI = '@typed/fp/Env';
/**
* @since 0.9.2
* @category Instance
*/
exports.Pointed = {
of: exports.of,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.Functor = {
URI: exports.URI,
map: exports.map,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.flap = (0, Functor_1.flap)(exports.Functor);
/**
* @since 0.9.2
* @category Instance
*/
exports.Apply = {
...exports.Functor,
ap: exports.ap,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.apS = Ap.apS(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apSW = exports.apS;
/**
* @since 0.9.2
* @category Combinator
*/
exports.apT = Ap.apT(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apTW = exports.apT;
/**
* @since 0.9.2
* @category Combinator
*/
exports.apFirst = Ap.apFirst(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apFirstW = exports.apFirst;
/**
* @since 0.9.2
* @category Combinator
*/
exports.apSecond = Ap.apSecond(exports.Apply);
/**
* @since 0.9.2
* @category Combinator
*/
exports.apSecondW = exports.apSecond;
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
exports.getSemigroup = Ap.getApplySemigroup(exports.Apply);
/**
* @since 0.9.2
* @category Instance
*/
exports.Applicative = {
...exports.Apply,
...exports.Pointed,
};
/**
* @since 0.9.2
* @category Typeclass Constructor
*/
exports.getMonoid = FpApplicative.getApplicativeMonoid(exports.Applicative);
/**
* @since 0.9.2
* @category Instance
*/
exports.Chain = {
...exports.Functor,
chain: exports.chain,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainFirst = FpChain.chainFirst(exports.Chain);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainFirstW = exports.chainFirst;
/**
* @since 0.9.2
* @category Combinator
*/
exports.flattenW = (0, exports.chain)(FN.identity);
/**
* @since 0.9.2
* @category Combinator
*/
exports.flatten = (0, exports.chain)(FN.identity);
/**
* @since 0.9.2
* @category Instance
*/
exports.Monad = {
...exports.Chain,
...exports.Pointed,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.ChainRec = {
URI: exports.URI,
chainRec,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.MonadRec = {
...exports.Monad,
chainRec,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.FromReader = {
fromReader: (reader) => (e) => R.sync(() => reader(e)),
};
/**
* @since 0.9.2
* @category Combinator
*/
const raceW = (a) => (b) => (e) => R.race(a(e))(b(e));
exports.raceW = raceW;
/**
* @since 0.9.2
* @category Combinator
*/
const race = (a) => (b) => (e) => R.race(a(e))(b(e));
exports.race = race;
/**
* @since 0.9.2
* @category Instance
*/
exports.Alt = {
...exports.Functor,
alt: (snd) => (fst) => (0, exports.raceW)(fst)(snd()),
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.alt = exports.Alt.alt;
/**
* @since 0.9.2
* @category Combinator
*/
exports.altW = exports.alt;
/**
* @since 0.9.2
* @category Combinator
*/
exports.altAll = Alt_.altAll(exports.Alt);
/**
* @since 0.9.2
* @category Constructor
*/
exports.fromIO = exports.fromReader;
/**
* @since 0.9.2
* @category Instance
*/
exports.FromIO = {
URI: exports.URI,
fromIO: exports.fromIO,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.FromTask = {
...exports.FromIO,
fromTask: (task) => () => R.fromTask(task),
};
/**
* @since 0.9.2
* @category Constructor
*/
exports.fromTask = exports.FromTask.fromTask;
/**
* @since 0.9.2
* @category Constructor
*/
exports.fromResume = FN.constant;
/**
* @since 0.9.2
* @category Combinator
*/
exports.FromResume = {
fromResume: exports.fromResume,
};
/**
* @since 0.9.2
* @category Combinator
*/
const useSome = (provided) => (env) => (e) => env({ ...e, ...provided });
exports.useSome = useSome;
/**
* @since 0.9.2
* @category Combinator
*/
const provideSome = (provided) => (env) => (e) => env({ ...provided, ...e });
exports.provideSome = provideSome;
/**
* @since 0.9.2
* @category Combinator
*/
const useAll = (provided) => (env) => () => env(provided);
exports.useAll = useAll;
/**
* @since 0.9.2
* @category Combinator
*/
const provideAll = (provided) => (env) => (e) => { var _a; return env({ ...provided, ...((_a = e) !== null && _a !== void 0 ? _a : {}) }); };
exports.provideAll = provideAll;
/**
* @since 0.9.2
* @category Instance
*/
exports.UseSome = {
useSome: exports.useSome,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.UseAll = {
useAll: exports.useAll,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.ProvideSome = {
provideSome: exports.provideSome,
};
/**
* @since 0.9.2
* @category Instance
*/
exports.ProvideAll = {
provideAll: exports.provideAll,
};
/**
* @since 0.9.2
* @category Combinator
*/
exports.provideAllWith = P.provideAllWith({ ...exports.ProvideAll, ...exports.Chain });
/**
* @since 0.9.2
* @category Combinator
*/
exports.useAllWith = P.useAllWith({ ...exports.UseAll, ...exports.Chain });
/**
* @since 0.9.2
* @category Combinator
*/
exports.provideSomeWith = P.provideSomeWith({ ...exports.ProvideSome, ...exports.Chain });
/**
* @since 0.9.2
* @category Combinator
*/
exports.useSomeWith = P.useSomeWith({ ...exports.UseSome, ...exports.Chain });
/**
* @since 0.9.2
* @category Combinator
*/
exports.askAndUse = P.askAndUse({ ...exports.UseAll, ...exports.Chain, ...exports.FromReader });
/**
* @since 0.9.2
* @category Combinator
*/
exports.askAndProvide = P.askAndProvide({ ...exports.ProvideAll, ...exports.Chain, ...exports.FromReader });
/**
* @since 0.9.2
* @category Combinator
*/
exports.toResume = FN.flow(exports.askAndUse, (0, exports.map)((e) => e({})));
/**
* @since 0.9.2
* @category Instance
*/
exports.Provide = {
useSome: exports.useSome,
useAll: exports.useAll,
provideSome: exports.provideSome,
provideAll: exports.provideAll,
};
/**
* @since 0.9.2
* @category Constructor
*/
exports.Do = (0, exports.fromIO)(() => 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 = FpChain.bind(exports.Monad);
/**
* @since 0.9.2
* @category Combinator
*/
exports.bindW = FpChain.bind(exports.Monad);
/**
* @since 0.9.2
* @category Combinator
*/
exports.tupled = (0, Functor_1.tupled)(exports.Functor);
/**
* @since 0.9.2
* @category Constructor
*/
exports.ask = FR.ask(exports.FromReader);
/**
* @since 0.9.2
* @category Constructor
*/
exports.asks = FR.asks(exports.FromReader);
/**
* @since 0.9.2
* @category Constructor
*/
exports.asksE = FN.flow(exports.asks, exports.flattenW);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainReaderK = FR.chainReaderK(exports.FromReader, exports.Chain);
/**
* @since 0.9.2
* @category Constructor
*/
exports.fromReaderK = FR.fromReaderK(exports.FromReader);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainFirstResumeK = FRe.chainFirstResumeK(exports.FromResume, exports.Chain);
/**
* @since 0.9.2
* @category Combinator
*/
exports.chainResumeK = FRe.chainResumeK(exports.FromResume, exports.Chain);
/**
* @since 0.9.2
* @category Constructor
*/
exports.fromResumeK = FRe.fromResumeK(exports.FromResume);
/**
* @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 Combinator
*/
exports.zip = (0, ReadonlyArray_1.traverse)(exports.Applicative)((x) => x);
/**
* @since 0.9.2
* @category Combinator
*/
exports.zipW = exports.zip;
/**
* @since 0.9.2
* @category Combinator
*/
const combineAll = (...envs) => (0, exports.zipW)(envs);
exports.combineAll = combineAll;
/**
* @since 0.11.0
* @category Combinator
*/
const combineStruct = (props) => FN.pipe((0, exports.combineAll)(...FN.pipe(Object.entries(props), RA.map(([k, env]) => FN.pipe(env, (0, exports.map)((v) => St.make(k, v)))))), (0, exports.map)((o) => Object.assign({}, ...o)));
exports.combineStruct = combineStruct;
/**
* @since 0.9.2
* @category Execution
*/
const runWith = (f) => (requirements) => (env) => FN.pipe(requirements, env, R.run(f));
exports.runWith = runWith;
/**
* @since 0.9.2
* @category Execution
*/
exports.execWith = (0, exports.runWith)(disposable_1.disposeNone);
/**
* Construct an Env to a lazily-defined Env-based effect that must be provided later.
* Does not support functions which require type-parameters as they will resolve to unknown, due
* to limitations in TS, if you need this maybe use [asksE](#askse)
* @since 0.9.2
* @category Constructor
*/
const op = () => (key) => {
function operation(...args) {
return FN.pipe((0, exports.ask)(), (0, exports.chain)((e) => e[key](...args)));
}
operation.key = key;
return operation;
};
exports.op = op;
/**
* @since 0.9.2
* @category Combinator
*/
const toResumeK = (envK) => FN.pipe((0, exports.ask)(), (0, exports.map)((e) => (...args) => FN.pipe(e, envK(...args))));
exports.toResumeK = toResumeK;
//# sourceMappingURL=Env.js.map