{"version":3,"file":"use-list-state.cjs","names":[],"sources":["../../src/hooks/use-list-state.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport interface ReorderPayload {\n    from: number;\n    to: number;\n}\n\nexport interface ListStateHandlers<T> {\n    append: (...items: T[]) => void;\n    prepend: (...items: T[]) => void;\n    insert: (index: number, ...items: T[]) => void;\n    remove: (...indices: number[]) => void;\n    reorder: (payload: ReorderPayload) => void;\n    setItem: (index: number, item: T) => void;\n    setState: (items: T[]) => void;\n    apply: (fn: (item: T, index: number) => T) => void;\n    clear: () => void;\n}\n\n/**\n * Manage an array as state with a rich set of immutable handlers.\n *\n * @typeParam T - element type.\n * @param initial - initial list (default `[]`).\n * @returns Tuple `[list, handlers]`.\n */\nexport function useListState<T>(initial: T[] = []): [T[], ListStateHandlers<T>] {\n    const [list, setList] = useState<T[]>(initial);\n\n    const append = useCallback((...items: T[]): void => {\n        setList((current) => [...current, ...items]);\n    }, []);\n\n    const prepend = useCallback((...items: T[]): void => {\n        setList((current) => [...items, ...current]);\n    }, []);\n\n    const insert = useCallback((index: number, ...items: T[]): void => {\n        setList((current) => [...current.slice(0, index), ...items, ...current.slice(index)]);\n    }, []);\n\n    const remove = useCallback((...indices: number[]): void => {\n        const drop = new Set(indices);\n        setList((current) => current.filter((_, index) => !drop.has(index)));\n    }, []);\n\n    const reorder = useCallback(({ from, to }: ReorderPayload): void => {\n        setList((current) => {\n            const next = [...current];\n            const [moved] = next.splice(from, 1);\n            next.splice(to, 0, moved);\n            return next;\n        });\n    }, []);\n\n    const setItem = useCallback((index: number, item: T): void => {\n        setList((current) => current.map((value, i) => (i === index ? item : value)));\n    }, []);\n\n    const setState = useCallback((items: T[]): void => setList(items), []);\n\n    const apply = useCallback((fn: (item: T, index: number) => T): void => {\n        setList((current) => current.map(fn));\n    }, []);\n\n    const clear = useCallback((): void => setList([]), []);\n\n    const handlers = useMemo<ListStateHandlers<T>>(\n        () => ({\n            append,\n            prepend,\n            insert,\n            remove,\n            reorder,\n            setItem,\n            setState,\n            apply,\n            clear,\n        }),\n        [append, prepend, insert, remove, reorder, setItem, setState, apply, clear],\n    );\n\n    return [list, handlers];\n}\n"],"mappings":"uBA0BA,SAAgB,EAAgB,EAAe,CAAC,EAAgC,CAC5E,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAc,CAAO,EAEvC,GAAA,EAAS,EAAA,YAAA,EAAa,GAAG,IAAqB,CAChD,EAAS,GAAY,CAAC,GAAG,EAAS,GAAG,CAAK,CAAC,CAC/C,EAAG,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,EAAa,GAAG,IAAqB,CACjD,EAAS,GAAY,CAAC,GAAG,EAAO,GAAG,CAAO,CAAC,CAC/C,EAAG,CAAC,CAAC,EAEC,GAAA,EAAS,EAAA,YAAA,EAAa,EAAe,GAAG,IAAqB,CAC/D,EAAS,GAAY,CAAC,GAAG,EAAQ,MAAM,EAAG,CAAK,EAAG,GAAG,EAAO,GAAG,EAAQ,MAAM,CAAK,CAAC,CAAC,CACxF,EAAG,CAAC,CAAC,EAEC,GAAA,EAAS,EAAA,YAAA,EAAa,GAAG,IAA4B,CACvD,IAAM,EAAO,IAAI,IAAI,CAAO,EAC5B,EAAS,GAAY,EAAQ,QAAQ,EAAG,IAAU,CAAC,EAAK,IAAI,CAAK,CAAC,CAAC,CACvE,EAAG,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,EAAa,CAAE,OAAM,QAA+B,CAChE,EAAS,GAAY,CACjB,IAAM,EAAO,CAAC,GAAG,CAAO,EAClB,CAAC,GAAS,EAAK,OAAO,EAAM,CAAC,EAEnC,OADA,EAAK,OAAO,EAAI,EAAG,CAAK,EACjB,CACX,CAAC,CACL,EAAG,CAAC,CAAC,EAEC,GAAA,EAAU,EAAA,YAAA,EAAa,EAAe,IAAkB,CAC1D,EAAS,GAAY,EAAQ,KAAK,EAAO,IAAO,IAAM,EAAQ,EAAO,CAAM,CAAC,CAChF,EAAG,CAAC,CAAC,EAEC,GAAA,EAAW,EAAA,YAAA,CAAa,GAAqB,EAAQ,CAAK,EAAG,CAAC,CAAC,EAE/D,GAAA,EAAQ,EAAA,YAAA,CAAa,GAA4C,CACnE,EAAS,GAAY,EAAQ,IAAI,CAAE,CAAC,CACxC,EAAG,CAAC,CAAC,EAEC,GAAA,EAAQ,EAAA,YAAA,KAAwB,EAAQ,CAAC,CAAC,EAAG,CAAC,CAAC,EAiBrD,MAAO,CAAC,GAAA,EAfS,EAAA,QAAA,MACN,CACH,SACA,UACA,SACA,SACA,UACA,UACA,WACA,QACA,OACJ,GACA,CAAC,EAAQ,EAAS,EAAQ,EAAQ,EAAS,EAAS,EAAU,EAAO,CAAK,CAGhE,CAAQ,CAC1B"}