| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | // @flowexport interface Patch {	op: "replace" | "remove" | "add";	path: (string | number)[];	value?: any;}export type PatchListener = (patches: Patch[], inversePatches: Patch[]) => voidtype Base = {...} | Array<any>interface IProduce {	/**	 * Immer takes a state, and runs a function against it.	 * That function can freely mutate the state, as it will create copies-on-write.	 * This means that the original state will stay unchanged, and once the function finishes, the modified state is returned.	 *	 * If the first argument is a function, this is interpreted as the recipe, and will create a curried function that will execute the recipe	 * any time it is called with the current state.	 *	 * @param currentState - the state to start with	 * @param recipe - function that receives a proxy of the current state as first argument and which can be freely modified	 * @param initialState - if a curried function is created and this argument was given, it will be used as fallback if the curried function is called with a state of undefined	 * @returns The next state: a new state, or the current state if nothing was modified	 */	<S: Base>(		currentState: S,		recipe: (draftState: S) => S | void,		patchListener?: PatchListener	): S;	// curried invocations with initial state	<S: Base, A = void, B = void, C = void>(		recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void,		initialState: S	): (currentState: S | void, a: A, b: B, c: C, ...extraArgs: any[]) => S;	// curried invocations without initial state	<S: Base, A = void, B = void, C = void>(		recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void	): (currentState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S;}interface IProduceWithPatches {        /**         * Like `produce`, but instead of just returning the new state,         * a tuple is returned with [nextState, patches, inversePatches]         *         * Like produce, this function supports currying         */	<S: Base>(		currentState: S,		recipe: (draftState: S) => S | void	): [S, Patch[], Patch[]];	// curried invocations with initial state	<S: Base, A = void, B = void, C = void>(		recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void,		initialState: S	): (currentState: S | void, a: A, b: B, c: C, ...extraArgs: any[]) => [S, Patch[], Patch[]];	// curried invocations without initial state	<S: Base, A = void, B = void, C = void>(		recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void	): (currentState: S, a: A, b: B, c: C, ...extraArgs: any[]) => [S, Patch[], Patch[]];}declare export var produce: IProducedeclare export default IProducedeclare export var produceWithPatches: IProduceWithPatchesdeclare export var nothing: typeof undefineddeclare export var immerable: Symbol/** * Automatically freezes any state trees generated by immer. * This protects against accidental modifications of the state tree outside of an immer function. * This comes with a performance impact, so it is recommended to disable this option in production. * By default it is turned on during local development, and turned off in production. */declare export function setAutoFreeze(autoFreeze: boolean): void/** * Manually override whether proxies should be used. * By default done by using feature detection */declare export function setUseProxies(useProxies: boolean): voiddeclare export function applyPatches<S>(state: S, patches: Patch[]): Sdeclare export function original<S>(value: S): Sdeclare export function current<S>(value: S): Sdeclare export function isDraft(value: any): boolean/** * Creates a mutable draft from an (immutable) object / array. * The draft can be modified until `finishDraft` is called */declare export function createDraft<T>(base: T): T/** * Given a draft that was created using `createDraft`, * finalizes the draft into a new immutable object. * Optionally a patch-listener can be provided to gather the patches that are needed to construct the object. */declare export function finishDraft<T>(base: T, listener?: PatchListener): Tdeclare export function enableES5(): voiddeclare export function enableMapSet(): voiddeclare export function enablePatches(): voiddeclare export function enableAllPlugins(): voiddeclare export function freeze<T>(obj: T, freeze?: boolean): T
 |