| 'use strict'; | 
| var globalThis = require('../internals/global-this'); | 
| var safeGetBuiltIn = require('../internals/safe-get-built-in'); | 
| var bind = require('../internals/function-bind-context'); | 
| var macrotask = require('../internals/task').set; | 
| var Queue = require('../internals/queue'); | 
| var IS_IOS = require('../internals/environment-is-ios'); | 
| var IS_IOS_PEBBLE = require('../internals/environment-is-ios-pebble'); | 
| var IS_WEBOS_WEBKIT = require('../internals/environment-is-webos-webkit'); | 
| var IS_NODE = require('../internals/environment-is-node'); | 
|   | 
| var MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver; | 
| var document = globalThis.document; | 
| var process = globalThis.process; | 
| var Promise = globalThis.Promise; | 
| var microtask = safeGetBuiltIn('queueMicrotask'); | 
| var notify, toggle, node, promise, then; | 
|   | 
| // modern engines have queueMicrotask method | 
| if (!microtask) { | 
|   var queue = new Queue(); | 
|   | 
|   var flush = function () { | 
|     var parent, fn; | 
|     if (IS_NODE && (parent = process.domain)) parent.exit(); | 
|     while (fn = queue.get()) try { | 
|       fn(); | 
|     } catch (error) { | 
|       if (queue.head) notify(); | 
|       throw error; | 
|     } | 
|     if (parent) parent.enter(); | 
|   }; | 
|   | 
|   // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 | 
|   // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898 | 
|   if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { | 
|     toggle = true; | 
|     node = document.createTextNode(''); | 
|     new MutationObserver(flush).observe(node, { characterData: true }); | 
|     notify = function () { | 
|       node.data = toggle = !toggle; | 
|     }; | 
|   // environments with maybe non-completely correct, but existent Promise | 
|   } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) { | 
|     // Promise.resolve without an argument throws an error in LG WebOS 2 | 
|     promise = Promise.resolve(undefined); | 
|     // workaround of WebKit ~ iOS Safari 10.1 bug | 
|     promise.constructor = Promise; | 
|     then = bind(promise.then, promise); | 
|     notify = function () { | 
|       then(flush); | 
|     }; | 
|   // Node.js without promises | 
|   } else if (IS_NODE) { | 
|     notify = function () { | 
|       process.nextTick(flush); | 
|     }; | 
|   // for other environments - macrotask based on: | 
|   // - setImmediate | 
|   // - MessageChannel | 
|   // - window.postMessage | 
|   // - onreadystatechange | 
|   // - setTimeout | 
|   } else { | 
|     // `webpack` dev server bug on IE global methods - use bind(fn, global) | 
|     macrotask = bind(macrotask, globalThis); | 
|     notify = function () { | 
|       macrotask(flush); | 
|     }; | 
|   } | 
|   | 
|   microtask = function (fn) { | 
|     if (!queue.head) notify(); | 
|     queue.add(fn); | 
|   }; | 
| } | 
|   | 
| module.exports = microtask; |