import { DependencyList, MutableRefObject, useDebugValue, useRef, useMemo } from 'react' import { isFunction } from './common/is-function' import { NonFunction } from './common/non-function.type' import { useRun } from "./run" type useSuperRef = { (): readonly [V | undefined, MutableRefObject] (initialValue: () => V): readonly [V, MutableRefObject] (initialValue: NonFunction): readonly [V, MutableRefObject] (factory: () => V, deps: DependencyList): readonly [V, MutableRefObject] (factory: (prev: V) => V, deps: DependencyList): readonly [V, MutableRefObject] } export const useSuperRef: useSuperRef = (factory?: V | ((prev: V) => V), deps: DependencyList = []) => { const ref = useRef() useRun(() => ref.current = isFunction(factory) ? factory(ref.current) : factory, deps) useDebugValue(ref.current) return [ref.current, ref] }