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