import { Immediate } from '../util/Immediate'; import type { TimerHandle } from './timerHandle'; const { setImmediate, clearImmediate } = Immediate; type SetImmediateFunction = (handler: () => void, ...args: any[]) => TimerHandle; type ClearImmediateFunction = (handle: TimerHandle) => void; interface ImmediateProvider { setImmediate: SetImmediateFunction; clearImmediate: ClearImmediateFunction; delegate: | { setImmediate: SetImmediateFunction; clearImmediate: ClearImmediateFunction; } | undefined; } export const immediateProvider: ImmediateProvider = { // When accessing the delegate, use the variable rather than `this` so that // the functions can be called without being bound to the provider. setImmediate(...args) { const { delegate } = immediateProvider; return (delegate?.setImmediate || setImmediate)(...args); }, clearImmediate(handle) { const { delegate } = immediateProvider; return (delegate?.clearImmediate || clearImmediate)(handle as any); }, delegate: undefined, };