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