text: 'use strict';
  
  Object.defineProperty(exports, '__esModule', {
    value: true
  });
  exports.default = queueRunner;
  
  var _PCancelable = _interopRequireDefault(require('./PCancelable'));
  
  var _pTimeout = _interopRequireDefault(require('./pTimeout'));
  
  function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : {default: obj};
  }
  
  var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
  var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
  var Promise = global[Symbol.for('jest-native-promise')] || global.Promise;
  
  function queueRunner(options) {
    const token = new _PCancelable.default((onCancel, resolve) => {
      onCancel(resolve);
    });
  
    const mapper = ({fn, timeout, initError = new Error()}) => {
      let promise = new Promise(resolve => {
        const next = function next(err) {
          if (err) {
            options.fail.apply(null, arguments);
          }
  
          resolve();
        };
  
        next.fail = function() {
          options.fail.apply(null, arguments);
          resolve();
        };
  
        try {
          fn.call(options.userContext, next);
        } catch (e) {
          options.onException(e);
          resolve();
        }
      });
      promise = Promise.race([promise, token]);
  
      if (!timeout) {
        return promise;
      }
  
      const timeoutMs = timeout();
      return (0, _pTimeout.default)(
        promise,
        timeoutMs,
        options.clearTimeout,
        options.setTimeout,
        () => {
          initError.message =
            'Timeout - Async callback was not invoked within the ' +
            timeoutMs +
            'ms timeout specified by jest.setTimeout.';
          initError.stack = initError.message + initError.stack;
          options.onException(initError);
        }
      );
    };
  
    const result = options.queueableFns.reduce(
      (promise, fn) => promise.then(() => mapper(fn)),
      Promise.resolve()
    );
    return {
      cancel: token.cancel.bind(token),
      catch: result.catch.bind(result),
      then: result.then.bind(result)
    };
  }
  