UNPKG

react-compound-timer

Version:

React hooks for timers, countdowns, and stopwatches.

1 lines 17.9 kB
{"version":3,"sources":["../src/helpers/getTimeParts.ts","../src/hook/useTimeModel.ts","../src/helpers/now.ts","../src/models/TimeModelState.ts","../src/models/TimeModel.ts","../src/instances/timeModel.ts"],"sourcesContent":["import { Unit, TimeParts } from \"../types\";\n\nexport function getTimeParts(\n time: number,\n lastUnit: Unit,\n roundUnit: Unit = \"ms\"\n): TimeParts {\n const units: Unit[] = [\"ms\", \"s\", \"m\", \"h\", \"d\"];\n const lastUnitIndex = units.findIndex((unit) => unit === lastUnit);\n const roundUnitIndex = units.findIndex((unit) => unit === roundUnit);\n\n if (roundUnitIndex > lastUnitIndex) {\n throw new Error(\"roundUnitIndex must be less or equal than lastUnitIndex\");\n }\n\n const dividers = [1000, 60, 60, 24, 1];\n const dividersAcc = [1, 1000, 60000, 3600000, 86400000];\n\n const startValue = {\n ms: 0,\n s: 0,\n m: 0,\n h: 0,\n d: 0,\n };\n\n const output = units.reduce((obj, unit, index) => {\n if (index > lastUnitIndex) {\n obj[unit] = 0;\n } else if (index === lastUnitIndex) {\n obj[unit] = Math.floor(time / dividersAcc[index]);\n } else {\n obj[unit] = Math.floor(time / dividersAcc[index]) % dividers[index];\n }\n\n return obj;\n }, startValue);\n\n if (roundUnitIndex > 0) {\n const unitToDecideOnRoundIndex = roundUnitIndex - 1;\n const unitToDecideOnRound = units[unitToDecideOnRoundIndex];\n const isRoundNeeded = output[unitToDecideOnRound] >= dividers[unitToDecideOnRoundIndex] / 2;\n\n if (isRoundNeeded) {\n output[roundUnit] = output[roundUnit] + 1;\n }\n\n for (let i = 0; i < roundUnitIndex; i++) {\n output[units[i]] = 0;\n }\n }\n\n return output;\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { TimeModel } from \"../models/TimeModel\";\nimport { TimerValue } from \"../types\";\n\nexport const useTimeModel = (timer: TimeModel) => {\n const [timerValue, setTimerValue] = useState(timer.value);\n\n useEffect(() => {\n setTimerValue(timer.value);\n\n const onChange = (timerValue: TimerValue) => {\n setTimerValue(timerValue);\n };\n\n timer.events = {\n ...timer.events,\n onChange,\n };\n\n return () => {\n timer.events = {\n ...timer.events,\n onChange: undefined,\n };\n };\n }, [timer]);\n\n const value = useMemo(\n () => ({\n value: timerValue,\n changeTime: timer.changeTime,\n changeLastUnit: timer.changeLastUnit,\n changeTimeToUpdate: timer.changeTimeToUpdate,\n changeDirection: timer.changeDirection,\n changeCheckpoints: timer.changeCheckpoints,\n start: timer.start,\n pause: timer.pause,\n resume: timer.resume,\n stop: timer.stop,\n reset: timer.reset,\n }),\n [timer, timerValue]\n );\n\n return value;\n};\n","export function now(): number {\n // if (typeof window === 'undefined' || !('performance' in window)) {\n // return Date.now();\n // }\n // return performance.now();\n\n // we do not use performance.now() anymore, read links below for more info\n // https://medium.com/@mihai/performance-now-sleep-16a5b774560c\n // https://persistent.info/web-experiments/performance-now-sleep/\n return Date.now();\n}\n","import { TimeModelStateValues } from \"../types\";\n\nexport const INITED = \"INITED\";\nexport const PLAYING = \"PLAYING\";\nexport const PAUSED = \"PAUSED\";\nexport const STOPPED = \"STOPPED\";\n\nexport class TimeModelState {\n private onStateChange: (obj: { state: TimeModelStateValues }) => void;\n private state: TimeModelStateValues = INITED;\n\n constructor(\n initialStatus: TimeModelStateValues = INITED,\n onStateChange: (obj: { state: TimeModelStateValues }) => void = () => {}\n ) {\n this.state = initialStatus;\n this.onStateChange = onStateChange;\n }\n\n public setOnStateChange(\n onStateChange: (obj: { state: TimeModelStateValues }) => void\n ) {\n this.onStateChange = onStateChange;\n }\n\n public getState() {\n return this.state;\n }\n\n public setInited() {\n if (this.state === INITED) {\n return false;\n }\n\n this.state = INITED;\n\n this.onChange();\n\n return true;\n }\n\n public isInited() {\n return this.state === INITED;\n }\n\n public setPlaying() {\n if (this.state === PLAYING) {\n return false;\n }\n\n this.state = PLAYING;\n\n this.onChange();\n\n return true;\n }\n\n public isPlaying() {\n return this.state === PLAYING;\n }\n\n public setPaused() {\n if (this.state !== PLAYING) {\n return false;\n }\n\n this.state = PAUSED;\n\n this.onChange();\n\n return true;\n }\n\n public isPaused() {\n return this.state === PAUSED;\n }\n\n public setStopped() {\n if (this.state === INITED) {\n return false;\n }\n\n this.state = STOPPED;\n\n this.onChange();\n\n return true;\n }\n\n public isStopped() {\n return this.state === STOPPED;\n }\n\n private onChange() {\n this.onStateChange({ state: this.state });\n }\n}\n","import { getTimeParts } from \"../helpers/getTimeParts\";\nimport { now } from \"../helpers/now\";\n\nimport { TimeModelState } from \"./TimeModelState\";\nimport { TimerValue, Unit, Checkpoints, Direction } from \"../types\";\n\nexport interface TimeModelOptions {\n initialTime: number;\n startImmediately: boolean;\n direction: \"forward\" | \"backward\";\n timeToUpdate: number;\n lastUnit: Unit;\n roundUnit: Unit;\n checkpoints: Checkpoints;\n}\n\nexport interface TimeModelEvents {\n onChange?: (timerValue: TimerValue) => void;\n onStart?: () => void;\n onResume?: () => void;\n onPause?: () => void;\n onStop?: () => void;\n onReset?: () => void;\n}\n\nexport class TimeModel {\n private options: TimeModelOptions;\n public events: TimeModelEvents;\n\n private internalTime: number;\n private time: number;\n private innerState: TimeModelState;\n private timerId: number | null;\n\n constructor(options: TimeModelOptions, events: TimeModelEvents = {}) {\n this.internalTime = now();\n this.options = options;\n this.events = events;\n this.time = options.initialTime;\n this.innerState = new TimeModelState(\"INITED\", () => {\n if (this.events.onChange) {\n this.events.onChange(this.value);\n }\n });\n\n this.timerId = null;\n\n if (this.options.startImmediately) {\n this.start();\n }\n }\n\n get value() {\n return this.getTimerValue(this.computeTime());\n }\n\n get currentOptions(): TimeModelOptions {\n return JSON.parse(JSON.stringify(this.options));\n }\n\n /**\n * Change options methods\n **/\n\n public changeTime = (time: number) => {\n this.internalTime = now();\n this.options.initialTime = time;\n this.time = this.options.initialTime;\n\n if (this.events.onChange) {\n this.events.onChange(this.getTimerValue(this.time));\n }\n };\n\n public changeLastUnit = (lastUnit: Unit) => {\n if (this.innerState.isPlaying()) {\n this.pause();\n this.options.lastUnit = lastUnit;\n this.resume(true);\n } else {\n this.options.lastUnit = lastUnit;\n }\n };\n\n public changeRoundUnit = (roundUnit: Unit) => {\n if (this.innerState.isPlaying()) {\n this.pause();\n this.options.roundUnit = roundUnit;\n this.resume(true);\n } else {\n this.options.roundUnit = roundUnit;\n }\n };\n\n public changeTimeToUpdate = (interval: number) => {\n if (this.innerState.isPlaying()) {\n this.pause();\n this.options.timeToUpdate = interval;\n this.resume();\n } else {\n this.options.timeToUpdate = interval;\n }\n };\n\n public changeDirection = (direction: Direction) => {\n this.options.direction = direction;\n };\n\n public changeCheckpoints = (checkpoints: Checkpoints) => {\n this.options.checkpoints = checkpoints;\n };\n\n /**\n * Timer controls methods\n **/\n\n public start = () => {\n if (this.innerState.setPlaying()) {\n this.setTimerInterval(true);\n\n if (this.events.onStart) {\n this.events.onStart();\n }\n }\n };\n\n public resume = (callImmediately = false) => {\n if (this.innerState.isPaused() && this.innerState.setPlaying()) {\n this.setTimerInterval(callImmediately);\n\n if (this.events.onResume) {\n this.events.onResume();\n }\n }\n };\n\n public pause = () => {\n if (this.innerState.setPaused()) {\n if (this.timerId) {\n clearInterval(this.timerId);\n }\n\n if (this.events.onPause) {\n this.events.onPause();\n }\n }\n };\n\n public stop = () => {\n if (this.innerState.setStopped()) {\n if (this.timerId) {\n clearInterval(this.timerId);\n }\n\n if (this.events.onStop) {\n this.events.onStop();\n }\n }\n };\n\n public reset = () => {\n this.time = this.options.initialTime;\n\n if (this.events.onChange) {\n this.events.onChange(this.getTimerValue(this.time));\n }\n\n if (this.events.onReset) {\n this.events.onReset();\n }\n };\n\n /**\n * Private methods\n **/\n\n private setTimerInterval = (callImmediately = false) => {\n if (this.timerId) {\n clearInterval(this.timerId);\n }\n\n this.internalTime = now();\n\n const repeatedFunc = () => {\n const oldTime = this.time;\n const updatedTime = this.computeTime();\n\n if (this.events.onChange) {\n this.events.onChange(this.getTimerValue(updatedTime));\n }\n\n this.options.checkpoints.map(({ time, callback }) => {\n const checkForForward = time > oldTime && time <= updatedTime;\n const checkForBackward = time < oldTime && time >= updatedTime;\n const checkIntersection =\n this.options.direction === \"backward\"\n ? checkForBackward\n : checkForForward;\n\n if (checkIntersection) {\n callback();\n }\n });\n };\n\n if (callImmediately && this.events.onChange) {\n this.events.onChange(this.getTimerValue(this.time));\n }\n\n this.timerId = window.setInterval(repeatedFunc, this.options.timeToUpdate);\n };\n\n private getTimerValue = (time: number): TimerValue => {\n return {\n ...getTimeParts(time, this.options.lastUnit, this.options.roundUnit),\n state: this.innerState.getState(),\n };\n };\n\n private computeTime = () => {\n if (this.innerState.isPlaying()) {\n const currentInternalTime = now();\n const delta = Math.abs(currentInternalTime - this.internalTime);\n\n switch (this.options.direction) {\n case \"forward\":\n this.time = this.time + delta;\n this.internalTime = currentInternalTime;\n\n return this.time;\n\n case \"backward\": {\n this.time = this.time - delta;\n this.internalTime = currentInternalTime;\n\n if (this.time < 0) {\n this.stop();\n\n return 0;\n }\n\n return this.time;\n }\n\n default:\n return this.time;\n }\n }\n\n return this.time < 0 ? 0 : this.time;\n };\n}\n","import {\n TimeModel,\n TimeModelEvents,\n TimeModelOptions,\n} from \"../models/TimeModel\";\n\nconst defaultOptions: TimeModelOptions = {\n initialTime: 0,\n direction: \"forward\",\n timeToUpdate: 250,\n startImmediately: true,\n lastUnit: \"d\",\n roundUnit: \"ms\",\n checkpoints: [],\n};\n\nexport const createTimeModel = (\n options: Partial<TimeModelOptions> = {},\n events: TimeModelEvents = {}\n) => {\n const resultOptions = {\n ...defaultOptions,\n ...options,\n };\n\n return new TimeModel(resultOptions, events);\n};\n"],"mappings":"6aAEO,SAASA,EACdC,EACAC,EACAC,EAAkB,KACP,CACX,IAAMC,EAAgB,CAAC,KAAM,IAAK,IAAK,IAAK,GAAG,EACzCC,EAAgBD,EAAM,UAAWE,GAASA,IAASJ,CAAQ,EAC3DK,EAAiBH,EAAM,UAAWE,GAASA,IAASH,CAAS,EAEnE,GAAII,EAAiBF,EACnB,MAAM,IAAI,MAAM,yDAAyD,EAG3E,IAAMG,EAAW,CAAC,IAAM,GAAI,GAAI,GAAI,CAAC,EAC/BC,EAAc,CAAC,EAAG,IAAM,IAAO,KAAS,KAAQ,EAEhDC,EAAa,CACjB,GAAI,EACJ,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,CACL,EAEMC,EAASP,EAAM,OAAO,CAACQ,EAAKN,EAAMO,KAClCA,EAAQR,EACVO,EAAIN,CAAI,EAAI,EACHO,IAAUR,EACnBO,EAAIN,CAAI,EAAI,KAAK,MAAML,EAAOQ,EAAYI,CAAK,CAAC,EAEhDD,EAAIN,CAAI,EAAI,KAAK,MAAML,EAAOQ,EAAYI,CAAK,CAAC,EAAIL,EAASK,CAAK,EAG7DD,GACNF,CAAU,EAEb,GAAIH,EAAiB,EAAG,CACtB,IAAMO,EAA2BP,EAAiB,EAC5CQ,EAAsBX,EAAMU,CAAwB,EACpCH,EAAOI,CAAmB,GAAKP,EAASM,CAAwB,EAAI,IAGxFH,EAAOR,CAAS,EAAIQ,EAAOR,CAAS,EAAI,GAG1C,QAASa,EAAI,EAAGA,EAAIT,EAAgBS,IAClCL,EAAOP,EAAMY,CAAC,CAAC,EAAI,CAEvB,CAEA,OAAOL,CACT,CCrDA,OAAS,aAAAM,EAAW,WAAAC,EAAS,YAAAC,MAAgB,QAItC,IAAMC,EAAgBC,GAAqB,CAChD,GAAM,CAACC,EAAYC,CAAa,EAAIC,EAASH,EAAM,KAAK,EAExD,OAAAI,EAAU,IAAM,CACdF,EAAcF,EAAM,KAAK,EAEzB,IAAMK,EAAYJ,GAA2B,CAC3CC,EAAcD,CAAU,CAC1B,EAEA,OAAAD,EAAM,OAASM,EAAAC,EAAA,GACVP,EAAM,QADI,CAEb,SAAAK,CACF,GAEO,IAAM,CACXL,EAAM,OAASM,EAAAC,EAAA,GACVP,EAAM,QADI,CAEb,SAAU,MACZ,EACF,CACF,EAAG,CAACA,CAAK,CAAC,EAEIQ,EACZ,KAAO,CACL,MAAOP,EACP,WAAYD,EAAM,WAClB,eAAgBA,EAAM,eACtB,mBAAoBA,EAAM,mBAC1B,gBAAiBA,EAAM,gBACvB,kBAAmBA,EAAM,kBACzB,MAAOA,EAAM,MACb,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,KAAMA,EAAM,KACZ,MAAOA,EAAM,KACf,GACA,CAACA,EAAOC,CAAU,CACpB,CAGF,EC7CO,SAASQ,GAAc,CAS5B,OAAO,KAAK,IAAI,CAClB,CCRO,IAAMC,EAAS,SACTC,EAAU,UACVC,EAAS,SACTC,EAAU,UAEVC,EAAN,KAAqB,CAI1B,YACEC,EAAsCL,EACtCM,EAAgE,IAAM,CAAC,EACvE,CALF,KAAQ,MAA8BN,EAMpC,KAAK,MAAQK,EACb,KAAK,cAAgBC,CACvB,CAEO,iBACLA,EACA,CACA,KAAK,cAAgBA,CACvB,CAEO,UAAW,CAChB,OAAO,KAAK,KACd,CAEO,WAAY,CACjB,OAAI,KAAK,QAAUN,EACV,IAGT,KAAK,MAAQA,EAEb,KAAK,SAAS,EAEP,GACT,CAEO,UAAW,CAChB,OAAO,KAAK,QAAUA,CACxB,CAEO,YAAa,CAClB,OAAI,KAAK,QAAUC,EACV,IAGT,KAAK,MAAQA,EAEb,KAAK,SAAS,EAEP,GACT,CAEO,WAAY,CACjB,OAAO,KAAK,QAAUA,CACxB,CAEO,WAAY,CACjB,OAAI,KAAK,QAAUA,EACV,IAGT,KAAK,MAAQC,EAEb,KAAK,SAAS,EAEP,GACT,CAEO,UAAW,CAChB,OAAO,KAAK,QAAUA,CACxB,CAEO,YAAa,CAClB,OAAI,KAAK,QAAUF,EACV,IAGT,KAAK,MAAQG,EAEb,KAAK,SAAS,EAEP,GACT,CAEO,WAAY,CACjB,OAAO,KAAK,QAAUA,CACxB,CAEQ,UAAW,CACjB,KAAK,cAAc,CAAE,MAAO,KAAK,KAAM,CAAC,CAC1C,CACF,ECvEO,IAAMI,EAAN,KAAgB,CASrB,YAAYC,EAA2BC,EAA0B,CAAC,EAAG,CA8BrE,KAAO,WAAcC,GAAiB,CACpC,KAAK,aAAeC,EAAI,EACxB,KAAK,QAAQ,YAAcD,EAC3B,KAAK,KAAO,KAAK,QAAQ,YAErB,KAAK,OAAO,UACd,KAAK,OAAO,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC,CAEtD,EAEA,KAAO,eAAkBE,GAAmB,CACtC,KAAK,WAAW,UAAU,GAC5B,KAAK,MAAM,EACX,KAAK,QAAQ,SAAWA,EACxB,KAAK,OAAO,EAAI,GAEhB,KAAK,QAAQ,SAAWA,CAE5B,EAEA,KAAO,gBAAmBC,GAAoB,CACxC,KAAK,WAAW,UAAU,GAC5B,KAAK,MAAM,EACX,KAAK,QAAQ,UAAYA,EACzB,KAAK,OAAO,EAAI,GAEhB,KAAK,QAAQ,UAAYA,CAE7B,EAEA,KAAO,mBAAsBC,GAAqB,CAC5C,KAAK,WAAW,UAAU,GAC5B,KAAK,MAAM,EACX,KAAK,QAAQ,aAAeA,EAC5B,KAAK,OAAO,GAEZ,KAAK,QAAQ,aAAeA,CAEhC,EAEA,KAAO,gBAAmBC,GAAyB,CACjD,KAAK,QAAQ,UAAYA,CAC3B,EAEA,KAAO,kBAAqBC,GAA6B,CACvD,KAAK,QAAQ,YAAcA,CAC7B,EAMA,KAAO,MAAQ,IAAM,CACf,KAAK,WAAW,WAAW,IAC7B,KAAK,iBAAiB,EAAI,EAEtB,KAAK,OAAO,SACd,KAAK,OAAO,QAAQ,EAG1B,EAEA,KAAO,OAAS,CAACC,EAAkB,KAAU,CACvC,KAAK,WAAW,SAAS,GAAK,KAAK,WAAW,WAAW,IAC3D,KAAK,iBAAiBA,CAAe,EAEjC,KAAK,OAAO,UACd,KAAK,OAAO,SAAS,EAG3B,EAEA,KAAO,MAAQ,IAAM,CACf,KAAK,WAAW,UAAU,IACxB,KAAK,SACP,cAAc,KAAK,OAAO,EAGxB,KAAK,OAAO,SACd,KAAK,OAAO,QAAQ,EAG1B,EAEA,KAAO,KAAO,IAAM,CACd,KAAK,WAAW,WAAW,IACzB,KAAK,SACP,cAAc,KAAK,OAAO,EAGxB,KAAK,OAAO,QACd,KAAK,OAAO,OAAO,EAGzB,EAEA,KAAO,MAAQ,IAAM,CACnB,KAAK,KAAO,KAAK,QAAQ,YAErB,KAAK,OAAO,UACd,KAAK,OAAO,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC,EAGhD,KAAK,OAAO,SACd,KAAK,OAAO,QAAQ,CAExB,EAMA,KAAQ,iBAAmB,CAACA,EAAkB,KAAU,CAClD,KAAK,SACP,cAAc,KAAK,OAAO,EAG5B,KAAK,aAAeN,EAAI,EAExB,IAAMO,EAAe,IAAM,CACzB,IAAMC,EAAU,KAAK,KACfC,EAAc,KAAK,YAAY,EAEjC,KAAK,OAAO,UACd,KAAK,OAAO,SAAS,KAAK,cAAcA,CAAW,CAAC,EAGtD,KAAK,QAAQ,YAAY,IAAI,CAAC,CAAE,KAAAV,EAAM,SAAAW,CAAS,IAAM,CACnD,IAAMC,EAAkBZ,EAAOS,GAAWT,GAAQU,EAC5CG,EAAmBb,EAAOS,GAAWT,GAAQU,GAEjD,KAAK,QAAQ,YAAc,WACvBG,EACAD,IAGJD,EAAS,CAEb,CAAC,CACH,EAEIJ,GAAmB,KAAK,OAAO,UACjC,KAAK,OAAO,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC,EAGpD,KAAK,QAAU,OAAO,YAAYC,EAAc,KAAK,QAAQ,YAAY,CAC3E,EAEA,KAAQ,cAAiBR,GAChBc,EAAAC,EAAA,GACFC,EAAahB,EAAM,KAAK,QAAQ,SAAU,KAAK,QAAQ,SAAS,GAD9D,CAEL,MAAO,KAAK,WAAW,SAAS,CAClC,GAGF,KAAQ,YAAc,IAAM,CAC1B,GAAI,KAAK,WAAW,UAAU,EAAG,CAC/B,IAAMiB,EAAsBhB,EAAI,EAC1BiB,EAAQ,KAAK,IAAID,EAAsB,KAAK,YAAY,EAE9D,OAAQ,KAAK,QAAQ,UAAW,CAC9B,IAAK,UACH,YAAK,KAAO,KAAK,KAAOC,EACxB,KAAK,aAAeD,EAEb,KAAK,KAEd,IAAK,WAIH,OAHA,KAAK,KAAO,KAAK,KAAOC,EACxB,KAAK,aAAeD,EAEhB,KAAK,KAAO,GACd,KAAK,KAAK,EAEH,GAGF,KAAK,KAGd,QACE,OAAO,KAAK,IAChB,CACF,CAEA,OAAO,KAAK,KAAO,EAAI,EAAI,KAAK,IAClC,EAvNE,KAAK,aAAehB,EAAI,EACxB,KAAK,QAAUH,EACf,KAAK,OAASC,EACd,KAAK,KAAOD,EAAQ,YACpB,KAAK,WAAa,IAAIqB,EAAe,SAAU,IAAM,CAC/C,KAAK,OAAO,UACd,KAAK,OAAO,SAAS,KAAK,KAAK,CAEnC,CAAC,EAED,KAAK,QAAU,KAEX,KAAK,QAAQ,kBACf,KAAK,MAAM,CAEf,CAEA,IAAI,OAAQ,CACV,OAAO,KAAK,cAAc,KAAK,YAAY,CAAC,CAC9C,CAEA,IAAI,gBAAmC,CACrC,OAAO,KAAK,MAAM,KAAK,UAAU,KAAK,OAAO,CAAC,CAChD,CAiMF,ECrPA,IAAMC,EAAmC,CACvC,YAAa,EACb,UAAW,UACX,aAAc,IACd,iBAAkB,GAClB,SAAU,IACV,UAAW,KACX,YAAa,CAAC,CAChB,EAEaC,EAAkB,CAC7BC,EAAqC,CAAC,EACtCC,EAA0B,CAAC,IACxB,CACH,IAAMC,EAAgBC,IAAA,GACjBL,GACAE,GAGL,OAAO,IAAII,EAAUF,EAAeD,CAAM,CAC5C","names":["getTimeParts","time","lastUnit","roundUnit","units","lastUnitIndex","unit","roundUnitIndex","dividers","dividersAcc","startValue","output","obj","index","unitToDecideOnRoundIndex","unitToDecideOnRound","i","useEffect","useMemo","useState","useTimeModel","timer","timerValue","setTimerValue","useState","useEffect","onChange","__spreadProps","__spreadValues","useMemo","now","INITED","PLAYING","PAUSED","STOPPED","TimeModelState","initialStatus","onStateChange","TimeModel","options","events","time","now","lastUnit","roundUnit","interval","direction","checkpoints","callImmediately","repeatedFunc","oldTime","updatedTime","callback","checkForForward","checkForBackward","__spreadProps","__spreadValues","getTimeParts","currentInternalTime","delta","TimeModelState","defaultOptions","createTimeModel","options","events","resultOptions","__spreadValues","TimeModel"]}