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