export default update; declare function update(state: S): ModifierType; declare function update, V>(state: S, idx: number): ModifierType; declare function update(state: S, key: K): ModifierType; declare function update(state: S, getUpdates: (select: UpdateSelector) => Update[]): S; declare function update(state: S, generateUpdates: (select: UpdateSelector) => Generator>): S; declare type ModifierType = IfNeverThenNull : never | T extends Record ? ObjectModifier : never>; declare type ModifySelector = { (k1: K1): ModifierType; (k1: K1, k2: K2): ModifierType; (k1: K1, k2: K2, k3: K3): ModifierType; (k1: K1, k2: K2, k3: K3, k4: K4): ModifierType; (k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): ModifierType; }; declare type ObjectModifier> = { path: ModifySelector; set(key: K, value: T[K]): S; map(key: K, mapper: (value: T[K]) => T[K]): S; }; declare type ArrayModifier = { path: ModifySelector; push(item: V): S; pop(): S; map(mapper: (item: V, idx: number) => V): S; mapFirst(pred: (item: V, idx: number) => boolean, mapper: (item: V, idx: number) => V): S; filter(pred: (item: V, idx: number) => boolean): S; remove(pred: (item: V, idx: number) => boolean): S; removeFirst(pred: (item: V, idx: number) => boolean): S; removeLast(pred: (item: V, idx: number) => boolean): S; clear(): S; }; declare type UpdaterType = IfNeverThenNull : never | T extends Record ? ObjectUpdater : never>; declare type ObjectUpdater> = { select: UpdateSelector; set(key: K, value: T[K]): Update; map(key: K, mapper: (value: T[K]) => T[K]): Update; }; declare type ArrayUpdater = { select: UpdateSelector; push(value: V): Update; pop(value: V): Update; map(mapper: (item: V, idx: number) => V): Update; mapFirst(pred: (item: V, idx: number) => boolean, mapper: (item: V, idx: number) => V): Update; filter(pred: (item: V) => boolean): Update; remove(pred: (item: V, idx: number) => boolean): Update; removeFirst(pred: (item: V, idx: number) => boolean): Update; removeLast(pred: (item: V, idx: number) => boolean): Update; clear(): Update; }; declare type UpdateSelector = { (k1: K1): UpdaterType; (k1: K1, k2: K2): UpdaterType; (k1: K1, k2: K2, k3: K3): UpdaterType; (k1: K1, k2: K2, k3: K3, k4: K4): UpdaterType; (k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): UpdaterType; }; declare type Update = { path: string[]; mapper: (value: T) => T; }; declare type Obj = Record; declare type ObjState = Record; declare type ArrState = V[]; declare type State = ObjState | ArrState; declare type IfNeverThenNull = T extends never ? null : T;