'use strict'; 
 | 
var globalThis = require('../internals/global-this'); 
 | 
var apply = require('../internals/function-apply'); 
 | 
var bind = require('../internals/function-bind-context'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var hasOwn = require('../internals/has-own-property'); 
 | 
var fails = require('../internals/fails'); 
 | 
var html = require('../internals/html'); 
 | 
var arraySlice = require('../internals/array-slice'); 
 | 
var createElement = require('../internals/document-create-element'); 
 | 
var validateArgumentsLength = require('../internals/validate-arguments-length'); 
 | 
var IS_IOS = require('../internals/environment-is-ios'); 
 | 
var IS_NODE = require('../internals/environment-is-node'); 
 | 
  
 | 
var set = globalThis.setImmediate; 
 | 
var clear = globalThis.clearImmediate; 
 | 
var process = globalThis.process; 
 | 
var Dispatch = globalThis.Dispatch; 
 | 
var Function = globalThis.Function; 
 | 
var MessageChannel = globalThis.MessageChannel; 
 | 
var String = globalThis.String; 
 | 
var counter = 0; 
 | 
var queue = {}; 
 | 
var ONREADYSTATECHANGE = 'onreadystatechange'; 
 | 
var $location, defer, channel, port; 
 | 
  
 | 
fails(function () { 
 | 
  // Deno throws a ReferenceError on `location` access without `--location` flag 
 | 
  $location = globalThis.location; 
 | 
}); 
 | 
  
 | 
var run = function (id) { 
 | 
  if (hasOwn(queue, id)) { 
 | 
    var fn = queue[id]; 
 | 
    delete queue[id]; 
 | 
    fn(); 
 | 
  } 
 | 
}; 
 | 
  
 | 
var runner = function (id) { 
 | 
  return function () { 
 | 
    run(id); 
 | 
  }; 
 | 
}; 
 | 
  
 | 
var eventListener = function (event) { 
 | 
  run(event.data); 
 | 
}; 
 | 
  
 | 
var globalPostMessageDefer = function (id) { 
 | 
  // old engines have not location.origin 
 | 
  globalThis.postMessage(String(id), $location.protocol + '//' + $location.host); 
 | 
}; 
 | 
  
 | 
// Node.js 0.9+ & IE10+ has setImmediate, otherwise: 
 | 
if (!set || !clear) { 
 | 
  set = function setImmediate(handler) { 
 | 
    validateArgumentsLength(arguments.length, 1); 
 | 
    var fn = isCallable(handler) ? handler : Function(handler); 
 | 
    var args = arraySlice(arguments, 1); 
 | 
    queue[++counter] = function () { 
 | 
      apply(fn, undefined, args); 
 | 
    }; 
 | 
    defer(counter); 
 | 
    return counter; 
 | 
  }; 
 | 
  clear = function clearImmediate(id) { 
 | 
    delete queue[id]; 
 | 
  }; 
 | 
  // Node.js 0.8- 
 | 
  if (IS_NODE) { 
 | 
    defer = function (id) { 
 | 
      process.nextTick(runner(id)); 
 | 
    }; 
 | 
  // Sphere (JS game engine) Dispatch API 
 | 
  } else if (Dispatch && Dispatch.now) { 
 | 
    defer = function (id) { 
 | 
      Dispatch.now(runner(id)); 
 | 
    }; 
 | 
  // Browsers with MessageChannel, includes WebWorkers 
 | 
  // except iOS - https://github.com/zloirock/core-js/issues/624 
 | 
  } else if (MessageChannel && !IS_IOS) { 
 | 
    channel = new MessageChannel(); 
 | 
    port = channel.port2; 
 | 
    channel.port1.onmessage = eventListener; 
 | 
    defer = bind(port.postMessage, port); 
 | 
  // Browsers with postMessage, skip WebWorkers 
 | 
  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' 
 | 
  } else if ( 
 | 
    globalThis.addEventListener && 
 | 
    isCallable(globalThis.postMessage) && 
 | 
    !globalThis.importScripts && 
 | 
    $location && $location.protocol !== 'file:' && 
 | 
    !fails(globalPostMessageDefer) 
 | 
  ) { 
 | 
    defer = globalPostMessageDefer; 
 | 
    globalThis.addEventListener('message', eventListener, false); 
 | 
  // IE8- 
 | 
  } else if (ONREADYSTATECHANGE in createElement('script')) { 
 | 
    defer = function (id) { 
 | 
      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { 
 | 
        html.removeChild(this); 
 | 
        run(id); 
 | 
      }; 
 | 
    }; 
 | 
  // Rest old browsers 
 | 
  } else { 
 | 
    defer = function (id) { 
 | 
      setTimeout(runner(id), 0); 
 | 
    }; 
 | 
  } 
 | 
} 
 | 
  
 | 
module.exports = { 
 | 
  set: set, 
 | 
  clear: clear 
 | 
}; 
 |