UNPKG

mutoid

Version:

Reactive library for data fetching, caching, state management

61 lines (60 loc) 3.54 kB
import type * as T from 'fp-ts/Task'; import type { Subscription } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs'; import type { MutationName, StoreName, AllMutationName } from './stores'; type MutationNotify<N extends StoreName, S> = Readonly<{ state: S; name: N; mutationName: MutationName<N>; payload: Array<unknown>; date: ReturnType<Date['toISOString']>; }>; type NotifySubject<N extends StoreName, S> = Readonly<{ type: 'initStore'; name: N; } | ({ type: 'mutationLoad'; } & MutationNotify<N, S>) | ({ type: 'mutationStart'; } & MutationNotify<N, S>) | ({ type: 'mutationEnd'; } & MutationNotify<N, S>)>; type StoreOpaque<N extends StoreName, S> = Readonly<{ name: N; subscribe: (listener: () => void) => () => void; getState: () => S; setState: (s: S) => void; state$: Observable<S>; notifier$: BehaviorSubject<NotifySubject<N, S>>; initState: S; }>; export interface Store<N extends StoreName, S> extends StoreOpaque<N, S> { } export type MutationEffect<P extends Array<unknown>, S, SS extends S> = (...p: P) => (state: SS) => Observable<S>; type MutationOpaque<NM, P extends Array<unknown>, S, SS extends S> = Readonly<{ name: NM; effect: MutationEffect<P, S, SS>; filterPredicate?: (state: S) => state is SS; }>; export interface Mutation<NM, P extends Array<unknown>, S, SS extends S> extends MutationOpaque<NM, P, S, SS> { } export declare const ctor: <N extends StoreName, S>(c: { name: N; initState: S; }) => Store<N, S>; export declare const ctorMutation: <NM extends AllMutationName, P extends unknown[], S>(name: NM, effect: MutationEffect<P, S, S>) => Mutation<NM, P, S, S>; export declare const ctorMutationC: <NM extends AllMutationName, P extends unknown[], S>(name: NM) => (effect: MutationEffect<P, S, S>) => Mutation<NM, P, S, S>; export declare const ctorMutationCR: <NM extends AllMutationName, P extends unknown[], S, R>(name: NM) => (effectR: (r: R) => MutationEffect<P, S, S>) => (r: R) => Mutation<NM, P, S, S>; export declare const ctorPartialMutation: <NM extends AllMutationName, P extends unknown[], S, SS extends S>(name: NM, filterPredicate: (s: S) => s is SS, effect: MutationEffect<P, S, SS>) => Mutation<NM, P, S, SS>; export declare const ctorPartialMutationC: <NM extends AllMutationName, P extends unknown[], S, SS extends S>(name: NM, filterPredicate: (s: S) => s is SS) => (effect: MutationEffect<P, S, SS>) => Mutation<NM, P, S, SS>; export declare const ctorPartialMutationCR: <NM extends AllMutationName, P extends unknown[], S, SS extends S, R>(name: NM, filterPredicate: (s: S) => s is SS) => (effectR: (r: R) => MutationEffect<P, S, SS>) => (r: R) => Mutation<NM, P, S, SS>; export declare const toTask: <N extends StoreName, S>(store: Store<N, S>) => T.Task<S>; export interface BaseOptions { notifierTakeUntil?: Observable<unknown>; } export interface DepsOptions<R extends Record<string, unknown>> { deps: R; } export declare function mutationRunner<N extends StoreName, NM extends MutationName<N>, P extends Array<unknown>, S, SS extends S, R extends Record<K, unknown>, K extends string>(store: Store<N, S>, mutationR: (deps: R) => Mutation<NM, P, S, SS>, options: BaseOptions & DepsOptions<R>): (...p: P) => Subscription; export declare function mutationRunner<N extends StoreName, NM extends MutationName<N>, P extends Array<unknown>, S, SS extends S>(store: Store<N, S>, mutationL: () => Mutation<NM, P, S, SS>, options?: BaseOptions): (...p: P) => Subscription; export {};