import type { StateCreator, StoreMutatorIdentifier, StoreApi, Mutate } from "zustand/vanilla";
import { PropType } from "@dhmk/utils";
export declare const meta: unique symbol;
export type SetParameter<T> = Partial<T> | ((state: T) => Partial<T> | void) | ((state: T) => T);
export type Setter<T> = (partial: SetParameter<T>, replace?: boolean | undefined, ...args: any[]) => void;
export type Getter<T> = () => T;
type CreateLensPartialSetter<T> = (partial: T | Partial<T> | ((s: T) => T | Partial<T>), replace?: false, ...args: any[]) => any;
type CreateLensStateSetter<T> = (state: T | ((state: T) => T), replace: true, ...args: any[]) => any;
type CreateLensSetter<T> = CreateLensPartialSetter<T> | CreateLensStateSetter<T>;
export declare function createLens<T, P extends string[]>(set: CreateLensSetter<T>, get: Getter<T>, path: readonly [...P]): [Setter<PropType<T, P>>, Getter<PropType<T, P>>];
export declare function createLens<T, P extends string>(set: CreateLensSetter<T>, get: Getter<T>, path: P): [Setter<PropType<T, [P]>>, Getter<PropType<T, [P]>>];
type IsAny<T> = 0 extends 1 & T ? true : false;
export type ResolveStoreApi<X> = IsAny<X> extends true ? StoreApi<any> : X extends StoreApi<any> ? X : X extends unknown ? StoreApi<X> : unknown;
declare class LensTypeInfo<T, S> {
    protected __lensType?: T;
    protected __lensStoreApi?: (lensStoreApi: S) => void;
}
export type LensOpaqueType<T, S> = T & LensTypeInfo<T, ResolveStoreApi<S>>;
export type LensMetaProps<T, S> = {
    postprocess?: (state: T, prevState: T, ...args: unknown[]) => Partial<T> | void;
    setter?: (set: () => void, ctx: LensContext<T, S>) => void;
};
export type LensMeta<T, S> = {
    [p: string | number | symbol]: unknown;
    [meta]?: LensMetaProps<T, S>;
};
export type LensContext<T, S> = {
    set: Setter<unknown>;
    get: Getter<T>;
    api: ResolveStoreApi<S>;
    rootPath: ReadonlyArray<string>;
    relativePath: ReadonlyArray<string>;
    atomic: (fn: () => void) => void;
};
export type Lens<T, S = unknown, SetterFn = Setter<T>, Ctx = LensContext<T, S>> = (set: SetterFn, get: Getter<T>, api: ResolveStoreApi<S>, ctx: Ctx) => T & LensMeta<T, S>;
export declare function lens<T, S = unknown>(fn: Lens<T, S, Setter<T>>): LensOpaqueType<T, S>;
type CheckLenses<T, SA extends StoreApi<unknown>> = {
    [P in keyof T]: T[P] extends LensTypeInfo<infer L, infer LSA> ? SA extends LSA ? LensOpaqueType<L, LSA> : LensOpaqueType<L, SA> : T[P] extends Function ? T[P] : T[P] extends object ? CheckLenses<T[P], SA> : T[P];
};
type WithLenses = <T, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []>(f: CheckLenses<T & LensMeta<T, unknown>, Mutate<StoreApi<T>, Mps>> | StateCreator<T, Mps, Mcs, CheckLenses<T & LensMeta<T, unknown>, Mutate<StoreApi<T>, Mps>>>) => StateCreator<T, Mps, Mcs>;
export declare const withLenses: WithLenses;
type Atomic = <T, Mps extends [StoreMutatorIdentifier, unknown][] = [], Mcs extends [StoreMutatorIdentifier, unknown][] = []>(f: StateCreator<T, Mps, Mcs>) => StateCreator<T, Mps, Mcs>;
export declare const atomic: Atomic;
export {};
