import * as React from 'react' type RefType = React.MutableRefObject | ((state: T) => void) function call(ref: RefType | undefined, value: T | null) { if (typeof ref === 'function') ref(value as T) else if (ref != null) ref.current = value as T } export function useEffectfulState(fn: () => T, deps: React.DependencyList = [], cb?: RefType) { const [state, set] = React.useState() React.useLayoutEffect(() => { const value = fn() set(value) call(cb, value) return () => call(cb, null) }, deps) return state }