import * as React from 'react'; function basicStateInitializer(initialArg: S | (() => S)): S { return initialArg instanceof Function ? initialArg() : initialArg; } function initializer(initialArg: T | (() => T)): [T, T | undefined] { const initialState = basicStateInitializer(initialArg); return [initialState, undefined]; } function basicStateReducer(state: S, action: React.SetStateAction): S { return action instanceof Function ? action(state) : action; } function reducer( [prevState]: [T, T | undefined], action: React.SetStateAction, ): [T, T | undefined] { const newState = basicStateReducer(prevState, action); return [newState, prevState]; } /** * Возвращает значение с текущим и предыдущим состоянием * * # Пример * * ```ts * const [[count, prevCount], setCount] = useStateWithPrev(initialState); * ``` */ export function useStateWithPrev( initialState: T | (() => T), ): [[T, T | undefined], React.Dispatch>] { return React.useReducer(reducer, undefined, () => initializer(initialState)); }