{"version":3,"sources":["../../src/use-interval/index.ts"],"sourcesContent":["import { useCounter } from '../use-counter'\nimport { useIntervalFn } from '../use-interval-fn'\nimport { useLatest } from '../use-latest'\n\nimport type { UseCounterReturnsAction } from '../use-counter'\nimport type { UseIntervalFnInterval } from '../use-interval-fn'\nimport type { Pausable } from '../use-pausable'\n\nexport interface UseIntervalOptions<Controls extends boolean> {\n  /**\n   * Expose more controls\n   *\n   * @defaultValue false\n   */\n  controls?: Controls\n  /**\n   * Execute the update immediately on calling\n   *\n   * @defaultValue true\n   */\n  immediate?: boolean\n  /**\n   * Callback on every interval\n   *\n   * @param count - The current count\n   */\n  callback?: (count: number) => void\n}\n\nexport interface UseIntervalAction extends UseCounterReturnsAction, Pausable {\n  /**\n   * Reset the count, optionally set a new count\n   */\n  reset: (count?: number) => void\n}\n\nexport type UseIntervalWithControlsReturns = [\n  /**\n   * Current count\n   */\n  count: number,\n  /**\n   * Counter Actions\n   */\n  UseIntervalAction,\n]\n\nexport type UseIntervalReturns<Controls extends boolean> = Controls extends true\n  ? UseIntervalWithControlsReturns\n  : number\n\n/**\n * A React Hook that create a interval counter.\n */\nexport function useInterval(\n  interval?: UseIntervalFnInterval,\n  options?: UseIntervalOptions<false>,\n): UseIntervalReturns<false>\nexport function useInterval(\n  interval: UseIntervalFnInterval,\n  options: UseIntervalOptions<true>,\n): UseIntervalReturns<true>\nexport function useInterval(interval: UseIntervalFnInterval = 1000, options: UseIntervalOptions<boolean> = {}) {\n  const { controls: exposeControls = false, immediate = true, callback } = options\n  const [count, actions] = useCounter(0)\n  const latest = useLatest({ actions, callback })\n\n  const controls = useIntervalFn(\n    () => {\n      latest.current.actions.inc()\n      latest.current.callback?.(count)\n    },\n    interval,\n    { immediate },\n  )\n\n  return exposeControls ? [count, { ...actions, ...controls }] : count\n}\n"],"names":["useInterval","interval","options","exposeControls","controls","immediate","callback","useCounter","count","actions","latest","useLatest","useIntervalFn","current","inc"],"mappings":";;;;+BA8DgBA;;;eAAAA;;;0BA9DW;6BACG;yBACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DnB,SAASA;QAAYC,WAAAA,iEAAkC,MAAMC,UAAAA,iEAAuC,CAAC;IAC1G,IAAkBC,MAAuDD,QAAjEE,UAAUD,iBAAAA,iBAAiB,QAAjBA,0BAAuDD,QAA/BG,WAAAA,4CAAY,2BAAMC,WAAaJ,QAAbI;IAC5D,IAAyBC,+BAAAA,IAAAA,sBAAU,EAAC,QAA7BC,QAAkBD,gBAAXE,UAAWF;IACzB,IAAMG,SAASC,IAAAA,oBAAS,EAAC;QAAEF,SAAAA;QAASH,UAAAA;IAAS;IAE7C,IAAMF,WAAWQ,IAAAA,4BAAa,EAC5B;YAEEF,0BAAAA;QADAA,OAAOG,OAAO,CAACJ,OAAO,CAACK,GAAG;SAC1BJ,2BAAAA,CAAAA,kBAAAA,OAAOG,OAAO,EAACP,QAAQ,cAAvBI,+CAAAA,8BAAAA,iBAA0BF;IAC5B,GACAP,UACA;QAAEI,WAAAA;IAAU;IAGd,OAAOF,iBAAiB;QAACK;QAAO,mBAAKC,SAAYL;KAAW,GAAGI;AACjE"}