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, 
 | 
}; 
 |