let nextHandle = 1;
|
const RESOLVED = (() => Promise.resolve())();
|
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;
|
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;
|
}
|
};
|