import { useCallback, useState } from 'react' export type MapOrEntries = Map | [K, V][] // Public interface export interface Actions { set: (key: K, value: V) => void setAll: (entries: MapOrEntries) => void remove: (key: K) => void reset: Map['clear'] } // We hide some setters from the returned map to disable autocompletion type Return = [Omit, 'set' | 'clear' | 'delete'>, Actions] function useMap( initialState: MapOrEntries = new Map(), ): Return { const [map, setMap] = useState(new Map(initialState)) const actions: Actions = { set: useCallback((key, value) => { setMap(prev => { const copy = new Map(prev) copy.set(key, value) return copy }) }, []), setAll: useCallback(entries => { setMap(() => new Map(entries)) }, []), remove: useCallback(key => { setMap(prev => { const copy = new Map(prev) copy.delete(key) return copy }) }, []), reset: useCallback(() => { setMap(() => new Map()) }, []), } return [map, actions] } export default useMap