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