| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | 'use strict';var callable, byObserver;callable = function (fn) {	if (typeof fn !== 'function') throw new TypeError(fn + " is not a function");	return fn;};byObserver = function (Observer) {	var node = document.createTextNode(''), queue, currentQueue, i = 0;	new Observer(function () {		var callback;		if (!queue) {			if (!currentQueue) return;			queue = currentQueue;		} else if (currentQueue) {			queue = currentQueue.concat(queue);		}		currentQueue = queue;		queue = null;		if (typeof currentQueue === 'function') {			callback = currentQueue;			currentQueue = null;			callback();			return;		}		node.data = (i = ++i % 2); // Invoke other batch, to handle leftover callbacks in case of crash		while (currentQueue) {			callback = currentQueue.shift();			if (!currentQueue.length) currentQueue = null;			callback();		}	}).observe(node, { characterData: true });	return function (fn) {		callable(fn);		if (queue) {			if (typeof queue === 'function') queue = [queue, fn];			else queue.push(fn);			return;		}		queue = fn;		node.data = (i = ++i % 2);	};};module.exports = (function () {	// Node.js	if ((typeof process === 'object') && process && (typeof process.nextTick === 'function')) {		return process.nextTick;	}	// MutationObserver	if ((typeof document === 'object') && document) {		if (typeof MutationObserver === 'function') return byObserver(MutationObserver);		if (typeof WebKitMutationObserver === 'function') return byObserver(WebKitMutationObserver);	}	// W3C Draft	// http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html	if (typeof setImmediate === 'function') {		return function (cb) { setImmediate(callable(cb)); };	}	// Wide available standard	if ((typeof setTimeout === 'function') || (typeof setTimeout === 'object')) {		return function (cb) { setTimeout(callable(cb), 0); };	}	return null;}());
 |