mutoid
Version:
Reactive library for data fetching, caching, state management
61 lines (60 loc) • 3.54 kB
TypeScript
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 {};