UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

48 lines 2.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.kv = exports.useKV = exports.fromKV = void 0; const tslib_1 = require("tslib"); /** * Context is an alternative implementation of Ref which is capable of traversing up * in a graph of to find if any ancestors contain the given value. This is allows sharing values * across otherwise isolated environments. * @since 0.11.0 */ const E = (0, tslib_1.__importStar)(require("./Env")); const EO = (0, tslib_1.__importStar)(require("./EnvOption")); const function_1 = require("./function"); const KV = (0, tslib_1.__importStar)(require("./KV")); const RS = (0, tslib_1.__importStar)(require("./ReaderStream")); const Use_1 = require("./Use"); /** * @since 0.11.0 * @category Constructor */ const fromKV = (kv) => ({ ...kv, get: useKV(kv), has: (0, function_1.pipe)(kv, KV.has, KV.withProvider(kv)), set: (0, function_1.flow)(KV.set(kv), KV.withProvider(kv)), update: (0, function_1.flow)(KV.update(kv), KV.withProvider(kv)), remove: (0, function_1.pipe)(kv, KV.remove, KV.withProvider(kv)), values: (0, function_1.pipe)(KV.listenToValues(kv), KV.withProviderStream(kv)), }); exports.fromKV = fromKV; /** * Allows subscribing to the updates ensuring the current KV receives all * updates from an Ancestor. * @since 0.9.2 * @category Combinator */ function useKV(kv) { const useValues = (0, Use_1.useReaderStream)(); const useReplicateEvents = (0, Use_1.useReaderStream)(); return (0, function_1.pipe)(E.Do, E.bindW('currentRefs', () => KV.getEnv), E.bindW('providerRefs', () => KV.findKVProvider(kv)), E.bindW('value', ({ providerRefs }) => (0, function_1.pipe)(kv, KV.listenToValues, RS.useSome(providerRefs), useValues, EO.chainOptionK(function_1.identity), EO.getOrElseEW(() => (0, function_1.pipe)(kv, KV.get, E.useSome(providerRefs))))), E.chainFirstW(({ currentRefs, providerRefs }) => (0, function_1.pipe)(kv, KV.listenTo, RS.useSome(providerRefs), RS.chainEnvK((event) => (0, function_1.pipe)({ ...event, fromAncestor: true }, KV.sendEvent, E.useSome(currentRefs))), useReplicateEvents)), E.map(({ value }) => value)); } exports.useKV = useKV; /** * @since 0.13.7 * @category Constructor */ exports.kv = (0, function_1.flow)(KV.make, exports.fromKV); //# sourceMappingURL=Context.js.map