let nextHandle = 1; 
 | 
// The promise needs to be created lazily otherwise it won't be patched by Zones 
 | 
let resolved: Promise<any>; 
 | 
const activeHandles: { [key: number]: any } = {}; 
 | 
  
 | 
/** 
 | 
 * Finds the handle in the list of active handles, and removes it. 
 | 
 * Returns `true` if found, `false` otherwise. Used both to clear 
 | 
 * Immediate scheduled tasks, and to identify if a task should be scheduled. 
 | 
 */ 
 | 
function findAndClearHandle(handle: number): boolean { 
 | 
  if (handle in activeHandles) { 
 | 
    delete activeHandles[handle]; 
 | 
    return true; 
 | 
  } 
 | 
  return false; 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Helper functions to schedule and unschedule microtasks. 
 | 
 */ 
 | 
export const Immediate = { 
 | 
  setImmediate(cb: () => void): number { 
 | 
    const handle = nextHandle++; 
 | 
    activeHandles[handle] = true; 
 | 
    if (!resolved) { 
 | 
      resolved = Promise.resolve(); 
 | 
    } 
 | 
    resolved.then(() => findAndClearHandle(handle) && cb()); 
 | 
    return handle; 
 | 
  }, 
 | 
  
 | 
  clearImmediate(handle: number): void { 
 | 
    findAndClearHandle(handle); 
 | 
  }, 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * Used for internal testing purposes only. Do not export from library. 
 | 
 */ 
 | 
export const TestTools = { 
 | 
  pending() { 
 | 
    return Object.keys(activeHandles).length; 
 | 
  } 
 | 
}; 
 |