'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; 
 |