text: "use strict";
  
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  
  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  exports.add = add;
  exports.runAll = runAll;
  exports.removeAll = removeAll;
  exports.getSize = getSize;
  exports["default"] = void 0;
  
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  
  var _detectNode = _interopRequireDefault(require("detect-node"));
  
  var _browser = _interopRequireDefault(require("./browser.js"));
  
  var _node = _interopRequireDefault(require("./node.js"));
  
  var USE_METHOD = _detectNode["default"] ? _node["default"] : _browser["default"];
  var LISTENERS = new Set();
  var startedListening = false;
  
  function startListening() {
    if (startedListening) return;
    startedListening = true;
    USE_METHOD.add(runAll);
  }
  
  function add(fn) {
    startListening();
    if (typeof fn !== 'function') throw new Error('The "listener" argument must be of type Function. Received type ' + (0, _typeof2["default"])(fn));
    LISTENERS.add(fn);
    var addReturn = {
      remove: function remove() {
        return LISTENERS["delete"](fn);
      },
      run: function run() {
        LISTENERS["delete"](fn);
        return fn();
      }
    };
    return addReturn;
  }
  
  function runAll() {
    var promises = [];
    LISTENERS.forEach(function (fn) {
      promises.push(fn());
      LISTENERS["delete"](fn);
    });
    return Promise.all(promises);
  }
  
  function removeAll() {
    LISTENERS.clear();
  }
  
  function getSize() {
    return LISTENERS.size;
  }
  
  var _default = {
    add: add,
    runAll: runAll,
    removeAll: removeAll,
    getSize: getSize
  };
  exports["default"] = _default;