diff --git a/src/useGetSet.ts b/src/useGetSet.ts index 33768aea88..9cb4e02117 100644 --- a/src/useGetSet.ts +++ b/src/useGetSet.ts @@ -1,16 +1,21 @@ -import { useCallback, useRef } from 'react'; +import { Dispatch, useMemo, useRef } from 'react'; import useUpdate from './useUpdate'; +import { HookState, InitialHookState, resolveHookState } from './util/resolveHookState'; -const useGetSet = (initialValue: T): [() => T, (value: T) => void] => { - const state = useRef(initialValue); +export default function useGetSet(initialState: InitialHookState): [() => S, Dispatch>] { + const state = useRef(resolveHookState(initialState)); const update = useUpdate(); - const get = useCallback(() => state.current, []); - const set = useCallback((value: T) => { - state.current = value; - update(); - }, []); - return [get, set]; -}; - -export default useGetSet; + return useMemo( + () => [ + // get + () => state.current as S, + // set + (newState: HookState) => { + state.current = resolveHookState(newState, state.current); + update(); + }, + ], + [] + ); +}