var len = 0;
export default function asap(callback, arg) {
queue[len] = callback; queue[len + 1] = arg; len += 2; if (len === 2) { // If len is 1, that means that we need to schedule an async flush. // If additional callbacks are queued before the queue is flushed, they // will be processed by this flush that we are scheduling. scheduleFlush(); }
}
var browserGlobal = (typeof window !== 'undefined') ? window : {}; var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
// test for web worker but not in IE10 var isWorker = typeof Uint8ClampedArray !== 'undefined' &&
typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
// node function useNextTick() {
return function() { process.nextTick(flush); };
}
function useMutationObserver() {
var iterations = 0; var observer = new BrowserMutationObserver(flush); var node = document.createTextNode(''); observer.observe(node, { characterData: true }); return function() { node.data = (iterations = ++iterations % 2); };
}
// web worker function useMessageChannel() {
var channel = new MessageChannel(); channel.port1.onmessage = flush; return function () { channel.port2.postMessage(0); };
}
function useSetTimeout() {
return function() { setTimeout(flush, 1); };
}
var queue = new Array(1000); function flush() {
for (var i = 0; i < len; i+=2) { var callback = queue[i]; var arg = queue[i+1]; callback(arg); queue[i] = undefined; queue[i+1] = undefined; } len = 0;
}
var scheduleFlush;
// Decide what async method to use to triggering processing of queued callbacks: if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
scheduleFlush = useNextTick();
} else if (BrowserMutationObserver) {
scheduleFlush = useMutationObserver();
} else if (isWorker) {
scheduleFlush = useMessageChannel();
} else {
scheduleFlush = useSetTimeout();
}