UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

406 lines 12.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.struct = exports.chainFirstTaskK = exports.chainTaskK = exports.chainFirstResumeK = exports.chainResumeK = exports.chainFirstReaderK = exports.chainReaderK = exports.chainFirstIOK = exports.chainIOK = exports.chainFirstEnvK = exports.chainEnvK = exports.Provide = exports.ProvideAll = exports.ProvideSome = exports.UseAll = exports.UseSome = exports.useAll = exports.useSome = exports.provideAll = exports.provideSome = exports.Semigroupoid = exports.compose = exports.getApplySemigroup = exports.apTW = exports.apT = exports.apSecondW = exports.apSecond = exports.apSW = exports.apS = exports.apFirstW = exports.apFirst = exports.Apply = exports.ap = exports.Profunctor = exports.promapE = exports.promap = exports.localE = exports.local = exports.Functor = exports.map = exports.FromKV = exports.kv = exports.fromKV = exports.URI = void 0; const tslib_1 = require("tslib"); /** * `Ref` is an abstraction for managing data-driven applications using [Env](./Env.ts.md). * @since 0.11.0 */ const Ap = (0, tslib_1.__importStar)(require("fp-ts/Apply")); const B = (0, tslib_1.__importStar)(require("fp-ts/boolean")); const Eq_1 = require("fp-ts/Eq"); const function_1 = require("fp-ts/function"); const Monoid_1 = require("fp-ts/Monoid"); const RA = (0, tslib_1.__importStar)(require("fp-ts/ReadonlyArray")); const E = (0, tslib_1.__importStar)(require("./Env")); const EO = (0, tslib_1.__importStar)(require("./EnvOption")); const KV = (0, tslib_1.__importStar)(require("./KV")); const O = (0, tslib_1.__importStar)(require("./Option")); const RS = (0, tslib_1.__importStar)(require("./ReaderStream")); const RSO = (0, tslib_1.__importStar)(require("./ReaderStreamOption")); const S = (0, tslib_1.__importStar)(require("./struct")); const allBooleans = E.map((0, Monoid_1.concatAll)(B.MonoidAll)); /** * @since 0.11.0 * @category URI */ exports.URI = '@typed/fp/Ref'; /** * @since 0.11.0 * @category Constructor */ const fromKV = (kv) => ({ ...kv, get: KV.get(kv), has: KV.has(kv), set: KV.set(kv), update: KV.update(kv), remove: KV.remove(kv), values: KV.listenToValues(kv), }); exports.fromKV = fromKV; /** * @since 0.11.0 * @category Constructor */ exports.kv = (0, function_1.flow)(KV.make, exports.fromKV); /** * @since 0.12.0 * @category Instance Constructor */ exports.FromKV = { fromKV: exports.fromKV, }; /** * @since 0.11.0 * @category Combinator */ const map = (f) => (ref) => ({ get: (0, function_1.pipe)(ref.get, E.map(f)), has: ref.has, set: (0, function_1.flow)(ref.set, E.map(f)), update: (g) => (0, function_1.pipe)(ref.get, E.map(f), E.chainW(g), E.chainW(ref.set), E.map(f)), remove: (0, function_1.pipe)(ref.remove, EO.map(f)), values: (0, function_1.pipe)(ref.values, RSO.map(f)), }); exports.map = map; /** * @since 0.11.0 * @category Instance */ exports.Functor = { map: exports.map, }; /** * @since 0.11.0 * @category Combinator */ const local = (f) => (ref) => ({ get: ref.get, has: ref.has, set: (0, function_1.flow)(f, ref.set), update: (g) => ref.update((0, function_1.flow)(g, E.map(f))), remove: ref.remove, values: ref.values, }); exports.local = local; /** * @since 0.12.2 * @category Combinator */ const localE = (f) => (ref) => ({ get: ref.get, has: ref.has, set: (0, function_1.flow)(f, E.chainW(ref.set)), update: (g) => ref.update((0, function_1.flow)(g, E.chainW(f))), remove: ref.remove, values: ref.values, }); exports.localE = localE; /** * @since 0.11.0 * @category Combinator */ const promap = (f, g) => (ref) => (0, function_1.pipe)(ref, (0, exports.local)(f), (0, exports.map)(g)); exports.promap = promap; /** * @since 0.12.2 * @category Combinator */ const promapE = (f, g) => (ref) => (0, function_1.pipe)(ref, (0, exports.localE)(f), chainEnvK(g)); exports.promapE = promapE; /** * @since 0.11.0 * @category Instance */ exports.Profunctor = { map: exports.map, promap: exports.promap, }; /** * @since 0.11.0 * @category Combinator */ const ap = (fa) => (fab) => { const get = (0, function_1.pipe)(fab.get, E.apW(fa.get)); const set = (i) => (0, function_1.pipe)(i, fab.set, E.apW(fa.set(i))); return { get, has: (0, function_1.pipe)([], E.of, E.apTW(fa.has), E.apTW(fab.has), allBooleans), set: (i) => (0, function_1.pipe)(i, fab.set, E.apW(fa.set(i))), update: (f) => (0, function_1.pipe)(get, E.chainW(f), E.chainW(set)), remove: (0, function_1.pipe)(fab.remove, EO.apW(fa.remove)), values: (0, function_1.pipe)(fab.values, RSO.apW(fa.values)), }; }; exports.ap = ap; /** * @since 0.11.0 * @category Instance */ exports.Apply = { map: exports.map, ap: exports.ap, }; /** * @since 0.11.0 * @category Combinator */ exports.apFirst = Ap.apFirst(exports.Apply); /** * @since 0.11.0 * @category Combinator */ exports.apFirstW = exports.apFirst; /** * @since 0.11.0 * @category Combinator */ exports.apS = Ap.apS(exports.Apply); /** * @since 0.11.0 * @category Combinator */ exports.apSW = exports.apS; /** * @since 0.11.0 * @category Combinator */ exports.apSecond = Ap.apSecond(exports.Apply); /** * @since 0.11.0 * @category Combinator */ exports.apSecondW = exports.apSecond; /** * @since 0.11.0 * @category Combinator */ exports.apT = Ap.apT(exports.Apply); /** * @since 0.11.0 * @category Combinator */ exports.apTW = exports.apT; /** * @since 0.11.0 * @category Typeclass Constructor */ exports.getApplySemigroup = Ap.getApplySemigroup(exports.Apply); /** * @since 0.11.0 * @category Combinator */ const compose = (second) => (first) => ({ get: (0, function_1.pipe)(second.get, E.apFirstW(first.get)), has: (0, function_1.pipe)(first.has, E.tupled, E.apTW(second.has), allBooleans), set: (0, function_1.flow)(first.set, E.chainW(second.set)), update: (f) => (0, function_1.pipe)(second.get, E.chainW(f), E.chainW(first.set), E.chainW(second.set)), remove: (0, function_1.pipe)(second.remove, E.apFirstW(first.remove)), values: (0, function_1.pipe)(second.values, RS.mergeFirst( // Replicate all values into the second (0, function_1.pipe)(first.values, RS.chainFirstEnvK(O.matchW(() => second.remove, (0, function_1.flow)(second.set, EO.fromEnv))))), RS.skipRepeatsWith(O.getEq(Eq_1.EqStrict))), }); exports.compose = compose; /** * @since 0.11.0 * @category Instance */ exports.Semigroupoid = { compose: exports.compose, }; /** * @since 0.11.0 * @category Combinator */ const provideSome = (provided) => (ref) => { return { get: (0, function_1.pipe)(ref.get, E.provideSome(provided)), has: (0, function_1.pipe)(ref.has, E.provideSome(provided)), set: (0, function_1.flow)(ref.set, E.provideSome(provided)), update: (0, function_1.flow)(ref.update, E.provideSome(provided)), remove: (0, function_1.pipe)(ref.remove, E.provideSome(provided)), values: (0, function_1.pipe)(ref.values, RS.provideSome(provided)), }; }; exports.provideSome = provideSome; /** * @since 0.11.0 * @category Combinator */ exports.provideAll = exports.provideSome; /** * @since 0.11.0 * @category Combinator */ const useSome = (provided) => (ref) => { return { get: (0, function_1.pipe)(ref.get, E.useSome(provided)), has: (0, function_1.pipe)(ref.has, E.useSome(provided)), set: (0, function_1.flow)(ref.set, E.useSome(provided)), update: (0, function_1.flow)(ref.update, E.useSome(provided)), remove: (0, function_1.pipe)(ref.remove, E.useSome(provided)), values: (0, function_1.pipe)(ref.values, RS.useSome(provided)), }; }; exports.useSome = useSome; /** * @since 0.11.0 * @category Combinator */ exports.useAll = exports.useSome; /** * @since 0.11.0 * @category Instance */ exports.UseSome = { useSome: exports.useSome, }; /** * @since 0.11.0 * @category Instance */ exports.UseAll = { useAll: exports.useAll, }; /** * @since 0.11.0 * @category Instance */ exports.ProvideSome = { provideSome: exports.provideSome, }; /** * @since 0.11.0 * @category Instance */ exports.ProvideAll = { provideAll: exports.provideAll, }; /** * @since 0.11.0 * @category Instance */ exports.Provide = { useSome: exports.useSome, useAll: exports.useAll, provideSome: exports.provideSome, provideAll: exports.provideAll, }; /** * @since 0.11.0 * @category Combinator */ function chainEnvK(f) { return (ref) => ({ get: (0, function_1.pipe)(ref.get, E.chainW(f)), has: ref.has, set: (0, function_1.flow)(ref.set, E.chainW(f)), update: (g) => (0, function_1.pipe)((0, function_1.flow)(f, E.chainW(g)), ref.update, E.chainW(f)), remove: (0, function_1.pipe)(ref.remove, EO.chainEnvK(f)), values: (0, function_1.pipe)(ref.values, RSO.chainEnvK(f)), }); } exports.chainEnvK = chainEnvK; /** * @since 0.11.0 * @category Combinator */ function chainFirstEnvK(f) { return (ref) => ({ get: (0, function_1.pipe)(ref.get, E.chainFirstW(f)), has: ref.has, set: (0, function_1.flow)(ref.set, E.chainFirstW(f)), update: (0, function_1.flow)(ref.update, E.chainFirstW(f)), remove: (0, function_1.pipe)(ref.remove, EO.chainFirstEnvK(f)), values: (0, function_1.pipe)(ref.values, RSO.chainFirstEnvK(f)), }); } exports.chainFirstEnvK = chainFirstEnvK; /** * @since 0.11.0 * @category Combinator */ function chainIOK(f) { return (0, function_1.pipe)(f, E.fromIOK, chainEnvK); } exports.chainIOK = chainIOK; /** * @since 0.11.0 * @category Combinator */ function chainFirstIOK(f) { return (0, function_1.pipe)(f, E.fromIOK, chainFirstEnvK); } exports.chainFirstIOK = chainFirstIOK; /** * @since 0.11.0 * @category Combinator */ function chainReaderK(f) { return (0, function_1.pipe)(f, E.fromReaderK, chainEnvK); } exports.chainReaderK = chainReaderK; /** * @since 0.11.0 * @category Combinator */ function chainFirstReaderK(f) { return (0, function_1.pipe)(f, E.fromReaderK, chainFirstEnvK); } exports.chainFirstReaderK = chainFirstReaderK; /** * @since 0.11.0 * @category Combinator */ function chainResumeK(f) { return (0, function_1.pipe)(f, E.fromResumeK, chainEnvK); } exports.chainResumeK = chainResumeK; /** * @since 0.11.0 * @category Combinator */ function chainFirstResumeK(f) { return (0, function_1.pipe)(f, E.fromResumeK, chainFirstEnvK); } exports.chainFirstResumeK = chainFirstResumeK; /** * @since 0.11.0 * @category Combinator */ function chainTaskK(f) { return (0, function_1.pipe)(f, E.fromTaskK, chainEnvK); } exports.chainTaskK = chainTaskK; /** * @since 0.11.0 * @category Combinator */ function chainFirstTaskK(f) { return (0, function_1.pipe)(f, E.fromTaskK, chainFirstEnvK); } exports.chainFirstTaskK = chainFirstTaskK; /** * @since 0.11.0 * @category Combinator */ function struct(properties) { const entries = Object.entries(properties); const zipAssign = (0, function_1.flow)(E.zipW, E.map((props) => Object.assign({}, ...props))); const get = (0, function_1.pipe)(entries, RA.map(([k, ref]) => (0, function_1.pipe)(ref.get, E.map((v) => S.make(k, v)))), zipAssign); const has = (0, function_1.pipe)(Object.values(properties), RA.map((ref) => ref.has), E.zipW, allBooleans); const set = (i) => (0, function_1.pipe)(i, Object.entries, RA.map(([k, v]) => (0, function_1.pipe)(v, properties[k].set, E.map((v) => S.make(k, v)))), zipAssign); const remove = (0, function_1.pipe)(entries, RA.map(([k, ref]) => (0, function_1.pipe)(ref.remove, EO.map((v) => S.make(k, v)))), E.zipW, E.map((0, function_1.flow)(O.traverseReadonlyArrayWithIndex((_, a) => a), O.map((xs) => Object.assign({}, ...xs))))); const values = (0, function_1.pipe)(RS.combineAll(...(0, function_1.pipe)(entries, RA.map(([k, ref]) => (0, function_1.pipe)(ref.values, RSO.map((v) => S.make(k, v)))))), RS.map((0, function_1.flow)(O.traverseReadonlyArrayWithIndex((_, a) => a), O.map((xs) => Object.assign({}, ...xs))))); return { get, has, set, update: (f) => (0, function_1.pipe)(get, E.chainW(f), E.chainW(set)), remove, values, }; } exports.struct = struct; //# sourceMappingURL=Ref.js.map