{"version":3,"file":"use-state-history.cjs","names":[],"sources":["../../src/use-state-history/use-state-history.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\n\nexport interface UseStateHistoryHandlers<T> {\n  set: (value: T) => void;\n  back: (steps?: number) => void;\n  forward: (steps?: number) => void;\n  reset: () => void;\n}\n\nexport interface UseStateHistoryValue<T> {\n  history: T[];\n  current: number;\n}\n\nexport type UseStateHistoryReturnValue<T> = [\n  T,\n  UseStateHistoryHandlers<T>,\n  UseStateHistoryValue<T>,\n];\n\nexport function useStateHistory<T>(initialValue: T): UseStateHistoryReturnValue<T> {\n  const [state, setState] = useState<UseStateHistoryValue<T>>({\n    history: [initialValue],\n    current: 0,\n  });\n\n  const set = useCallback(\n    (val: T) =>\n      setState((currentState) => {\n        const nextState = [...currentState.history.slice(0, currentState.current + 1), val];\n        return {\n          history: nextState,\n          current: nextState.length - 1,\n        };\n      }),\n    []\n  );\n\n  const back = useCallback(\n    (steps = 1) =>\n      setState((currentState) => ({\n        history: currentState.history,\n        current: Math.max(0, currentState.current - steps),\n      })),\n    []\n  );\n\n  const forward = useCallback(\n    (steps = 1) =>\n      setState((currentState) => ({\n        history: currentState.history,\n        current: Math.min(currentState.history.length - 1, currentState.current + steps),\n      })),\n    []\n  );\n\n  const reset = useCallback(() => {\n    setState({ history: [initialValue], current: 0 });\n  }, [initialValue]);\n\n  const handlers = useMemo(() => ({ back, forward, reset, set }), [back, forward, reset, set]);\n\n  return [state.history[state.current], handlers, state];\n}\n\nexport namespace useStateHistory {\n  export type Handlers<T> = UseStateHistoryHandlers<T>;\n  export type Value<T> = UseStateHistoryValue<T>;\n  export type ReturnValue<T> = UseStateHistoryReturnValue<T>;\n}\n"],"mappings":";;;AAoBA,SAAgB,gBAAmB,cAAgD;CACjF,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAA8C;EAC1D,SAAS,CAAC,aAAa;EACvB,SAAS;EACV,CAAC;CAEF,MAAM,OAAA,GAAA,MAAA,cACH,QACC,UAAU,iBAAiB;EACzB,MAAM,YAAY,CAAC,GAAG,aAAa,QAAQ,MAAM,GAAG,aAAa,UAAU,EAAE,EAAE,IAAI;AACnF,SAAO;GACL,SAAS;GACT,SAAS,UAAU,SAAS;GAC7B;GACD,EACJ,EAAE,CACH;CAED,MAAM,QAAA,GAAA,MAAA,cACH,QAAQ,MACP,UAAU,kBAAkB;EAC1B,SAAS,aAAa;EACtB,SAAS,KAAK,IAAI,GAAG,aAAa,UAAU,MAAM;EACnD,EAAE,EACL,EAAE,CACH;CAED,MAAM,WAAA,GAAA,MAAA,cACH,QAAQ,MACP,UAAU,kBAAkB;EAC1B,SAAS,aAAa;EACtB,SAAS,KAAK,IAAI,aAAa,QAAQ,SAAS,GAAG,aAAa,UAAU,MAAM;EACjF,EAAE,EACL,EAAE,CACH;CAED,MAAM,SAAA,GAAA,MAAA,mBAA0B;AAC9B,WAAS;GAAE,SAAS,CAAC,aAAa;GAAE,SAAS;GAAG,CAAC;IAChD,CAAC,aAAa,CAAC;CAElB,MAAM,YAAA,GAAA,MAAA,gBAA0B;EAAE;EAAM;EAAS;EAAO;EAAK,GAAG;EAAC;EAAM;EAAS;EAAO;EAAI,CAAC;AAE5F,QAAO;EAAC,MAAM,QAAQ,MAAM;EAAU;EAAU;EAAM"}