import { useCallback, useMemo, useState } from 'react'; export interface StableActions { add: (key: K) => void; remove: (key: K) => void; toggle: (key: K) => void; reset: () => void; } export interface Actions extends StableActions { has: (key: K) => boolean; } const useSet = (initialSet = new Set()): [Set, Actions] => { const [set, setSet] = useState(initialSet); const stableActions = useMemo>(() => { const add = (item: K) => setSet((prevSet) => new Set([...Array.from(prevSet), item])); const remove = (item: K) => setSet((prevSet) => new Set(Array.from(prevSet).filter((i) => i !== item))); const toggle = (item: K) => setSet((prevSet) => prevSet.has(item) ? new Set(Array.from(prevSet).filter((i) => i !== item)) : new Set([...Array.from(prevSet), item]) ); return { add, remove, toggle, reset: () => setSet(initialSet) }; }, [setSet]); const utils = { has: useCallback((item) => set.has(item), [set]), ...stableActions, } as Actions; return [set, utils]; }; export default useSet;