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;