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