import type { TimerHandle } from './timerHandle'; | |
type SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle; | |
type ClearIntervalFunction = (handle: TimerHandle) => void; | |
interface IntervalProvider { | |
setInterval: SetIntervalFunction; | |
clearInterval: ClearIntervalFunction; | |
delegate: | |
| { | |
setInterval: SetIntervalFunction; | |
clearInterval: ClearIntervalFunction; | |
} | |
| undefined; | |
} | |
export const intervalProvider: IntervalProvider = { | |
// When accessing the delegate, use the variable rather than `this` so that | |
// the functions can be called without being bound to the provider. | |
setInterval(handler: () => void, timeout?: number, ...args) { | |
const { delegate } = intervalProvider; | |
if (delegate?.setInterval) { | |
return delegate.setInterval(handler, timeout, ...args); | |
} | |
return setInterval(handler, timeout, ...args); | |
}, | |
clearInterval(handle) { | |
const { delegate } = intervalProvider; | |
return (delegate?.clearInterval || clearInterval)(handle as any); | |
}, | |
delegate: undefined, | |
}; | |