UNPKG

@typed/fp

Version:

Data Structures and Resources for fp-ts

625 lines (421 loc) 10.1 kB
--- title: KV.ts nav_order: 34 parent: Modules --- ## KV overview `KV` is an abstraction for managing state-based applications using [Env](./Env.ts.md). It exposes an extensible get/set/delete API for managing keys to values. Every `KV` is connected to an `Env` that will provide the default value lazily when first asked for or after being deleted previously. The provided implementation will also send events containing all of the creations/updates/deletes occurring in real-time. Added in v0.11.0 --- <h2 class="text-delta">Table of contents</h2> - [Combinator](#combinator) - [findKVProvider](#findkvprovider) - [get](#get) - [getAdapter](#getadapter) - [getEnv](#getenv) - [getKVEvents](#getkvevents) - [getParentEnv](#getparentenv) - [getSendEvent](#getsendevent) - [has](#has) - [listenTo](#listento) - [listenToValues](#listentovalues) - [remove](#remove) - [sample](#sample) - [sendEvent](#sendevent) - [set](#set) - [update](#update) - [withProvider](#withprovider) - [withProviderStream](#withproviderstream) - [Constructor](#constructor) - [make](#make) - [Deconstructor](#deconstructor) - [match](#match) - [matchW](#matchw) - [Environment](#environment) - [Env (interface)](#env-interface) - [Events (interface)](#events-interface) - [Get (interface)](#get-interface) - [Has (interface)](#has-interface) - [ParentEnv (interface)](#parentenv-interface) - [Remove (interface)](#remove-interface) - [Set (interface)](#set-interface) - [Environment Constructor](#environment-constructor) - [env](#env) - [KV](#kv) - [Disposable](#disposable) - [Model](#model) - [Adapter (type alias)](#adapter-type-alias) - [Created (interface)](#created-interface) - [Event (type alias)](#event-type-alias) - [KV (interface)](#kv-interface) - [Of (interface)](#of-interface) - [Removed (interface)](#removed-interface) - [Updated (interface)](#updated-interface) - [Options](#options) - [EnvOptions (type alias)](#envoptions-type-alias) - [Options (type alias)](#options-type-alias) - [Refinement](#refinement) - [isCreated](#iscreated) - [isRemoved](#isremoved) - [isUpdated](#isupdated) - [Type-level](#type-level) - [EnvOf (type alias)](#envof-type-alias) - [KeyOf (type alias)](#keyof-type-alias) - [ValueOf (type alias)](#valueof-type-alias) - [Use](#use) - [useKeyedEnvs](#usekeyedenvs) --- # Combinator ## findKVProvider Traverse up the tree of KVEnv and parent KVEnv to find the closest KVEnv that has reference for a given KV. This is useful for providing a React-like Context API atop of KV. **Signature** ```ts export declare const findKVProvider: <K, E, A>(ref: KV<K, E, A>) => E.Env<Env, Env> ``` Added in v0.11.0 ## get **Signature** ```ts export declare const get: <K, E, A>(kv: KV<K, E, A>) => E.Env<E & Get, A> ``` Added in v0.11.0 ## getAdapter **Signature** ```ts export declare const getAdapter: E.Env< Events, readonly [(event: Event<any, any>) => void, Stream<Event<any, any>>] > ``` Added in v0.12.0 ## getEnv **Signature** ```ts export declare const getEnv: E.Env<Env, Env> ``` Added in v0.12.0 ## getKVEvents **Signature** ```ts export declare const getKVEvents: RS.ReaderStream<Events, Event<any, any>> ``` Added in v0.12.0 ## getParentEnv **Signature** ```ts export declare const getParentEnv: E.Env<ParentEnv, O.Option<Env>> ``` Added in v0.11.0 ## getSendEvent **Signature** ```ts export declare const getSendEvent: E.Env<Events, (event: Event<any, any>) => void> ``` Added in v0.11.0 ## has **Signature** ```ts export declare const has: <K, E, A>(kv: KV<K, E, A>) => E.Env<Has, boolean> ``` Added in v0.11.0 ## listenTo **Signature** ```ts export declare const listenTo: <K, E, A>(kv: KV<K, E, A>) => RS.ReaderStream<Events, Event<K, A>> ``` Added in v0.11.0 ## listenToValues **Signature** ```ts export declare const listenToValues: <K, E, A>( kv: KV<K, E, A>, ) => RS.ReaderStream<E & Events, O.Option<A>> ``` Added in v0.11.0 ## remove **Signature** ```ts export declare const remove: <K, E, A>(kv: KV<K, E, A>) => E.Env<E & Remove, O.Option<A>> ``` Added in v0.11.0 ## sample Sample an Env with the latest references when updates have occured. **Signature** ```ts export declare const sample: <E, A>(env: E.Env<E, A>) => RS.ReaderStream<E & Env, A> ``` Added in v0.11.0 ## sendEvent **Signature** ```ts export declare const sendEvent: <K, A>(event: Event<K, A>) => E.Env<Events, void> ``` Added in v0.11.0 ## set **Signature** ```ts export declare const set: <K, E, A>(kv: KV<K, E, A>) => (value: A) => E.Env<E & Set, A> ``` Added in v0.11.0 ## update **Signature** ```ts export declare const update: <K, E1, A>( kv: KV<K, E1, A>, ) => <E2>(f: (value: A) => E.Env<E2, A>) => E.Env<E1 & Set & E2 & Get, A> ``` Added in v0.11.0 ## withProvider **Signature** ```ts export declare const withProvider: <K, E, A>( kv: KV<K, E, A>, ) => <E2, B>(env: E.Env<E2, B>) => E.Env<E2 & Env, B> ``` Added in v0.11.0 ## withProviderStream **Signature** ```ts export declare const withProviderStream: <K, E, A>( kv: KV<K, E, A>, ) => <E2, B>(rs: RS.ReaderStream<E2, B>) => RS.ReaderStream<E2 & Env, B> ``` Added in v0.11.0 # Constructor ## make Note that by default an incrementing index is utilized to generate a key if one is not provided. In other words, by default, this is not referentially transparent for your own convenience **Signature** ```ts export declare function make<E, A, K = symbol>( initial: E.Env<E, A>, options: Options<K, A> = {}, ): KV<K, E, A> ``` Added in v0.11.0 # Deconstructor ## match **Signature** ```ts export declare const match: <A, K, B>( onCreated: (value: A, key: K) => B, onUpdated: (previousValue: A, value: A, key: K) => B, onDeleted: (key: K) => B, ) => (event: Event<K, A>) => B ``` Added in v0.12.0 ## matchW **Signature** ```ts export declare const matchW: <A, K, B, C, D>( onCreated: (value: A, key: K) => B, onUpdated: (previousValue: A, value: A, key: K) => C, onDeleted: (key: K) => D, ) => (event: Event<K, A>) => B | C | D ``` Added in v0.12.0 # Environment ## Env (interface) **Signature** ```ts export interface Env extends Get, Has, Set, Remove, Events, ParentEnv {} ``` Added in v0.12.0 ## Events (interface) **Signature** ```ts export interface Events { readonly kvEvents: Adapter } ``` Added in v0.12.0 ## Get (interface) **Signature** ```ts export interface Get { readonly getKV: <K, E, A>(kv: KV<K, E, A>) => E.Env<E, A> } ``` Added in v0.12.0 ## Has (interface) **Signature** ```ts export interface Has { readonly hasKV: <K, E, A>(kv: KV<K, E, A>) => E.Of<boolean> } ``` Added in v0.12.0 ## ParentEnv (interface) **Signature** ```ts export interface ParentEnv { readonly parentKVEnv: O.Option<Env> } ``` Added in v0.12.0 ## Remove (interface) **Signature** ```ts export interface Remove { readonly removeKV: <K, E, A>(kv: KV<K, E, A>) => E.Env<E, O.Option<A>> } ``` Added in v0.12.0 ## Set (interface) **Signature** ```ts export interface Set { readonly setKV: <K, E, A>(kv: KV<K, E, A>, value: A) => E.Env<E, A> } ``` Added in v0.12.0 # Environment Constructor ## env **Signature** ```ts export declare function env(options: EnvOptions = {}): Env ``` Added in v0.12.0 # KV ## Disposable A shared KV for keeping track of a context's disposable resources. **Signature** ```ts export declare const Disposable: KV<symbol, unknown, D.SettableDisposable> ``` Added in v0.11.0 # Model ## Adapter (type alias) **Signature** ```ts export type Adapter = A.Adapter<Event<any, any>> ``` Added in v0.11.0 ## Created (interface) **Signature** ```ts export interface Created<K, A> { readonly _tag: 'Created' readonly key: K readonly value: A readonly fromAncestor: boolean } ``` Added in v0.12.0 ## Event (type alias) **Signature** ```ts export type Event<K, A> = Created<K, A> | Updated<K, A> | Removed<K> ``` Added in v0.12.0 ## KV (interface) **Signature** ```ts export interface KV<K, E, A> extends Eq<A> { readonly key: K readonly initial: E.Env<E, A> } ``` Added in v0.11.0 ## Of (interface) **Signature** ```ts export interface Of<K, A> extends KV<K, unknown, A> {} ``` Added in v0.11.0 ## Removed (interface) **Signature** ```ts export interface Removed<K> { readonly _tag: 'Removed' readonly key: K readonly fromAncestor: boolean } ``` Added in v0.12.0 ## Updated (interface) **Signature** ```ts export interface Updated<K, A> { readonly _tag: 'Updated' readonly key: K readonly previousValue: A readonly value: A readonly fromAncestor: boolean } ``` Added in v0.12.0 # Options ## EnvOptions (type alias) **Signature** ```ts export type EnvOptions = { readonly initial?: Iterable<readonly [any, any]> readonly kvEvents?: Adapter readonly parentEnv?: Env } ``` Added in v0.11.0 ## Options (type alias) **Signature** ```ts export type Options<K, A> = { readonly key?: K } & Partial<Eq<A>> ``` Added in v0.11.0 # Refinement ## isCreated **Signature** ```ts export declare const isCreated: <K, A>(event: Event<K, A>) => event is Created<K, A> ``` Added in v0.11.0 ## isRemoved **Signature** ```ts export declare const isRemoved: <K, A>(event: Event<K, A>) => event is Removed<K> ``` Added in v0.11.0 ## isUpdated **Signature** ```ts export declare const isUpdated: <K, A>(event: Event<K, A>) => event is Updated<K, A> ``` Added in v0.11.0 # Type-level ## EnvOf (type alias) **Signature** ```ts export type EnvOf<A> = [A] extends [KV<any, infer R, any>] ? R : never ``` Added in v0.11.0 ## KeyOf (type alias) **Signature** ```ts export type KeyOf<A> = [A] extends [KV<infer R, any, any>] ? R : never ``` Added in v0.11.0 ## ValueOf (type alias) **Signature** ```ts export type ValueOf<A> = [A] extends [KV<any, any, infer R>] ? R : never ``` Added in v0.11.0 # Use ## useKeyedEnvs **Signature** ```ts export declare const useKeyedEnvs: <A>( Eq: Eq<A>, ) => E.Env< Env, { readonly findRefs: (key: A) => E.Env<Get, Env>; readonly deleteRefs: (key: A) => D.Disposable } > ``` Added in v0.11.0