UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

573 lines 14.8 kB
"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