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 {};
