import {useRef, useState} from "react";

import type {SetStateAction} from "react";

type ReactStateAccessor<State> = (
  ...args: [] | [SetStateAction<State>]
) => State;

const useStateAccessors = <State>(
  initialState: State
): ReactStateAccessor<State> => {
  const [, setState] = useState(initialState);

  const stateRef = useRef(initialState);

  return (...args) => {
    if (args.length === 1) {
      const [newStateOrSetter] = args;

      stateRef.current =
        newStateOrSetter instanceof Function
          ? newStateOrSetter(stateRef.current)
          : newStateOrSetter;

      setState(stateRef.current);
    }

    return stateRef.current;
  };
};

export default useStateAccessors;

export type {ReactStateAccessor};