import { core } from "./_core.ts";import { validateCallback } from "./internal/validators.mjs";import { _exiting } from "./_process/exiting.ts";import { FixedQueue } from "./internal/fixed_queue.ts";
interface Tock { callback: (...args: Array<unknown>) => void; args: Array<unknown>;}
const queue = new FixedQueue();
let _nextTick: any;
if (typeof core.setNextTickCallback !== "undefined") { function runNextTicks() { if (!core.hasTickScheduled()) { core.runMicrotasks(); } if (!core.hasTickScheduled()) { return true; }
processTicksAndRejections(); return true; }
function processTicksAndRejections() { let tock; do { while (tock = queue.shift()) {
try { const callback = (tock as Tock).callback; if ((tock as Tock).args === undefined) { callback(); } else { const args = (tock as Tock).args; switch (args.length) { case 1: callback(args[0]); break; case 2: callback(args[0], args[1]); break; case 3: callback(args[0], args[1], args[2]); break; case 4: callback(args[0], args[1], args[2], args[3]); break; default: callback(...args); } } } finally { }
} core.runMicrotasks(); } while (!queue.isEmpty()); core.setHasTickScheduled(false); }
core.setNextTickCallback(processTicksAndRejections); core.setMacrotaskCallback(runNextTicks);
function __nextTickNative<T extends Array<unknown>>( this: unknown, callback: (...args: T) => void, ...args: T ) { validateCallback(callback);
if (_exiting) { return; }
let args_; switch (args.length) { case 0: break; case 1: args_ = [args[0]]; break; case 2: args_ = [args[0], args[1]]; break; case 3: args_ = [args[0], args[1], args[2]]; break; default: args_ = new Array(args.length); for (let i = 0; i < args.length; i++) { args_[i] = args[i]; } }
if (queue.isEmpty()) { core.setHasTickScheduled(true); } const tickObject = { callback, args: args_, }; queue.push(tickObject); } _nextTick = __nextTickNative;} else { function __nextTickQueueMicrotask<T extends Array<unknown>>( this: unknown, callback: (...args: T) => void, ...args: T ) { if (args) { queueMicrotask(() => callback.call(this, ...args)); } else { queueMicrotask(callback); } }
_nextTick = __nextTickQueueMicrotask;}
export function nextTick(this: unknown, callback: () => void): void;export function nextTick<T extends Array<unknown>>( this: unknown, callback: (...args: T) => void, ...args: T): void;export function nextTick<T extends Array<unknown>>( this: unknown, callback: (...args: T) => void, ...args: T) { _nextTick(callback, ...args);}