| 13 | } |
| 14 | |
| 15 | const useSet = <K>(initialSet = new Set<K>()): [Set<K>, Actions<K>] => { |
| 16 | const [set, setSet] = useState(initialSet); |
| 17 | |
| 18 | const stableActions = useMemo<StableActions<K>>(() => { |
| 19 | const add = (item: K) => setSet((prevSet) => new Set([...Array.from(prevSet), item])); |
| 20 | const remove = (item: K) => |
| 21 | setSet((prevSet) => new Set(Array.from(prevSet).filter((i) => i !== item))); |
| 22 | const toggle = (item: K) => |
| 23 | setSet((prevSet) => |
| 24 | prevSet.has(item) |
| 25 | ? new Set(Array.from(prevSet).filter((i) => i !== item)) |
| 26 | : new Set([...Array.from(prevSet), item]) |
| 27 | ); |
| 28 | |
| 29 | return { add, remove, toggle, reset: () => setSet(initialSet), clear: () => setSet(new Set()) }; |
| 30 | }, [setSet]); |
| 31 | |
| 32 | const utils = { |
| 33 | has: useCallback((item) => set.has(item), [set]), |
| 34 | ...stableActions, |
| 35 | } as Actions<K>; |
| 36 | |
| 37 | return [set, utils]; |
| 38 | }; |
| 39 | |
| 40 | export default useSet; |