UNPKG

use-merge-state

Version:

A useState variant hook that merges updates.

1 lines 5.56 kB
{"version":3,"file":"index.mjs","sources":["../src/guards.ts","../src/utils/merge.ts","../src/hooks/use-merge-state.ts","../src/utils/get-return-value.ts"],"sourcesContent":["import { PlainFunction, PlainObject, Unpack } from \"./types\"\n\nexport const isArray = Array.isArray\n\nexport function isFunction<T extends PlainFunction>(\n value: T | unknown\n): value is PlainFunction<Unpack<Parameters<T>>, ReturnType<T>> {\n return value instanceof Function\n}\n\nexport function isMap<T, U>(value: Map<T, U> | unknown): value is Map<T, U> {\n return value instanceof Map\n}\n\nexport function isNumber(value: number | unknown): value is number {\n return typeof value === \"number\"\n}\n\nexport function isPlainObject<T, U extends PlainObject>(\n value: PlainObject<T> | U | unknown\n): value is PlainObject<T> | U {\n return (\n typeof value === \"object\" &&\n value !== null &&\n value.constructor === Object &&\n Object.getPrototypeOf(value) === Object.prototype\n )\n}\n\nexport function isSet<T>(value: Set<T> | unknown): value is Set<T> {\n return value instanceof Set\n}\n","import { isArray, isMap, isPlainObject, isSet } from \"../guards\"\nimport { PlainObject, Spread } from \"../types\"\n\ninterface MergeArrays {\n <A, B>(a: A[], b: B[]): (A | B)[]\n}\n\ninterface MergePlainObjects {\n <A extends PlainObject, B extends PlainObject>(a: A, b: B): Spread<A, B>\n}\n\ninterface MergeMaps {\n <A, B, C, D>(a: Map<A, C>, b: Map<B, D>): Map<A | B, C | D>\n}\n\ninterface MergeSets {\n <A, B>(a: Set<A>, b: Set<B>): Set<A | B>\n}\n\ninterface Merge extends MergeArrays, MergePlainObjects, MergeMaps, MergeSets {\n <A, B>(a: A, b: B): B\n}\n\nconst mergeArrays: MergeArrays = <A, B>(a: A[], b: B[]) => {\n return [...a, ...b]\n}\n\nconst mergePlainObjects: MergePlainObjects = <\n A extends PlainObject,\n B extends PlainObject\n>(\n a: A,\n b: B\n) => {\n return { ...a, ...b }\n}\n\nconst mergeMaps: MergeMaps = <A, B, C, D>(a: Map<A, C>, b: Map<B, D>) => {\n return new Map([...a, ...b] as [A | B, C | D][])\n}\n\nconst mergeSets: MergeSets = <A, B>(a: Set<A>, b: Set<B>) => {\n return new Set([...a, ...b])\n}\n\nexport const merge: Merge = (a: any, b: any) => {\n if (isArray(a) && isArray(b)) {\n return mergeArrays(a, b)\n } else if (isPlainObject(a) && isPlainObject(b)) {\n return mergePlainObjects(a, b)\n } else if (isMap(a) && isMap(b)) {\n return mergeMaps(a, b)\n } else if (isSet(a) && isSet(b)) {\n return mergeSets(a, b)\n } else {\n return b\n }\n}\n","import { SetStateAction, useCallback, useMemo, useState } from \"react\"\nimport { DispatchWithOptions } from \"../types\"\nimport { getReturnValue } from \"../utils/get-return-value\"\nimport { merge } from \"../utils/merge\"\n\ninterface MergeOptions {\n merge?: boolean\n}\n\nconst defaultOptions: MergeOptions = {\n merge: true\n}\n\nexport function useMergeState<S>(\n initialState: S | (() => S),\n options?: MergeOptions\n): [S, DispatchWithOptions<SetStateAction<S>, MergeOptions>]\nexport function useMergeState<S = undefined>(): [\n S | undefined,\n DispatchWithOptions<SetStateAction<S | undefined>, MergeOptions>\n]\nexport function useMergeState<S>(\n initialState?: any,\n options: MergeOptions = defaultOptions\n): [S, DispatchWithOptions<SetStateAction<S>>] {\n const [state, setState] = useState<S>(initialState)\n const instanceOptions = useMemo(\n () => ({ ...defaultOptions, ...options }),\n [options]\n )\n\n const setMergeState: DispatchWithOptions<\n SetStateAction<S>,\n MergeOptions\n > = useCallback(\n (value: SetStateAction<S>, options?: MergeOptions) => {\n const updateOptions = { ...instanceOptions, ...options }\n\n if (updateOptions.merge) {\n setState((previousState: S) => {\n return merge(previousState, getReturnValue(value, previousState))\n })\n } else {\n setState(value)\n }\n },\n [instanceOptions]\n )\n\n return [state, setMergeState]\n}\n","import { isFunction } from \"../guards\"\n\nexport function getReturnValue<V, A>(\n value: V | ((...args: A[]) => V),\n ...args: A[]\n): V {\n return isFunction(value) ? value(...args) : (value as V)\n}\n"],"names":["isArray","Array","isMap","value","Map","isPlainObject","constructor","Object","getPrototypeOf","prototype","isSet","Set","merge","a","b","mergeArrays","mergePlainObjects","mergeMaps","mergeSets","defaultOptions","useMergeState","initialState","options","state","setState","useState","instanceOptions","useMemo","setMergeState","useCallback","updateOptions","previousState","args","Function","isFunction","getReturnValue"],"mappings":"qRAEaA,EAAUC,MAAMD,iBAQbE,EAAYC,GAC1B,OAAOA,aAAiBC,aAOVC,EACdF,GAEA,MACmB,iBAAVA,GACG,OAAVA,GACAA,EAAMG,cAAgBC,QACtBA,OAAOC,eAAeL,KAAWI,OAAOE,mBAI5BC,EAASP,GACvB,OAAOA,aAAiBQ,ICP1B,MAsBaC,EAAe,CAACC,EAAQC,IAC/Bd,EAAQa,IAAMb,EAAQc,GAvBK,EAAOD,EAAQC,IACvC,IAAID,KAAMC,GAuBRC,CAAYF,EAAGC,GACbT,EAAcQ,IAAMR,EAAcS,GArBF,EAI3CD,EACAC,SAEYD,EAAMC,GAeTE,CAAkBH,EAAGC,GACnBZ,EAAMW,IAAMX,EAAMY,GAbF,EAAaD,EAAcC,QAC3CV,IAAI,IAAIS,KAAMC,IAahBG,CAAUJ,EAAGC,GACXJ,EAAMG,IAAMH,EAAMI,GAXF,EAAOD,EAAWC,QAClCH,IAAI,IAAIE,KAAMC,IAWhBI,CAAUL,EAAGC,GAEbA,EC9CLK,EAA+B,CACnCP,OAAO,YAWOQ,EACdC,EACAC,EAAwBH,GAExB,MAAOI,EAAOC,GAAYC,EAAYJ,GAChCK,EAAkBC,EACtB,SAAYR,EAAmBG,GAC/B,CAACA,IAGGM,EAGFC,EACF,CAAC1B,EAA0BmB,KACzB,MAAMQ,OAAqBJ,EAAoBJ,GAG7CE,EADEM,EAAclB,MACNmB,GACDnB,EAAMmB,WCrCrB5B,KACG6B,GAEH,gBHDA7B,GAEA,OAAOA,aAAiB8B,SGDjBC,CAAW/B,GAASA,KAAS6B,GAAS7B,EDkCTgC,CAAehC,EAAO4B,IAG3C5B,IAGb,CAACuB,IAGH,MAAO,CAACH,EAAOK"}