1 var global = require('./_global')
2 , macrotask = require('./_task').set
3 , Observer = global.MutationObserver || global.WebKitMutationObserver
4 , process = global.process
5 , Promise = global.Promise
6 , isNode = require('./_cof')(process) == 'process';
8 module.exports = function(){
9 var head, last, notify;
11 var flush = function(){
13 if(isNode && (parent = process.domain))parent.exit();
21 else last = undefined;
25 if(parent)parent.enter();
31 process.nextTick(flush);
33 // browsers with MutationObserver
36 , node = document.createTextNode('');
37 new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
39 node.data = toggle = !toggle;
41 // environments with maybe non-completely correct, but existent Promise
42 } else if(Promise && Promise.resolve){
43 var promise = Promise.resolve();
47 // for other environments - macrotask based on:
50 // - window.postMessag
51 // - onreadystatechange
55 // strange IE + webpack dev server bug - use .call(global)
56 macrotask.call(global, flush);
61 var task = {fn: fn, next: undefined};
62 if(last)last.next = task;