You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					2527 lines
				
				69 KiB
			
		
		
			
		
	
	
					2527 lines
				
				69 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * @overview RSVP - a tiny implementation of Promises/A+.
							 | 
						||
| 
								 | 
							
								 * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors
							 | 
						||
| 
								 | 
							
								 * @license   Licensed under MIT license
							 | 
						||
| 
								 | 
							
								 *            See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE
							 | 
						||
| 
								 | 
							
								 * @version   4.8.4+ff10049b
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function callbacksFor(object) {
							 | 
						||
| 
								 | 
							
								  var callbacks = object._promiseCallbacks;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!callbacks) {
							 | 
						||
| 
								 | 
							
								    callbacks = object._promiseCallbacks = {};
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return callbacks;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  @class EventTarget
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								var EventTarget = {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								    `EventTarget.mixin` extends an object with EventTarget methods. For
							 | 
						||
| 
								 | 
							
								    Example:
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    import EventTarget from 'rsvp';
							 | 
						||
| 
								 | 
							
								     let object = {};
							 | 
						||
| 
								 | 
							
								     EventTarget.mixin(object);
							 | 
						||
| 
								 | 
							
								     object.on('finished', function(event) {
							 | 
						||
| 
								 | 
							
								      // handle event
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								     object.trigger('finished', { detail: value });
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     `EventTarget.mixin` also works with prototypes:
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    import EventTarget from 'rsvp';
							 | 
						||
| 
								 | 
							
								     let Person = function() {};
							 | 
						||
| 
								 | 
							
								    EventTarget.mixin(Person.prototype);
							 | 
						||
| 
								 | 
							
								     let yehuda = new Person();
							 | 
						||
| 
								 | 
							
								    let tom = new Person();
							 | 
						||
| 
								 | 
							
								     yehuda.on('poke', function(event) {
							 | 
						||
| 
								 | 
							
								      console.log('Yehuda says OW');
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								     tom.on('poke', function(event) {
							 | 
						||
| 
								 | 
							
								      console.log('Tom says OW');
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								     yehuda.trigger('poke');
							 | 
						||
| 
								 | 
							
								    tom.trigger('poke');
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     @method mixin
							 | 
						||
| 
								 | 
							
								    @for rsvp
							 | 
						||
| 
								 | 
							
								    @private
							 | 
						||
| 
								 | 
							
								    @param {Object} object object to extend with EventTarget methods
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								  mixin: function (object) {
							 | 
						||
| 
								 | 
							
								    object.on = this.on;
							 | 
						||
| 
								 | 
							
								    object.off = this.off;
							 | 
						||
| 
								 | 
							
								    object.trigger = this.trigger;
							 | 
						||
| 
								 | 
							
								    object._promiseCallbacks = undefined;
							 | 
						||
| 
								 | 
							
								    return object;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								    Registers a callback to be executed when `eventName` is triggered
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    object.on('event', function(eventInfo){
							 | 
						||
| 
								 | 
							
								      // handle the event
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								     object.trigger('event');
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     @method on
							 | 
						||
| 
								 | 
							
								    @for EventTarget
							 | 
						||
| 
								 | 
							
								    @private
							 | 
						||
| 
								 | 
							
								    @param {String} eventName name of the event to listen for
							 | 
						||
| 
								 | 
							
								    @param {Function} callback function to be called when the event is triggered.
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								  on: function (eventName, callback) {
							 | 
						||
| 
								 | 
							
								    if (typeof callback !== 'function') {
							 | 
						||
| 
								 | 
							
								      throw new TypeError('Callback must be a function');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var allCallbacks = callbacksFor(this);
							 | 
						||
| 
								 | 
							
								    var callbacks = allCallbacks[eventName];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!callbacks) {
							 | 
						||
| 
								 | 
							
								      callbacks = allCallbacks[eventName] = [];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (callbacks.indexOf(callback) === -1) {
							 | 
						||
| 
								 | 
							
								      callbacks.push(callback);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								    You can use `off` to stop firing a particular callback for an event:
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    function doStuff() { // do stuff! }
							 | 
						||
| 
								 | 
							
								    object.on('stuff', doStuff);
							 | 
						||
| 
								 | 
							
								     object.trigger('stuff'); // doStuff will be called
							 | 
						||
| 
								 | 
							
								     // Unregister ONLY the doStuff callback
							 | 
						||
| 
								 | 
							
								    object.off('stuff', doStuff);
							 | 
						||
| 
								 | 
							
								    object.trigger('stuff'); // doStuff will NOT be called
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     If you don't pass a `callback` argument to `off`, ALL callbacks for the
							 | 
						||
| 
								 | 
							
								    event will not be executed when the event fires. For example:
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    let callback1 = function(){};
							 | 
						||
| 
								 | 
							
								    let callback2 = function(){};
							 | 
						||
| 
								 | 
							
								     object.on('stuff', callback1);
							 | 
						||
| 
								 | 
							
								    object.on('stuff', callback2);
							 | 
						||
| 
								 | 
							
								     object.trigger('stuff'); // callback1 and callback2 will be executed.
							 | 
						||
| 
								 | 
							
								     object.off('stuff');
							 | 
						||
| 
								 | 
							
								    object.trigger('stuff'); // callback1 and callback2 will not be executed!
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     @method off
							 | 
						||
| 
								 | 
							
								    @for rsvp
							 | 
						||
| 
								 | 
							
								    @private
							 | 
						||
| 
								 | 
							
								    @param {String} eventName event to stop listening to
							 | 
						||
| 
								 | 
							
								    @param {Function} [callback] optional argument. If given, only the function
							 | 
						||
| 
								 | 
							
								    given will be removed from the event's callback queue. If no `callback`
							 | 
						||
| 
								 | 
							
								    argument is given, all callbacks will be removed from the event's callback
							 | 
						||
| 
								 | 
							
								    queue.
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								  off: function (eventName, callback) {
							 | 
						||
| 
								 | 
							
								    var allCallbacks = callbacksFor(this);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!callback) {
							 | 
						||
| 
								 | 
							
								      allCallbacks[eventName] = [];
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var callbacks = allCallbacks[eventName];
							 | 
						||
| 
								 | 
							
								    var index = callbacks.indexOf(callback);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (index !== -1) {
							 | 
						||
| 
								 | 
							
								      callbacks.splice(index, 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								    Use `trigger` to fire custom events. For example:
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    object.on('foo', function(){
							 | 
						||
| 
								 | 
							
								      console.log('foo event happened!');
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    object.trigger('foo');
							 | 
						||
| 
								 | 
							
								    // 'foo event happened!' logged to the console
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     You can also pass a value as a second argument to `trigger` that will be
							 | 
						||
| 
								 | 
							
								    passed as an argument to all event listeners for the event:
							 | 
						||
| 
								 | 
							
								     ```javascript
							 | 
						||
| 
								 | 
							
								    object.on('foo', function(value){
							 | 
						||
| 
								 | 
							
								      console.log(value.name);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								     object.trigger('foo', { name: 'bar' });
							 | 
						||
| 
								 | 
							
								    // 'bar' logged to the console
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								     @method trigger
							 | 
						||
| 
								 | 
							
								    @for rsvp
							 | 
						||
| 
								 | 
							
								    @private
							 | 
						||
| 
								 | 
							
								    @param {String} eventName name of the event to be triggered
							 | 
						||
| 
								 | 
							
								    @param {*} [options] optional value to be passed to any event handlers for
							 | 
						||
| 
								 | 
							
								    the given `eventName`
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								  trigger: function (eventName, options, label) {
							 | 
						||
| 
								 | 
							
								    var allCallbacks = callbacksFor(this);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var callbacks = allCallbacks[eventName];
							 | 
						||
| 
								 | 
							
								    if (callbacks) {
							 | 
						||
| 
								 | 
							
								      // Don't cache the callbacks.length since it may grow
							 | 
						||
| 
								 | 
							
								      var callback = void 0;
							 | 
						||
| 
								 | 
							
								      for (var i = 0; i < callbacks.length; i++) {
							 | 
						||
| 
								 | 
							
								        callback = callbacks[i];
							 | 
						||
| 
								 | 
							
								        callback(options, label);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var config = {
							 | 
						||
| 
								 | 
							
								  instrument: false
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EventTarget['mixin'](config);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function configure(name, value) {
							 | 
						||
| 
								 | 
							
								  if (arguments.length === 2) {
							 | 
						||
| 
								 | 
							
								    config[name] = value;
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    return config[name];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var queue = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function scheduleFlush() {
							 | 
						||
| 
								 | 
							
								  setTimeout(function () {
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < queue.length; i++) {
							 | 
						||
| 
								 | 
							
								      var entry = queue[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var payload = entry.payload;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      payload.guid = payload.key + payload.id;
							 | 
						||
| 
								 | 
							
								      payload.childGuid = payload.key + payload.childId;
							 | 
						||
| 
								 | 
							
								      if (payload.error) {
							 | 
						||
| 
								 | 
							
								        payload.stack = payload.error.stack;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      config['trigger'](entry.name, entry.payload);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    queue.length = 0;
							 | 
						||
| 
								 | 
							
								  }, 50);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function instrument(eventName, promise, child) {
							 | 
						||
| 
								 | 
							
								  if (1 === queue.push({
							 | 
						||
| 
								 | 
							
								    name: eventName,
							 | 
						||
| 
								 | 
							
								    payload: {
							 | 
						||
| 
								 | 
							
								      key: promise._guidKey,
							 | 
						||
| 
								 | 
							
								      id: promise._id,
							 | 
						||
| 
								 | 
							
								      eventName: eventName,
							 | 
						||
| 
								 | 
							
								      detail: promise._result,
							 | 
						||
| 
								 | 
							
								      childId: child && child._id,
							 | 
						||
| 
								 | 
							
								      label: promise._label,
							 | 
						||
| 
								 | 
							
								      timeStamp: Date.now(),
							 | 
						||
| 
								 | 
							
								      error: config["instrument-with-stack"] ? new Error(promise._label) : null
							 | 
						||
| 
								 | 
							
								    } })) {
							 | 
						||
| 
								 | 
							
								    scheduleFlush();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `Promise.resolve` returns a promise that will become resolved with the
							 | 
						||
| 
								 | 
							
								  passed `value`. It is shorthand for the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    resolve(1);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise.then(function(value){
							 | 
						||
| 
								 | 
							
								    // value === 1
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Instead of writing the above, your code now simply becomes the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise = RSVP.Promise.resolve(1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise.then(function(value){
							 | 
						||
| 
								 | 
							
								    // value === 1
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method resolve
							 | 
						||
| 
								 | 
							
								  @for Promise
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @param {*} object value that the returned promise will be resolved with
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for identifying the returned promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} a promise that will become fulfilled with the given
							 | 
						||
| 
								 | 
							
								  `value`
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function resolve$$1(object, label) {
							 | 
						||
| 
								 | 
							
								  /*jshint validthis:true */
							 | 
						||
| 
								 | 
							
								  var Constructor = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (object && typeof object === 'object' && object.constructor === Constructor) {
							 | 
						||
| 
								 | 
							
								    return object;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var promise = new Constructor(noop, label);
							 | 
						||
| 
								 | 
							
								  resolve$1(promise, object);
							 | 
						||
| 
								 | 
							
								  return promise;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function withOwnPromise() {
							 | 
						||
| 
								 | 
							
								  return new TypeError('A promises callback cannot return that same promise.');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function objectOrFunction(x) {
							 | 
						||
| 
								 | 
							
								  var type = typeof x;
							 | 
						||
| 
								 | 
							
								  return x !== null && (type === 'object' || type === 'function');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function noop() {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var PENDING = void 0;
							 | 
						||
| 
								 | 
							
								var FULFILLED = 1;
							 | 
						||
| 
								 | 
							
								var REJECTED = 2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var TRY_CATCH_ERROR = { error: null };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getThen(promise) {
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    return promise.then;
							 | 
						||
| 
								 | 
							
								  } catch (error) {
							 | 
						||
| 
								 | 
							
								    TRY_CATCH_ERROR.error = error;
							 | 
						||
| 
								 | 
							
								    return TRY_CATCH_ERROR;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var tryCatchCallback = void 0;
							 | 
						||
| 
								 | 
							
								function tryCatcher() {
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    var target = tryCatchCallback;
							 | 
						||
| 
								 | 
							
								    tryCatchCallback = null;
							 | 
						||
| 
								 | 
							
								    return target.apply(this, arguments);
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    TRY_CATCH_ERROR.error = e;
							 | 
						||
| 
								 | 
							
								    return TRY_CATCH_ERROR;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function tryCatch(fn) {
							 | 
						||
| 
								 | 
							
								  tryCatchCallback = fn;
							 | 
						||
| 
								 | 
							
								  return tryCatcher;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function handleForeignThenable(promise, thenable, then$$1) {
							 | 
						||
| 
								 | 
							
								  config.async(function (promise) {
							 | 
						||
| 
								 | 
							
								    var sealed = false;
							 | 
						||
| 
								 | 
							
								    var result = tryCatch(then$$1).call(thenable, function (value) {
							 | 
						||
| 
								 | 
							
								      if (sealed) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      sealed = true;
							 | 
						||
| 
								 | 
							
								      if (thenable === value) {
							 | 
						||
| 
								 | 
							
								        fulfill(promise, value);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        resolve$1(promise, value);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }, function (reason) {
							 | 
						||
| 
								 | 
							
								      if (sealed) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      sealed = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      reject(promise, reason);
							 | 
						||
| 
								 | 
							
								    }, 'Settle: ' + (promise._label || ' unknown promise'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!sealed && result === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								      sealed = true;
							 | 
						||
| 
								 | 
							
								      var error = TRY_CATCH_ERROR.error;
							 | 
						||
| 
								 | 
							
								      TRY_CATCH_ERROR.error = null;
							 | 
						||
| 
								 | 
							
								      reject(promise, error);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, promise);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function handleOwnThenable(promise, thenable) {
							 | 
						||
| 
								 | 
							
								  if (thenable._state === FULFILLED) {
							 | 
						||
| 
								 | 
							
								    fulfill(promise, thenable._result);
							 | 
						||
| 
								 | 
							
								  } else if (thenable._state === REJECTED) {
							 | 
						||
| 
								 | 
							
								    thenable._onError = null;
							 | 
						||
| 
								 | 
							
								    reject(promise, thenable._result);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    subscribe(thenable, undefined, function (value) {
							 | 
						||
| 
								 | 
							
								      if (thenable === value) {
							 | 
						||
| 
								 | 
							
								        fulfill(promise, value);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        resolve$1(promise, value);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }, function (reason) {
							 | 
						||
| 
								 | 
							
								      return reject(promise, reason);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function handleMaybeThenable(promise, maybeThenable, then$$1) {
							 | 
						||
| 
								 | 
							
								  var isOwnThenable = maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$$1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (isOwnThenable) {
							 | 
						||
| 
								 | 
							
								    handleOwnThenable(promise, maybeThenable);
							 | 
						||
| 
								 | 
							
								  } else if (then$$1 === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								    var error = TRY_CATCH_ERROR.error;
							 | 
						||
| 
								 | 
							
								    TRY_CATCH_ERROR.error = null;
							 | 
						||
| 
								 | 
							
								    reject(promise, error);
							 | 
						||
| 
								 | 
							
								  } else if (typeof then$$1 === 'function') {
							 | 
						||
| 
								 | 
							
								    handleForeignThenable(promise, maybeThenable, then$$1);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    fulfill(promise, maybeThenable);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function resolve$1(promise, value) {
							 | 
						||
| 
								 | 
							
								  if (promise === value) {
							 | 
						||
| 
								 | 
							
								    fulfill(promise, value);
							 | 
						||
| 
								 | 
							
								  } else if (objectOrFunction(value)) {
							 | 
						||
| 
								 | 
							
								    handleMaybeThenable(promise, value, getThen(value));
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    fulfill(promise, value);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function publishRejection(promise) {
							 | 
						||
| 
								 | 
							
								  if (promise._onError) {
							 | 
						||
| 
								 | 
							
								    promise._onError(promise._result);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  publish(promise);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function fulfill(promise, value) {
							 | 
						||
| 
								 | 
							
								  if (promise._state !== PENDING) {
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise._result = value;
							 | 
						||
| 
								 | 
							
								  promise._state = FULFILLED;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (promise._subscribers.length === 0) {
							 | 
						||
| 
								 | 
							
								    if (config.instrument) {
							 | 
						||
| 
								 | 
							
								      instrument('fulfilled', promise);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    config.async(publish, promise);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function reject(promise, reason) {
							 | 
						||
| 
								 | 
							
								  if (promise._state !== PENDING) {
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  promise._state = REJECTED;
							 | 
						||
| 
								 | 
							
								  promise._result = reason;
							 | 
						||
| 
								 | 
							
								  config.async(publishRejection, promise);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function subscribe(parent, child, onFulfillment, onRejection) {
							 | 
						||
| 
								 | 
							
								  var subscribers = parent._subscribers;
							 | 
						||
| 
								 | 
							
								  var length = subscribers.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parent._onError = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  subscribers[length] = child;
							 | 
						||
| 
								 | 
							
								  subscribers[length + FULFILLED] = onFulfillment;
							 | 
						||
| 
								 | 
							
								  subscribers[length + REJECTED] = onRejection;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (length === 0 && parent._state) {
							 | 
						||
| 
								 | 
							
								    config.async(publish, parent);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function publish(promise) {
							 | 
						||
| 
								 | 
							
								  var subscribers = promise._subscribers;
							 | 
						||
| 
								 | 
							
								  var settled = promise._state;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (config.instrument) {
							 | 
						||
| 
								 | 
							
								    instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (subscribers.length === 0) {
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var child = void 0,
							 | 
						||
| 
								 | 
							
								      callback = void 0,
							 | 
						||
| 
								 | 
							
								      result = promise._result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < subscribers.length; i += 3) {
							 | 
						||
| 
								 | 
							
								    child = subscribers[i];
							 | 
						||
| 
								 | 
							
								    callback = subscribers[i + settled];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (child) {
							 | 
						||
| 
								 | 
							
								      invokeCallback(settled, child, callback, result);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      callback(result);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise._subscribers.length = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function invokeCallback(state, promise, callback, result) {
							 | 
						||
| 
								 | 
							
								  var hasCallback = typeof callback === 'function';
							 | 
						||
| 
								 | 
							
								  var value = void 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (hasCallback) {
							 | 
						||
| 
								 | 
							
								    value = tryCatch(callback)(result);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    value = result;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (promise._state !== PENDING) {
							 | 
						||
| 
								 | 
							
								    // noop
							 | 
						||
| 
								 | 
							
								  } else if (value === promise) {
							 | 
						||
| 
								 | 
							
								    reject(promise, withOwnPromise());
							 | 
						||
| 
								 | 
							
								  } else if (value === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								    var error = TRY_CATCH_ERROR.error;
							 | 
						||
| 
								 | 
							
								    TRY_CATCH_ERROR.error = null; // release
							 | 
						||
| 
								 | 
							
								    reject(promise, error);
							 | 
						||
| 
								 | 
							
								  } else if (hasCallback) {
							 | 
						||
| 
								 | 
							
								    resolve$1(promise, value);
							 | 
						||
| 
								 | 
							
								  } else if (state === FULFILLED) {
							 | 
						||
| 
								 | 
							
								    fulfill(promise, value);
							 | 
						||
| 
								 | 
							
								  } else if (state === REJECTED) {
							 | 
						||
| 
								 | 
							
								    reject(promise, value);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function initializePromise(promise, resolver) {
							 | 
						||
| 
								 | 
							
								  var resolved = false;
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    resolver(function (value) {
							 | 
						||
| 
								 | 
							
								      if (resolved) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      resolved = true;
							 | 
						||
| 
								 | 
							
								      resolve$1(promise, value);
							 | 
						||
| 
								 | 
							
								    }, function (reason) {
							 | 
						||
| 
								 | 
							
								      if (resolved) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      resolved = true;
							 | 
						||
| 
								 | 
							
								      reject(promise, reason);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    reject(promise, e);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function then(onFulfillment, onRejection, label) {
							 | 
						||
| 
								 | 
							
								  var parent = this;
							 | 
						||
| 
								 | 
							
								  var state = parent._state;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {
							 | 
						||
| 
								 | 
							
								    config.instrument && instrument('chained', parent, parent);
							 | 
						||
| 
								 | 
							
								    return parent;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parent._onError = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var child = new parent.constructor(noop, label);
							 | 
						||
| 
								 | 
							
								  var result = parent._result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  config.instrument && instrument('chained', parent, child);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (state === PENDING) {
							 | 
						||
| 
								 | 
							
								    subscribe(parent, child, onFulfillment, onRejection);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    var callback = state === FULFILLED ? onFulfillment : onRejection;
							 | 
						||
| 
								 | 
							
								    config.async(function () {
							 | 
						||
| 
								 | 
							
								      return invokeCallback(state, child, callback, result);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return child;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Enumerator = function () {
							 | 
						||
| 
								 | 
							
								  function Enumerator(Constructor, input, abortOnReject, label) {
							 | 
						||
| 
								 | 
							
								    this._instanceConstructor = Constructor;
							 | 
						||
| 
								 | 
							
								    this.promise = new Constructor(noop, label);
							 | 
						||
| 
								 | 
							
								    this._abortOnReject = abortOnReject;
							 | 
						||
| 
								 | 
							
								    this._isUsingOwnPromise = Constructor === Promise;
							 | 
						||
| 
								 | 
							
								    this._isUsingOwnResolve = Constructor.resolve === resolve$$1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._init.apply(this, arguments);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._init = function _init(Constructor, input) {
							 | 
						||
| 
								 | 
							
								    var len = input.length || 0;
							 | 
						||
| 
								 | 
							
								    this.length = len;
							 | 
						||
| 
								 | 
							
								    this._remaining = len;
							 | 
						||
| 
								 | 
							
								    this._result = new Array(len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._enumerate(input);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._enumerate = function _enumerate(input) {
							 | 
						||
| 
								 | 
							
								    var length = this.length;
							 | 
						||
| 
								 | 
							
								    var promise = this.promise;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (var i = 0; promise._state === PENDING && i < length; i++) {
							 | 
						||
| 
								 | 
							
								      this._eachEntry(input[i], i, true);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this._checkFullfillment();
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._checkFullfillment = function _checkFullfillment() {
							 | 
						||
| 
								 | 
							
								    if (this._remaining === 0) {
							 | 
						||
| 
								 | 
							
								      var result = this._result;
							 | 
						||
| 
								 | 
							
								      fulfill(this.promise, result);
							 | 
						||
| 
								 | 
							
								      this._result = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._settleMaybeThenable = function _settleMaybeThenable(entry, i, firstPass) {
							 | 
						||
| 
								 | 
							
								    var c = this._instanceConstructor;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this._isUsingOwnResolve) {
							 | 
						||
| 
								 | 
							
								      var then$$1 = getThen(entry);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (then$$1 === then && entry._state !== PENDING) {
							 | 
						||
| 
								 | 
							
								        entry._onError = null;
							 | 
						||
| 
								 | 
							
								        this._settledAt(entry._state, i, entry._result, firstPass);
							 | 
						||
| 
								 | 
							
								      } else if (typeof then$$1 !== 'function') {
							 | 
						||
| 
								 | 
							
								        this._settledAt(FULFILLED, i, entry, firstPass);
							 | 
						||
| 
								 | 
							
								      } else if (this._isUsingOwnPromise) {
							 | 
						||
| 
								 | 
							
								        var promise = new c(noop);
							 | 
						||
| 
								 | 
							
								        handleMaybeThenable(promise, entry, then$$1);
							 | 
						||
| 
								 | 
							
								        this._willSettleAt(promise, i, firstPass);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        this._willSettleAt(new c(function (resolve) {
							 | 
						||
| 
								 | 
							
								          return resolve(entry);
							 | 
						||
| 
								 | 
							
								        }), i, firstPass);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._willSettleAt(c.resolve(entry), i, firstPass);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._eachEntry = function _eachEntry(entry, i, firstPass) {
							 | 
						||
| 
								 | 
							
								    if (entry !== null && typeof entry === 'object') {
							 | 
						||
| 
								 | 
							
								      this._settleMaybeThenable(entry, i, firstPass);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._setResultAt(FULFILLED, i, entry, firstPass);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._settledAt = function _settledAt(state, i, value, firstPass) {
							 | 
						||
| 
								 | 
							
								    var promise = this.promise;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (promise._state === PENDING) {
							 | 
						||
| 
								 | 
							
								      if (this._abortOnReject && state === REJECTED) {
							 | 
						||
| 
								 | 
							
								        reject(promise, value);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        this._setResultAt(state, i, value, firstPass);
							 | 
						||
| 
								 | 
							
								        this._checkFullfillment();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {
							 | 
						||
| 
								 | 
							
								    this._remaining--;
							 | 
						||
| 
								 | 
							
								    this._result[i] = value;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i, firstPass) {
							 | 
						||
| 
								 | 
							
								    var _this = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    subscribe(promise, undefined, function (value) {
							 | 
						||
| 
								 | 
							
								      return _this._settledAt(FULFILLED, i, value, firstPass);
							 | 
						||
| 
								 | 
							
								    }, function (reason) {
							 | 
						||
| 
								 | 
							
								      return _this._settledAt(REJECTED, i, reason, firstPass);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Enumerator;
							 | 
						||
| 
								 | 
							
								}();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function setSettledResult(state, i, value) {
							 | 
						||
| 
								 | 
							
								  this._remaining--;
							 | 
						||
| 
								 | 
							
								  if (state === FULFILLED) {
							 | 
						||
| 
								 | 
							
								    this._result[i] = {
							 | 
						||
| 
								 | 
							
								      state: 'fulfilled',
							 | 
						||
| 
								 | 
							
								      value: value
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    this._result[i] = {
							 | 
						||
| 
								 | 
							
								      state: 'rejected',
							 | 
						||
| 
								 | 
							
								      reason: value
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `Promise.all` accepts an array of promises, and returns a new promise which
							 | 
						||
| 
								 | 
							
								  is fulfilled with an array of fulfillment values for the passed promises, or
							 | 
						||
| 
								 | 
							
								  rejected with the reason of the first passed promise to be rejected. It casts all
							 | 
						||
| 
								 | 
							
								  elements of the passed iterable to promises as it runs this algorithm.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise, { resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = resolve(1);
							 | 
						||
| 
								 | 
							
								  let promise2 = resolve(2);
							 | 
						||
| 
								 | 
							
								  let promise3 = resolve(3);
							 | 
						||
| 
								 | 
							
								  let promises = [ promise1, promise2, promise3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.all(promises).then(function(array){
							 | 
						||
| 
								 | 
							
								    // The array here would be [ 1, 2, 3 ];
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If any of the `promises` given to `RSVP.all` are rejected, the first promise
							 | 
						||
| 
								 | 
							
								  that is rejected will be given as an argument to the returned promises's
							 | 
						||
| 
								 | 
							
								  rejection handler. For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise, { resolve, reject } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = resolve(1);
							 | 
						||
| 
								 | 
							
								  let promise2 = reject(new Error("2"));
							 | 
						||
| 
								 | 
							
								  let promise3 = reject(new Error("3"));
							 | 
						||
| 
								 | 
							
								  let promises = [ promise1, promise2, promise3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.all(promises).then(function(array){
							 | 
						||
| 
								 | 
							
								    // Code here never runs because there are rejected promises!
							 | 
						||
| 
								 | 
							
								  }, function(error) {
							 | 
						||
| 
								 | 
							
								    // error.message === "2"
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method all
							 | 
						||
| 
								 | 
							
								  @for Promise
							 | 
						||
| 
								 | 
							
								  @param {Array} entries array of promises
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} promise that is fulfilled when all `promises` have been
							 | 
						||
| 
								 | 
							
								  fulfilled, or rejected if any of them become rejected.
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function all(entries, label) {
							 | 
						||
| 
								 | 
							
								  if (!Array.isArray(entries)) {
							 | 
						||
| 
								 | 
							
								    return this.reject(new TypeError("Promise.all must be called with an array"), label);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return new Enumerator(this, entries, true /* abort on reject */, label).promise;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `Promise.race` returns a new promise which is settled in the same way as the
							 | 
						||
| 
								 | 
							
								  first passed promise to settle.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    setTimeout(function(){
							 | 
						||
| 
								 | 
							
								      resolve('promise 1');
							 | 
						||
| 
								 | 
							
								    }, 200);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise2 = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    setTimeout(function(){
							 | 
						||
| 
								 | 
							
								      resolve('promise 2');
							 | 
						||
| 
								 | 
							
								    }, 100);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.race([promise1, promise2]).then(function(result){
							 | 
						||
| 
								 | 
							
								    // result === 'promise 2' because it was resolved before promise1
							 | 
						||
| 
								 | 
							
								    // was resolved.
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  `Promise.race` is deterministic in that only the state of the first
							 | 
						||
| 
								 | 
							
								  settled promise matters. For example, even if other promises given to the
							 | 
						||
| 
								 | 
							
								  `promises` array argument are resolved, but the first settled promise has
							 | 
						||
| 
								 | 
							
								  become rejected before the other promises became fulfilled, the returned
							 | 
						||
| 
								 | 
							
								  promise will become rejected:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    setTimeout(function(){
							 | 
						||
| 
								 | 
							
								      resolve('promise 1');
							 | 
						||
| 
								 | 
							
								    }, 200);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise2 = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    setTimeout(function(){
							 | 
						||
| 
								 | 
							
								      reject(new Error('promise 2'));
							 | 
						||
| 
								 | 
							
								    }, 100);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.race([promise1, promise2]).then(function(result){
							 | 
						||
| 
								 | 
							
								    // Code here never runs
							 | 
						||
| 
								 | 
							
								  }, function(reason){
							 | 
						||
| 
								 | 
							
								    // reason.message === 'promise 2' because promise 2 became rejected before
							 | 
						||
| 
								 | 
							
								    // promise 1 became fulfilled
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  An example real-world use case is implementing timeouts:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.race([ajax('foo.json'), timeout(5000)])
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method race
							 | 
						||
| 
								 | 
							
								  @for Promise
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @param {Array} entries array of promises to observe
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for describing the promise returned.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} a promise which settles in the same way as the first passed
							 | 
						||
| 
								 | 
							
								  promise to settle.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function race(entries, label) {
							 | 
						||
| 
								 | 
							
								  /*jshint validthis:true */
							 | 
						||
| 
								 | 
							
								  var Constructor = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var promise = new Constructor(noop, label);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!Array.isArray(entries)) {
							 | 
						||
| 
								 | 
							
								    reject(promise, new TypeError('Promise.race must be called with an array'));
							 | 
						||
| 
								 | 
							
								    return promise;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var i = 0; promise._state === PENDING && i < entries.length; i++) {
							 | 
						||
| 
								 | 
							
								    subscribe(Constructor.resolve(entries[i]), undefined, function (value) {
							 | 
						||
| 
								 | 
							
								      return resolve$1(promise, value);
							 | 
						||
| 
								 | 
							
								    }, function (reason) {
							 | 
						||
| 
								 | 
							
								      return reject(promise, reason);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return promise;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `Promise.reject` returns a promise rejected with the passed `reason`.
							 | 
						||
| 
								 | 
							
								  It is shorthand for the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    reject(new Error('WHOOPS'));
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise.then(function(value){
							 | 
						||
| 
								 | 
							
								    // Code here doesn't run because the promise is rejected!
							 | 
						||
| 
								 | 
							
								  }, function(reason){
							 | 
						||
| 
								 | 
							
								    // reason.message === 'WHOOPS'
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Instead of writing the above, your code now simply becomes the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise = Promise.reject(new Error('WHOOPS'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise.then(function(value){
							 | 
						||
| 
								 | 
							
								    // Code here doesn't run because the promise is rejected!
							 | 
						||
| 
								 | 
							
								  }, function(reason){
							 | 
						||
| 
								 | 
							
								    // reason.message === 'WHOOPS'
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method reject
							 | 
						||
| 
								 | 
							
								  @for Promise
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @param {*} reason value that the returned promise will be rejected with.
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for identifying the returned promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} a promise rejected with the given `reason`.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function reject$1(reason, label) {
							 | 
						||
| 
								 | 
							
								  /*jshint validthis:true */
							 | 
						||
| 
								 | 
							
								  var Constructor = this;
							 | 
						||
| 
								 | 
							
								  var promise = new Constructor(noop, label);
							 | 
						||
| 
								 | 
							
								  reject(promise, reason);
							 | 
						||
| 
								 | 
							
								  return promise;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var guidKey = 'rsvp_' + Date.now() + '-';
							 | 
						||
| 
								 | 
							
								var counter = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function needsResolver() {
							 | 
						||
| 
								 | 
							
								  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function needsNew() {
							 | 
						||
| 
								 | 
							
								  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  Promise objects represent the eventual result of an asynchronous operation. The
							 | 
						||
| 
								 | 
							
								  primary way of interacting with a promise is through its `then` method, which
							 | 
						||
| 
								 | 
							
								  registers callbacks to receive either a promise’s eventual value or the reason
							 | 
						||
| 
								 | 
							
								  why the promise cannot be fulfilled.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Terminology
							 | 
						||
| 
								 | 
							
								  -----------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
							 | 
						||
| 
								 | 
							
								  - `thenable` is an object or function that defines a `then` method.
							 | 
						||
| 
								 | 
							
								  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
							 | 
						||
| 
								 | 
							
								  - `exception` is a value that is thrown using the throw statement.
							 | 
						||
| 
								 | 
							
								  - `reason` is a value that indicates why a promise was rejected.
							 | 
						||
| 
								 | 
							
								  - `settled` the final resting state of a promise, fulfilled or rejected.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  A promise can be in one of three states: pending, fulfilled, or rejected.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promises that are fulfilled have a fulfillment value and are in the fulfilled
							 | 
						||
| 
								 | 
							
								  state.  Promises that are rejected have a rejection reason and are in the
							 | 
						||
| 
								 | 
							
								  rejected state.  A fulfillment value is never a thenable.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promises can also be said to *resolve* a value.  If this value is also a
							 | 
						||
| 
								 | 
							
								  promise, then the original promise's settled state will match the value's
							 | 
						||
| 
								 | 
							
								  settled state.  So a promise that *resolves* a promise that rejects will
							 | 
						||
| 
								 | 
							
								  itself reject, and a promise that *resolves* a promise that fulfills will
							 | 
						||
| 
								 | 
							
								  itself fulfill.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Basic Usage:
							 | 
						||
| 
								 | 
							
								  ------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  let promise = new Promise(function(resolve, reject) {
							 | 
						||
| 
								 | 
							
								    // on success
							 | 
						||
| 
								 | 
							
								    resolve(value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // on failure
							 | 
						||
| 
								 | 
							
								    reject(reason);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise.then(function(value) {
							 | 
						||
| 
								 | 
							
								    // on fulfillment
							 | 
						||
| 
								 | 
							
								  }, function(reason) {
							 | 
						||
| 
								 | 
							
								    // on rejection
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Advanced Usage:
							 | 
						||
| 
								 | 
							
								  ---------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promises shine when abstracting away asynchronous interactions such as
							 | 
						||
| 
								 | 
							
								  `XMLHttpRequest`s.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  function getJSON(url) {
							 | 
						||
| 
								 | 
							
								    return new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								      let xhr = new XMLHttpRequest();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      xhr.open('GET', url);
							 | 
						||
| 
								 | 
							
								      xhr.onreadystatechange = handler;
							 | 
						||
| 
								 | 
							
								      xhr.responseType = 'json';
							 | 
						||
| 
								 | 
							
								      xhr.setRequestHeader('Accept', 'application/json');
							 | 
						||
| 
								 | 
							
								      xhr.send();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      function handler() {
							 | 
						||
| 
								 | 
							
								        if (this.readyState === this.DONE) {
							 | 
						||
| 
								 | 
							
								          if (this.status === 200) {
							 | 
						||
| 
								 | 
							
								            resolve(this.response);
							 | 
						||
| 
								 | 
							
								          } else {
							 | 
						||
| 
								 | 
							
								            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  getJSON('/posts.json').then(function(json) {
							 | 
						||
| 
								 | 
							
								    // on fulfillment
							 | 
						||
| 
								 | 
							
								  }, function(reason) {
							 | 
						||
| 
								 | 
							
								    // on rejection
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Unlike callbacks, promises are great composable primitives.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  Promise.all([
							 | 
						||
| 
								 | 
							
								    getJSON('/posts'),
							 | 
						||
| 
								 | 
							
								    getJSON('/comments')
							 | 
						||
| 
								 | 
							
								  ]).then(function(values){
							 | 
						||
| 
								 | 
							
								    values[0] // => postsJSON
							 | 
						||
| 
								 | 
							
								    values[1] // => commentsJSON
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return values;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @class Promise
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @param {function} resolver
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @constructor
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Promise = function () {
							 | 
						||
| 
								 | 
							
								  function Promise(resolver, label) {
							 | 
						||
| 
								 | 
							
								    this._id = counter++;
							 | 
						||
| 
								 | 
							
								    this._label = label;
							 | 
						||
| 
								 | 
							
								    this._state = undefined;
							 | 
						||
| 
								 | 
							
								    this._result = undefined;
							 | 
						||
| 
								 | 
							
								    this._subscribers = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    config.instrument && instrument('created', this);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (noop !== resolver) {
							 | 
						||
| 
								 | 
							
								      typeof resolver !== 'function' && needsResolver();
							 | 
						||
| 
								 | 
							
								      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.prototype._onError = function _onError(reason) {
							 | 
						||
| 
								 | 
							
								    var _this = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    config.after(function () {
							 | 
						||
| 
								 | 
							
								      if (_this._onError) {
							 | 
						||
| 
								 | 
							
								        config.trigger('error', reason, _this._label);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
							 | 
						||
| 
								 | 
							
								    as the catch block of a try/catch statement.
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    ```js
							 | 
						||
| 
								 | 
							
								    function findAuthor(){
							 | 
						||
| 
								 | 
							
								      throw new Error('couldn\'t find that author');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    // synchronous
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      findAuthor();
							 | 
						||
| 
								 | 
							
								    } catch(reason) {
							 | 
						||
| 
								 | 
							
								      // something went wrong
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    // async with promises
							 | 
						||
| 
								 | 
							
								    findAuthor().catch(function(reason){
							 | 
						||
| 
								 | 
							
								      // something went wrong
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    @method catch
							 | 
						||
| 
								 | 
							
								    @param {Function} onRejection
							 | 
						||
| 
								 | 
							
								    @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								    Useful for tooling.
							 | 
						||
| 
								 | 
							
								    @return {Promise}
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.prototype.catch = function _catch(onRejection, label) {
							 | 
						||
| 
								 | 
							
								    return this.then(undefined, onRejection, label);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								    `finally` will be invoked regardless of the promise's fate just as native
							 | 
						||
| 
								 | 
							
								    try/catch/finally behaves
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    Synchronous example:
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    ```js
							 | 
						||
| 
								 | 
							
								    findAuthor() {
							 | 
						||
| 
								 | 
							
								      if (Math.random() > 0.5) {
							 | 
						||
| 
								 | 
							
								        throw new Error();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return new Author();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      return findAuthor(); // succeed or fail
							 | 
						||
| 
								 | 
							
								    } catch(error) {
							 | 
						||
| 
								 | 
							
								      return findOtherAuthor();
							 | 
						||
| 
								 | 
							
								    } finally {
							 | 
						||
| 
								 | 
							
								      // always runs
							 | 
						||
| 
								 | 
							
								      // doesn't affect the return value
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    Asynchronous example:
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    ```js
							 | 
						||
| 
								 | 
							
								    findAuthor().catch(function(reason){
							 | 
						||
| 
								 | 
							
								      return findOtherAuthor();
							 | 
						||
| 
								 | 
							
								    }).finally(function(){
							 | 
						||
| 
								 | 
							
								      // author was either found, or not
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    @method finally
							 | 
						||
| 
								 | 
							
								    @param {Function} callback
							 | 
						||
| 
								 | 
							
								    @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								    Useful for tooling.
							 | 
						||
| 
								 | 
							
								    @return {Promise}
							 | 
						||
| 
								 | 
							
								  */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise.prototype.finally = function _finally(callback, label) {
							 | 
						||
| 
								 | 
							
								    var promise = this;
							 | 
						||
| 
								 | 
							
								    var constructor = promise.constructor;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (typeof callback === 'function') {
							 | 
						||
| 
								 | 
							
								      return promise.then(function (value) {
							 | 
						||
| 
								 | 
							
								        return constructor.resolve(callback()).then(function () {
							 | 
						||
| 
								 | 
							
								          return value;
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      }, function (reason) {
							 | 
						||
| 
								 | 
							
								        return constructor.resolve(callback()).then(function () {
							 | 
						||
| 
								 | 
							
								          throw reason;
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return promise.then(callback, callback);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Promise;
							 | 
						||
| 
								 | 
							
								}();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Promise.cast = resolve$$1; // deprecated
							 | 
						||
| 
								 | 
							
								Promise.all = all;
							 | 
						||
| 
								 | 
							
								Promise.race = race;
							 | 
						||
| 
								 | 
							
								Promise.resolve = resolve$$1;
							 | 
						||
| 
								 | 
							
								Promise.reject = reject$1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Promise.prototype._guidKey = guidKey;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  The primary way of interacting with a promise is through its `then` method,
							 | 
						||
| 
								 | 
							
								  which registers callbacks to receive either a promise's eventual value or the
							 | 
						||
| 
								 | 
							
								  reason why the promise cannot be fulfilled.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  findUser().then(function(user){
							 | 
						||
| 
								 | 
							
								    // user is available
							 | 
						||
| 
								 | 
							
								  }, function(reason){
							 | 
						||
| 
								 | 
							
								    // user is unavailable, and you are given the reason why
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Chaining
							 | 
						||
| 
								 | 
							
								  --------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The return value of `then` is itself a promise.  This second, 'downstream'
							 | 
						||
| 
								 | 
							
								  promise is resolved with the return value of the first promise's fulfillment
							 | 
						||
| 
								 | 
							
								  or rejection handler, or rejected if the handler throws an exception.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  findUser().then(function (user) {
							 | 
						||
| 
								 | 
							
								    return user.name;
							 | 
						||
| 
								 | 
							
								  }, function (reason) {
							 | 
						||
| 
								 | 
							
								    return 'default name';
							 | 
						||
| 
								 | 
							
								  }).then(function (userName) {
							 | 
						||
| 
								 | 
							
								    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
							 | 
						||
| 
								 | 
							
								    // will be `'default name'`
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  findUser().then(function (user) {
							 | 
						||
| 
								 | 
							
								    throw new Error('Found user, but still unhappy');
							 | 
						||
| 
								 | 
							
								  }, function (reason) {
							 | 
						||
| 
								 | 
							
								    throw new Error('`findUser` rejected and we\'re unhappy');
							 | 
						||
| 
								 | 
							
								  }).then(function (value) {
							 | 
						||
| 
								 | 
							
								    // never reached
							 | 
						||
| 
								 | 
							
								  }, function (reason) {
							 | 
						||
| 
								 | 
							
								    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
							 | 
						||
| 
								 | 
							
								    // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'.
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  findUser().then(function (user) {
							 | 
						||
| 
								 | 
							
								    throw new PedagogicalException('Upstream error');
							 | 
						||
| 
								 | 
							
								  }).then(function (value) {
							 | 
						||
| 
								 | 
							
								    // never reached
							 | 
						||
| 
								 | 
							
								  }).then(function (value) {
							 | 
						||
| 
								 | 
							
								    // never reached
							 | 
						||
| 
								 | 
							
								  }, function (reason) {
							 | 
						||
| 
								 | 
							
								    // The `PedgagocialException` is propagated all the way down to here
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Assimilation
							 | 
						||
| 
								 | 
							
								  ------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Sometimes the value you want to propagate to a downstream promise can only be
							 | 
						||
| 
								 | 
							
								  retrieved asynchronously. This can be achieved by returning a promise in the
							 | 
						||
| 
								 | 
							
								  fulfillment or rejection handler. The downstream promise will then be pending
							 | 
						||
| 
								 | 
							
								  until the returned promise is settled. This is called *assimilation*.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  findUser().then(function (user) {
							 | 
						||
| 
								 | 
							
								    return findCommentsByAuthor(user);
							 | 
						||
| 
								 | 
							
								  }).then(function (comments) {
							 | 
						||
| 
								 | 
							
								    // The user's comments are now available
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If the assimliated promise rejects, then the downstream promise will also reject.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  findUser().then(function (user) {
							 | 
						||
| 
								 | 
							
								    return findCommentsByAuthor(user);
							 | 
						||
| 
								 | 
							
								  }).then(function (comments) {
							 | 
						||
| 
								 | 
							
								    // If `findCommentsByAuthor` fulfills, we'll have the value here
							 | 
						||
| 
								 | 
							
								  }, function (reason) {
							 | 
						||
| 
								 | 
							
								    // If `findCommentsByAuthor` rejects, we'll have the reason here
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Simple Example
							 | 
						||
| 
								 | 
							
								  --------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Synchronous Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    result = findResult();
							 | 
						||
| 
								 | 
							
								    // success
							 | 
						||
| 
								 | 
							
								  } catch(reason) {
							 | 
						||
| 
								 | 
							
								    // failure
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Errback Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								  findResult(function(result, err){
							 | 
						||
| 
								 | 
							
								    if (err) {
							 | 
						||
| 
								 | 
							
								      // failure
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      // success
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise Example;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  findResult().then(function(result){
							 | 
						||
| 
								 | 
							
								    // success
							 | 
						||
| 
								 | 
							
								  }, function(reason){
							 | 
						||
| 
								 | 
							
								    // failure
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Advanced Example
							 | 
						||
| 
								 | 
							
								  --------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Synchronous Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let author, books;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    author = findAuthor();
							 | 
						||
| 
								 | 
							
								    books  = findBooksByAuthor(author);
							 | 
						||
| 
								 | 
							
								    // success
							 | 
						||
| 
								 | 
							
								  } catch(reason) {
							 | 
						||
| 
								 | 
							
								    // failure
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Errback Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```js
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function foundBooks(books) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function failure(reason) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  findAuthor(function(author, err){
							 | 
						||
| 
								 | 
							
								    if (err) {
							 | 
						||
| 
								 | 
							
								      failure(err);
							 | 
						||
| 
								 | 
							
								      // failure
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      try {
							 | 
						||
| 
								 | 
							
								        findBoooksByAuthor(author, function(books, err) {
							 | 
						||
| 
								 | 
							
								          if (err) {
							 | 
						||
| 
								 | 
							
								            failure(err);
							 | 
						||
| 
								 | 
							
								          } else {
							 | 
						||
| 
								 | 
							
								            try {
							 | 
						||
| 
								 | 
							
								              foundBooks(books);
							 | 
						||
| 
								 | 
							
								            } catch(reason) {
							 | 
						||
| 
								 | 
							
								              failure(reason);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      } catch(error) {
							 | 
						||
| 
								 | 
							
								        failure(err);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      // success
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promise Example;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  findAuthor().
							 | 
						||
| 
								 | 
							
								    then(findBooksByAuthor).
							 | 
						||
| 
								 | 
							
								    then(function(books){
							 | 
						||
| 
								 | 
							
								      // found books
							 | 
						||
| 
								 | 
							
								  }).catch(function(reason){
							 | 
						||
| 
								 | 
							
								    // something went wrong
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method then
							 | 
						||
| 
								 | 
							
								  @param {Function} onFulfillment
							 | 
						||
| 
								 | 
							
								  @param {Function} onRejection
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise}
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								Promise.prototype.then = then;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function makeObject(_, argumentNames) {
							 | 
						||
| 
								 | 
							
								  var obj = {};
							 | 
						||
| 
								 | 
							
								  var length = _.length;
							 | 
						||
| 
								 | 
							
								  var args = new Array(length);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var x = 0; x < length; x++) {
							 | 
						||
| 
								 | 
							
								    args[x] = _[x];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < argumentNames.length; i++) {
							 | 
						||
| 
								 | 
							
								    var name = argumentNames[i];
							 | 
						||
| 
								 | 
							
								    obj[name] = args[i + 1];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return obj;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function arrayResult(_) {
							 | 
						||
| 
								 | 
							
								  var length = _.length;
							 | 
						||
| 
								 | 
							
								  var args = new Array(length - 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var i = 1; i < length; i++) {
							 | 
						||
| 
								 | 
							
								    args[i - 1] = _[i];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return args;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function wrapThenable(then, promise) {
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    then: function (onFulFillment, onRejection) {
							 | 
						||
| 
								 | 
							
								      return then.call(promise, onFulFillment, onRejection);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `denodeify` takes a 'node-style' function and returns a function that
							 | 
						||
| 
								 | 
							
								  will return an `Promise`. You can use `denodeify` in Node.js or the
							 | 
						||
| 
								 | 
							
								  browser when you'd prefer to use promises over using callbacks. For example,
							 | 
						||
| 
								 | 
							
								  `denodeify` transforms the following:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let fs = require('fs');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fs.readFile('myfile.txt', function(err, data){
							 | 
						||
| 
								 | 
							
								    if (err) return handleError(err);
							 | 
						||
| 
								 | 
							
								    handleData(data);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  into:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let fs = require('fs');
							 | 
						||
| 
								 | 
							
								  let readFile = denodeify(fs.readFile);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  readFile('myfile.txt').then(handleData, handleError);
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If the node function has multiple success parameters, then `denodeify`
							 | 
						||
| 
								 | 
							
								  just returns the first one:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let request = denodeify(require('request'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  request('http://example.com').then(function(res) {
							 | 
						||
| 
								 | 
							
								    // ...
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  However, if you need all success parameters, setting `denodeify`'s
							 | 
						||
| 
								 | 
							
								  second parameter to `true` causes it to return all success parameters
							 | 
						||
| 
								 | 
							
								  as an array:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let request = denodeify(require('request'), true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  request('http://example.com').then(function(result) {
							 | 
						||
| 
								 | 
							
								    // result[0] -> res
							 | 
						||
| 
								 | 
							
								    // result[1] -> body
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Or if you pass it an array with names it returns the parameters as a hash:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let request = denodeify(require('request'), ['res', 'body']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  request('http://example.com').then(function(result) {
							 | 
						||
| 
								 | 
							
								    // result.res
							 | 
						||
| 
								 | 
							
								    // result.body
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Sometimes you need to retain the `this`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let app = require('express')();
							 | 
						||
| 
								 | 
							
								  let render = denodeify(app.render.bind(app));
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The denodified function inherits from the original function. It works in all
							 | 
						||
| 
								 | 
							
								  environments, except IE 10 and below. Consequently all properties of the original
							 | 
						||
| 
								 | 
							
								  function are available to you. However, any properties you change on the
							 | 
						||
| 
								 | 
							
								  denodeified function won't be changed on the original function. Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let request = denodeify(require('request')),
							 | 
						||
| 
								 | 
							
								      cookieJar = request.jar(); // <- Inheritance is used here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  request('http://example.com', {jar: cookieJar}).then(function(res) {
							 | 
						||
| 
								 | 
							
								    // cookieJar.cookies holds now the cookies returned by example.com
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Using `denodeify` makes it easier to compose asynchronous operations instead
							 | 
						||
| 
								 | 
							
								  of using callbacks. For example, instead of:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let fs = require('fs');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fs.readFile('myfile.txt', function(err, data){
							 | 
						||
| 
								 | 
							
								    if (err) { ... } // Handle error
							 | 
						||
| 
								 | 
							
								    fs.writeFile('myfile2.txt', data, function(err){
							 | 
						||
| 
								 | 
							
								      if (err) { ... } // Handle error
							 | 
						||
| 
								 | 
							
								      console.log('done')
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  you can chain the operations together using `then` from the returned promise:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let fs = require('fs');
							 | 
						||
| 
								 | 
							
								  let readFile = denodeify(fs.readFile);
							 | 
						||
| 
								 | 
							
								  let writeFile = denodeify(fs.writeFile);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  readFile('myfile.txt').then(function(data){
							 | 
						||
| 
								 | 
							
								    return writeFile('myfile2.txt', data);
							 | 
						||
| 
								 | 
							
								  }).then(function(){
							 | 
						||
| 
								 | 
							
								    console.log('done')
							 | 
						||
| 
								 | 
							
								  }).catch(function(error){
							 | 
						||
| 
								 | 
							
								    // Handle error
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method denodeify
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Function} nodeFunc a 'node-style' function that takes a callback as
							 | 
						||
| 
								 | 
							
								  its last argument. The callback expects an error to be passed as its first
							 | 
						||
| 
								 | 
							
								  argument (if an error occurred, otherwise null), and the value from the
							 | 
						||
| 
								 | 
							
								  operation as its second argument ('function(err, value){ }').
							 | 
						||
| 
								 | 
							
								  @param {Boolean|Array} [options] An optional paramter that if set
							 | 
						||
| 
								 | 
							
								  to `true` causes the promise to fulfill with the callback's success arguments
							 | 
						||
| 
								 | 
							
								  as an array. This is useful if the node function has multiple success
							 | 
						||
| 
								 | 
							
								  paramters. If you set this paramter to an array with names, the promise will
							 | 
						||
| 
								 | 
							
								  fulfill with a hash with these names as keys and the success parameters as
							 | 
						||
| 
								 | 
							
								  values.
							 | 
						||
| 
								 | 
							
								  @return {Function} a function that wraps `nodeFunc` to return a `Promise`
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function denodeify(nodeFunc, options) {
							 | 
						||
| 
								 | 
							
								  var fn = function () {
							 | 
						||
| 
								 | 
							
								    var l = arguments.length;
							 | 
						||
| 
								 | 
							
								    var args = new Array(l + 1);
							 | 
						||
| 
								 | 
							
								    var promiseInput = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < l; ++i) {
							 | 
						||
| 
								 | 
							
								      var arg = arguments[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (!promiseInput) {
							 | 
						||
| 
								 | 
							
								        // TODO: clean this up
							 | 
						||
| 
								 | 
							
								        promiseInput = needsPromiseInput(arg);
							 | 
						||
| 
								 | 
							
								        if (promiseInput === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								          var error = TRY_CATCH_ERROR.error;
							 | 
						||
| 
								 | 
							
								          TRY_CATCH_ERROR.error = null;
							 | 
						||
| 
								 | 
							
								          var p = new Promise(noop);
							 | 
						||
| 
								 | 
							
								          reject(p, error);
							 | 
						||
| 
								 | 
							
								          return p;
							 | 
						||
| 
								 | 
							
								        } else if (promiseInput && promiseInput !== true) {
							 | 
						||
| 
								 | 
							
								          arg = wrapThenable(promiseInput, arg);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      args[i] = arg;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var promise = new Promise(noop);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    args[l] = function (err, val) {
							 | 
						||
| 
								 | 
							
								      if (err) {
							 | 
						||
| 
								 | 
							
								        reject(promise, err);
							 | 
						||
| 
								 | 
							
								      } else if (options === undefined) {
							 | 
						||
| 
								 | 
							
								        resolve$1(promise, val);
							 | 
						||
| 
								 | 
							
								      } else if (options === true) {
							 | 
						||
| 
								 | 
							
								        resolve$1(promise, arrayResult(arguments));
							 | 
						||
| 
								 | 
							
								      } else if (Array.isArray(options)) {
							 | 
						||
| 
								 | 
							
								        resolve$1(promise, makeObject(arguments, options));
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        resolve$1(promise, val);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (promiseInput) {
							 | 
						||
| 
								 | 
							
								      return handlePromiseInput(promise, args, nodeFunc, this);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return handleValueInput(promise, args, nodeFunc, this);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fn.__proto__ = nodeFunc;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return fn;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function handleValueInput(promise, args, nodeFunc, self) {
							 | 
						||
| 
								 | 
							
								  var result = tryCatch(nodeFunc).apply(self, args);
							 | 
						||
| 
								 | 
							
								  if (result === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								    var error = TRY_CATCH_ERROR.error;
							 | 
						||
| 
								 | 
							
								    TRY_CATCH_ERROR.error = null;
							 | 
						||
| 
								 | 
							
								    reject(promise, error);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return promise;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function handlePromiseInput(promise, args, nodeFunc, self) {
							 | 
						||
| 
								 | 
							
								  return Promise.all(args).then(function (args) {
							 | 
						||
| 
								 | 
							
								    return handleValueInput(promise, args, nodeFunc, self);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function needsPromiseInput(arg) {
							 | 
						||
| 
								 | 
							
								  if (arg !== null && typeof arg === 'object') {
							 | 
						||
| 
								 | 
							
								    if (arg.constructor === Promise) {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return getThen(arg);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  This is a convenient alias for `Promise.all`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method all
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Array} array Array of promises.
							 | 
						||
| 
								 | 
							
								  @param {String} [label] An optional label. This is useful
							 | 
						||
| 
								 | 
							
								  for tooling.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function all$1(array, label) {
							 | 
						||
| 
								 | 
							
								  return Promise.all(array, label);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								@module rsvp
							 | 
						||
| 
								 | 
							
								@public
							 | 
						||
| 
								 | 
							
								**/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var AllSettled = function (_Enumerator) {
							 | 
						||
| 
								 | 
							
								  _inherits(AllSettled, _Enumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function AllSettled(Constructor, entries, label) {
							 | 
						||
| 
								 | 
							
								    return _possibleConstructorReturn(this, _Enumerator.call(this, Constructor, entries, false /* don't abort on reject */, label));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return AllSettled;
							 | 
						||
| 
								 | 
							
								}(Enumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								AllSettled.prototype._setResultAt = setSettledResult;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								`RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing
							 | 
						||
| 
								 | 
							
								a fail-fast method, it waits until all the promises have returned and
							 | 
						||
| 
								 | 
							
								shows you all the results. This is useful if you want to handle multiple
							 | 
						||
| 
								 | 
							
								promises' failure states together as a set.
							 | 
						||
| 
								 | 
							
								 Returns a promise that is fulfilled when all the given promises have been
							 | 
						||
| 
								 | 
							
								settled. The return promise is fulfilled with an array of the states of
							 | 
						||
| 
								 | 
							
								the promises passed into the `promises` array argument.
							 | 
						||
| 
								 | 
							
								 Each state object will either indicate fulfillment or rejection, and
							 | 
						||
| 
								 | 
							
								provide the corresponding value or reason. The states will take one of
							 | 
						||
| 
								 | 
							
								the following formats:
							 | 
						||
| 
								 | 
							
								 ```javascript
							 | 
						||
| 
								 | 
							
								{ state: 'fulfilled', value: value }
							 | 
						||
| 
								 | 
							
								  or
							 | 
						||
| 
								 | 
							
								{ state: 'rejected', reason: reason }
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								 Example:
							 | 
						||
| 
								 | 
							
								 ```javascript
							 | 
						||
| 
								 | 
							
								let promise1 = RSVP.Promise.resolve(1);
							 | 
						||
| 
								 | 
							
								let promise2 = RSVP.Promise.reject(new Error('2'));
							 | 
						||
| 
								 | 
							
								let promise3 = RSVP.Promise.reject(new Error('3'));
							 | 
						||
| 
								 | 
							
								let promises = [ promise1, promise2, promise3 ];
							 | 
						||
| 
								 | 
							
								 RSVP.allSettled(promises).then(function(array){
							 | 
						||
| 
								 | 
							
								  // array == [
							 | 
						||
| 
								 | 
							
								  //   { state: 'fulfilled', value: 1 },
							 | 
						||
| 
								 | 
							
								  //   { state: 'rejected', reason: Error },
							 | 
						||
| 
								 | 
							
								  //   { state: 'rejected', reason: Error }
							 | 
						||
| 
								 | 
							
								  // ]
							 | 
						||
| 
								 | 
							
								  // Note that for the second item, reason.message will be '2', and for the
							 | 
						||
| 
								 | 
							
								  // third item, reason.message will be '3'.
							 | 
						||
| 
								 | 
							
								}, function(error) {
							 | 
						||
| 
								 | 
							
								  // Not run. (This block would only be called if allSettled had failed,
							 | 
						||
| 
								 | 
							
								  // for instance if passed an incorrect argument type.)
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								 @method allSettled
							 | 
						||
| 
								 | 
							
								@public
							 | 
						||
| 
								 | 
							
								@static
							 | 
						||
| 
								 | 
							
								@for rsvp
							 | 
						||
| 
								 | 
							
								@param {Array} entries
							 | 
						||
| 
								 | 
							
								@param {String} [label] - optional string that describes the promise.
							 | 
						||
| 
								 | 
							
								Useful for tooling.
							 | 
						||
| 
								 | 
							
								@return {Promise} promise that is fulfilled with an array of the settled
							 | 
						||
| 
								 | 
							
								states of the constituent promises.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function allSettled(entries, label) {
							 | 
						||
| 
								 | 
							
								  if (!Array.isArray(entries)) {
							 | 
						||
| 
								 | 
							
								    return Promise.reject(new TypeError("Promise.allSettled must be called with an array"), label);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return new AllSettled(Promise, entries, label).promise;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  This is a convenient alias for `Promise.race`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method race
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Array} array Array of promises.
							 | 
						||
| 
								 | 
							
								  @param {String} [label] An optional label. This is useful
							 | 
						||
| 
								 | 
							
								  for tooling.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function race$1(array, label) {
							 | 
						||
| 
								 | 
							
								  return Promise.race(array, label);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _possibleConstructorReturn$1(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _inherits$1(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var PromiseHash = function (_Enumerator) {
							 | 
						||
| 
								 | 
							
								  _inherits$1(PromiseHash, _Enumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function PromiseHash(Constructor, object) {
							 | 
						||
| 
								 | 
							
								    var abortOnReject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
							 | 
						||
| 
								 | 
							
								    var label = arguments[3];
							 | 
						||
| 
								 | 
							
								    return _possibleConstructorReturn$1(this, _Enumerator.call(this, Constructor, object, abortOnReject, label));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  PromiseHash.prototype._init = function _init(Constructor, object) {
							 | 
						||
| 
								 | 
							
								    this._result = {};
							 | 
						||
| 
								 | 
							
								    this._enumerate(object);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  PromiseHash.prototype._enumerate = function _enumerate(input) {
							 | 
						||
| 
								 | 
							
								    var keys = Object.keys(input);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var length = keys.length;
							 | 
						||
| 
								 | 
							
								    var promise = this.promise;
							 | 
						||
| 
								 | 
							
								    this._remaining = length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var key = void 0,
							 | 
						||
| 
								 | 
							
								        val = void 0;
							 | 
						||
| 
								 | 
							
								    for (var i = 0; promise._state === PENDING && i < length; i++) {
							 | 
						||
| 
								 | 
							
								      key = keys[i];
							 | 
						||
| 
								 | 
							
								      val = input[key];
							 | 
						||
| 
								 | 
							
								      this._eachEntry(val, key, true);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._checkFullfillment();
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return PromiseHash;
							 | 
						||
| 
								 | 
							
								}(Enumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `hash` is similar to `all`, but takes an object instead of an array
							 | 
						||
| 
								 | 
							
								  for its `promises` argument.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Returns a promise that is fulfilled when all the given promises have been
							 | 
						||
| 
								 | 
							
								  fulfilled, or rejected if any of them become rejected. The returned promise
							 | 
						||
| 
								 | 
							
								  is fulfilled with a hash that has the same key names as the `promises` object
							 | 
						||
| 
								 | 
							
								  argument. If any of the values in the object are not promises, they will
							 | 
						||
| 
								 | 
							
								  simply be copied over to the fulfilled object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let promises = {
							 | 
						||
| 
								 | 
							
								    myPromise: resolve(1),
							 | 
						||
| 
								 | 
							
								    yourPromise: resolve(2),
							 | 
						||
| 
								 | 
							
								    theirPromise: resolve(3),
							 | 
						||
| 
								 | 
							
								    notAPromise: 4
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hash(promises).then(function(hash){
							 | 
						||
| 
								 | 
							
								    // hash here is an object that looks like:
							 | 
						||
| 
								 | 
							
								    // {
							 | 
						||
| 
								 | 
							
								    //   myPromise: 1,
							 | 
						||
| 
								 | 
							
								    //   yourPromise: 2,
							 | 
						||
| 
								 | 
							
								    //   theirPromise: 3,
							 | 
						||
| 
								 | 
							
								    //   notAPromise: 4
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If any of the `promises` given to `hash` are rejected, the first promise
							 | 
						||
| 
								 | 
							
								  that is rejected will be given as the reason to the rejection handler.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  let promises = {
							 | 
						||
| 
								 | 
							
								    myPromise: resolve(1),
							 | 
						||
| 
								 | 
							
								    rejectedPromise: reject(new Error('rejectedPromise')),
							 | 
						||
| 
								 | 
							
								    anotherRejectedPromise: reject(new Error('anotherRejectedPromise')),
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hash(promises).then(function(hash){
							 | 
						||
| 
								 | 
							
								    // Code here never runs because there are rejected promises!
							 | 
						||
| 
								 | 
							
								  }, function(reason) {
							 | 
						||
| 
								 | 
							
								    // reason.message === 'rejectedPromise'
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  An important note: `hash` is intended for plain JavaScript objects that
							 | 
						||
| 
								 | 
							
								  are just a set of keys and values. `hash` will NOT preserve prototype
							 | 
						||
| 
								 | 
							
								  chains.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { hash, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								  function MyConstructor(){
							 | 
						||
| 
								 | 
							
								    this.example = resolve('Example');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MyConstructor.prototype = {
							 | 
						||
| 
								 | 
							
								    protoProperty: resolve('Proto Property')
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let myObject = new MyConstructor();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hash(myObject).then(function(hash){
							 | 
						||
| 
								 | 
							
								    // protoProperty will not be present, instead you will just have an
							 | 
						||
| 
								 | 
							
								    // object that looks like:
							 | 
						||
| 
								 | 
							
								    // {
							 | 
						||
| 
								 | 
							
								    //   example: 'Example'
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    // hash.hasOwnProperty('protoProperty'); // false
							 | 
						||
| 
								 | 
							
								    // 'undefined' === typeof hash.protoProperty
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method hash
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Object} object
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string that describes the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} promise that is fulfilled when all properties of `promises`
							 | 
						||
| 
								 | 
							
								  have been fulfilled, or rejected if any of them become rejected.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function hash(object, label) {
							 | 
						||
| 
								 | 
							
								  return Promise.resolve(object, label).then(function (object) {
							 | 
						||
| 
								 | 
							
								    if (object === null || typeof object !== 'object') {
							 | 
						||
| 
								 | 
							
								      throw new TypeError("Promise.hash must be called with an object");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return new PromiseHash(Promise, object, label).promise;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _possibleConstructorReturn$2(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _inherits$2(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var HashSettled = function (_PromiseHash) {
							 | 
						||
| 
								 | 
							
								  _inherits$2(HashSettled, _PromiseHash);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function HashSettled(Constructor, object, label) {
							 | 
						||
| 
								 | 
							
								    return _possibleConstructorReturn$2(this, _PromiseHash.call(this, Constructor, object, false, label));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return HashSettled;
							 | 
						||
| 
								 | 
							
								}(PromiseHash);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HashSettled.prototype._setResultAt = setSettledResult;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `hashSettled` is similar to `allSettled`, but takes an object
							 | 
						||
| 
								 | 
							
								  instead of an array for its `promises` argument.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Unlike `all` or `hash`, which implement a fail-fast method,
							 | 
						||
| 
								 | 
							
								  but like `allSettled`, `hashSettled` waits until all the
							 | 
						||
| 
								 | 
							
								  constituent promises have returned and then shows you all the results
							 | 
						||
| 
								 | 
							
								  with their states and values/reasons. This is useful if you want to
							 | 
						||
| 
								 | 
							
								  handle multiple promises' failure states together as a set.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Returns a promise that is fulfilled when all the given promises have been
							 | 
						||
| 
								 | 
							
								  settled, or rejected if the passed parameters are invalid.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The returned promise is fulfilled with a hash that has the same key names as
							 | 
						||
| 
								 | 
							
								  the `promises` object argument. If any of the values in the object are not
							 | 
						||
| 
								 | 
							
								  promises, they will be copied over to the fulfilled object and marked with state
							 | 
						||
| 
								 | 
							
								  'fulfilled'.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { hashSettled, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promises = {
							 | 
						||
| 
								 | 
							
								    myPromise: resolve(1),
							 | 
						||
| 
								 | 
							
								    yourPromise: resolve(2),
							 | 
						||
| 
								 | 
							
								    theirPromise: resolve(3),
							 | 
						||
| 
								 | 
							
								    notAPromise: 4
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hashSettled(promises).then(function(hash){
							 | 
						||
| 
								 | 
							
								    // hash here is an object that looks like:
							 | 
						||
| 
								 | 
							
								    // {
							 | 
						||
| 
								 | 
							
								    //   myPromise: { state: 'fulfilled', value: 1 },
							 | 
						||
| 
								 | 
							
								    //   yourPromise: { state: 'fulfilled', value: 2 },
							 | 
						||
| 
								 | 
							
								    //   theirPromise: { state: 'fulfilled', value: 3 },
							 | 
						||
| 
								 | 
							
								    //   notAPromise: { state: 'fulfilled', value: 4 }
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If any of the `promises` given to `hash` are rejected, the state will
							 | 
						||
| 
								 | 
							
								  be set to 'rejected' and the reason for rejection provided.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { hashSettled, reject, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promises = {
							 | 
						||
| 
								 | 
							
								    myPromise: resolve(1),
							 | 
						||
| 
								 | 
							
								    rejectedPromise: reject(new Error('rejection')),
							 | 
						||
| 
								 | 
							
								    anotherRejectedPromise: reject(new Error('more rejection')),
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hashSettled(promises).then(function(hash){
							 | 
						||
| 
								 | 
							
								    // hash here is an object that looks like:
							 | 
						||
| 
								 | 
							
								    // {
							 | 
						||
| 
								 | 
							
								    //   myPromise:              { state: 'fulfilled', value: 1 },
							 | 
						||
| 
								 | 
							
								    //   rejectedPromise:        { state: 'rejected', reason: Error },
							 | 
						||
| 
								 | 
							
								    //   anotherRejectedPromise: { state: 'rejected', reason: Error },
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								    // Note that for rejectedPromise, reason.message == 'rejection',
							 | 
						||
| 
								 | 
							
								    // and for anotherRejectedPromise, reason.message == 'more rejection'.
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  An important note: `hashSettled` is intended for plain JavaScript objects that
							 | 
						||
| 
								 | 
							
								  are just a set of keys and values. `hashSettled` will NOT preserve prototype
							 | 
						||
| 
								 | 
							
								  chains.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import Promise, { hashSettled, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function MyConstructor(){
							 | 
						||
| 
								 | 
							
								    this.example = resolve('Example');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MyConstructor.prototype = {
							 | 
						||
| 
								 | 
							
								    protoProperty: Promise.resolve('Proto Property')
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let myObject = new MyConstructor();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hashSettled(myObject).then(function(hash){
							 | 
						||
| 
								 | 
							
								    // protoProperty will not be present, instead you will just have an
							 | 
						||
| 
								 | 
							
								    // object that looks like:
							 | 
						||
| 
								 | 
							
								    // {
							 | 
						||
| 
								 | 
							
								    //   example: { state: 'fulfilled', value: 'Example' }
							 | 
						||
| 
								 | 
							
								    // }
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    // hash.hasOwnProperty('protoProperty'); // false
							 | 
						||
| 
								 | 
							
								    // 'undefined' === typeof hash.protoProperty
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method hashSettled
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Object} object
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string that describes the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} promise that is fulfilled when when all properties of `promises`
							 | 
						||
| 
								 | 
							
								  have been settled.
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function hashSettled(object, label) {
							 | 
						||
| 
								 | 
							
								  return Promise.resolve(object, label).then(function (object) {
							 | 
						||
| 
								 | 
							
								    if (object === null || typeof object !== 'object') {
							 | 
						||
| 
								 | 
							
								      throw new TypeError("hashSettled must be called with an object");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return new HashSettled(Promise, object, false, label).promise;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `rethrow` will rethrow an error on the next turn of the JavaScript event
							 | 
						||
| 
								 | 
							
								  loop in order to aid debugging.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Promises A+ specifies that any exceptions that occur with a promise must be
							 | 
						||
| 
								 | 
							
								  caught by the promises implementation and bubbled to the last handler. For
							 | 
						||
| 
								 | 
							
								  this reason, it is recommended that you always specify a second rejection
							 | 
						||
| 
								 | 
							
								  handler function to `then`. However, `rethrow` will throw the exception
							 | 
						||
| 
								 | 
							
								  outside of the promise, so it bubbles up to your console if in the browser,
							 | 
						||
| 
								 | 
							
								  or domain/cause uncaught exception in Node. `rethrow` will also throw the
							 | 
						||
| 
								 | 
							
								  error again so the error can be handled by the promise per the spec.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { rethrow } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function throws(){
							 | 
						||
| 
								 | 
							
								    throw new Error('Whoops!');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise = new Promise(function(resolve, reject){
							 | 
						||
| 
								 | 
							
								    throws();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  promise.catch(rethrow).then(function(){
							 | 
						||
| 
								 | 
							
								    // Code here doesn't run because the promise became rejected due to an
							 | 
						||
| 
								 | 
							
								    // error!
							 | 
						||
| 
								 | 
							
								  }, function (err){
							 | 
						||
| 
								 | 
							
								    // handle the error here
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The 'Whoops' error will be thrown on the next turn of the event loop
							 | 
						||
| 
								 | 
							
								  and you can watch for it in your console. You can also handle it using a
							 | 
						||
| 
								 | 
							
								  rejection handler given to `.then` or `.catch` on the returned promise.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method rethrow
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Error} reason reason the promise became rejected.
							 | 
						||
| 
								 | 
							
								  @throws Error
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function rethrow(reason) {
							 | 
						||
| 
								 | 
							
								  setTimeout(function () {
							 | 
						||
| 
								 | 
							
								    throw reason;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  throw reason;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  `defer` returns an object similar to jQuery's `$.Deferred`.
							 | 
						||
| 
								 | 
							
								  `defer` should be used when porting over code reliant on `$.Deferred`'s
							 | 
						||
| 
								 | 
							
								  interface. New code should use the `Promise` constructor instead.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The object returned from `defer` is a plain object with three properties:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * promise - an `Promise`.
							 | 
						||
| 
								 | 
							
								  * reject - a function that causes the `promise` property on this object to
							 | 
						||
| 
								 | 
							
								    become rejected
							 | 
						||
| 
								 | 
							
								  * resolve - a function that causes the `promise` property on this object to
							 | 
						||
| 
								 | 
							
								    become fulfilled.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   ```javascript
							 | 
						||
| 
								 | 
							
								   let deferred = defer();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   deferred.resolve("Success!");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   deferred.promise.then(function(value){
							 | 
						||
| 
								 | 
							
								     // value here is "Success!"
							 | 
						||
| 
								 | 
							
								   });
							 | 
						||
| 
								 | 
							
								   ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method defer
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Object}
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function defer(label) {
							 | 
						||
| 
								 | 
							
								  var deferred = { resolve: undefined, reject: undefined };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  deferred.promise = new Promise(function (resolve, reject) {
							 | 
						||
| 
								 | 
							
								    deferred.resolve = resolve;
							 | 
						||
| 
								 | 
							
								    deferred.reject = reject;
							 | 
						||
| 
								 | 
							
								  }, label);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return deferred;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _possibleConstructorReturn$3(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _inherits$3(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var MapEnumerator = function (_Enumerator) {
							 | 
						||
| 
								 | 
							
								  _inherits$3(MapEnumerator, _Enumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function MapEnumerator(Constructor, entries, mapFn, label) {
							 | 
						||
| 
								 | 
							
								    return _possibleConstructorReturn$3(this, _Enumerator.call(this, Constructor, entries, true, label, mapFn));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MapEnumerator.prototype._init = function _init(Constructor, input, bool, label, mapFn) {
							 | 
						||
| 
								 | 
							
								    var len = input.length || 0;
							 | 
						||
| 
								 | 
							
								    this.length = len;
							 | 
						||
| 
								 | 
							
								    this._remaining = len;
							 | 
						||
| 
								 | 
							
								    this._result = new Array(len);
							 | 
						||
| 
								 | 
							
								    this._mapFn = mapFn;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this._enumerate(input);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  MapEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {
							 | 
						||
| 
								 | 
							
								    if (firstPass) {
							 | 
						||
| 
								 | 
							
								      var val = tryCatch(this._mapFn)(value, i);
							 | 
						||
| 
								 | 
							
								      if (val === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								        this._settledAt(REJECTED, i, val.error, false);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        this._eachEntry(val, i, false);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._remaining--;
							 | 
						||
| 
								 | 
							
								      this._result[i] = value;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return MapEnumerator;
							 | 
						||
| 
								 | 
							
								}(Enumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 `map` is similar to JavaScript's native `map` method. `mapFn` is eagerly called
							 | 
						||
| 
								 | 
							
								  meaning that as soon as any promise resolves its value will be passed to `mapFn`.
							 | 
						||
| 
								 | 
							
								  `map` returns a promise that will become fulfilled with the result of running
							 | 
						||
| 
								 | 
							
								  `mapFn` on the values the promises become fulfilled with.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { map, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = resolve(1);
							 | 
						||
| 
								 | 
							
								  let promise2 = resolve(2);
							 | 
						||
| 
								 | 
							
								  let promise3 = resolve(3);
							 | 
						||
| 
								 | 
							
								  let promises = [ promise1, promise2, promise3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let mapFn = function(item){
							 | 
						||
| 
								 | 
							
								    return item + 1;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  map(promises, mapFn).then(function(result){
							 | 
						||
| 
								 | 
							
								    // result is [ 2, 3, 4 ]
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If any of the `promises` given to `map` are rejected, the first promise
							 | 
						||
| 
								 | 
							
								  that is rejected will be given as an argument to the returned promise's
							 | 
						||
| 
								 | 
							
								  rejection handler. For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { map, reject, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = resolve(1);
							 | 
						||
| 
								 | 
							
								  let promise2 = reject(new Error('2'));
							 | 
						||
| 
								 | 
							
								  let promise3 = reject(new Error('3'));
							 | 
						||
| 
								 | 
							
								  let promises = [ promise1, promise2, promise3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let mapFn = function(item){
							 | 
						||
| 
								 | 
							
								    return item + 1;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  map(promises, mapFn).then(function(array){
							 | 
						||
| 
								 | 
							
								    // Code here never runs because there are rejected promises!
							 | 
						||
| 
								 | 
							
								  }, function(reason) {
							 | 
						||
| 
								 | 
							
								    // reason.message === '2'
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  `map` will also wait if a promise is returned from `mapFn`. For example,
							 | 
						||
| 
								 | 
							
								  say you want to get all comments from a set of blog posts, but you need
							 | 
						||
| 
								 | 
							
								  the blog posts first because they contain a url to those comments.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javscript
							 | 
						||
| 
								 | 
							
								  import { map } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let mapFn = function(blogPost){
							 | 
						||
| 
								 | 
							
								    // getComments does some ajax and returns an Promise that is fulfilled
							 | 
						||
| 
								 | 
							
								    // with some comments data
							 | 
						||
| 
								 | 
							
								    return getComments(blogPost.comments_url);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // getBlogPosts does some ajax and returns an Promise that is fulfilled
							 | 
						||
| 
								 | 
							
								  // with some blog post data
							 | 
						||
| 
								 | 
							
								  map(getBlogPosts(), mapFn).then(function(comments){
							 | 
						||
| 
								 | 
							
								    // comments is the result of asking the server for the comments
							 | 
						||
| 
								 | 
							
								    // of all blog posts returned from getBlogPosts()
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method map
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Array} promises
							 | 
						||
| 
								 | 
							
								  @param {Function} mapFn function to be called on each fulfilled promise.
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for labeling the promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} promise that is fulfilled with the result of calling
							 | 
						||
| 
								 | 
							
								  `mapFn` on each fulfilled promise or value when they become fulfilled.
							 | 
						||
| 
								 | 
							
								   The promise will be rejected if any of the given `promises` become rejected.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function map(promises, mapFn, label) {
							 | 
						||
| 
								 | 
							
								  if (typeof mapFn !== 'function') {
							 | 
						||
| 
								 | 
							
								    return Promise.reject(new TypeError("map expects a function as a second argument"), label);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Promise.resolve(promises, label).then(function (promises) {
							 | 
						||
| 
								 | 
							
								    if (!Array.isArray(promises)) {
							 | 
						||
| 
								 | 
							
								      throw new TypeError("map must be called with an array");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return new MapEnumerator(Promise, promises, mapFn, label).promise;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  This is a convenient alias for `Promise.resolve`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method resolve
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {*} value value that the returned promise will be resolved with
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for identifying the returned promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} a promise that will become fulfilled with the given
							 | 
						||
| 
								 | 
							
								  `value`
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function resolve$2(value, label) {
							 | 
						||
| 
								 | 
							
								  return Promise.resolve(value, label);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								  This is a convenient alias for `Promise.reject`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method reject
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {*} reason value that the returned promise will be rejected with.
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string for identifying the returned promise.
							 | 
						||
| 
								 | 
							
								  Useful for tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise} a promise rejected with the given `reason`.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function reject$2(reason, label) {
							 | 
						||
| 
								 | 
							
								  return Promise.reject(reason, label);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _possibleConstructorReturn$4(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _inherits$4(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var EMPTY_OBJECT = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var FilterEnumerator = function (_MapEnumerator) {
							 | 
						||
| 
								 | 
							
								  _inherits$4(FilterEnumerator, _MapEnumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function FilterEnumerator() {
							 | 
						||
| 
								 | 
							
								    return _possibleConstructorReturn$4(this, _MapEnumerator.apply(this, arguments));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  FilterEnumerator.prototype._checkFullfillment = function _checkFullfillment() {
							 | 
						||
| 
								 | 
							
								    if (this._remaining === 0 && this._result !== null) {
							 | 
						||
| 
								 | 
							
								      var result = this._result.filter(function (val) {
							 | 
						||
| 
								 | 
							
								        return val !== EMPTY_OBJECT;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      fulfill(this.promise, result);
							 | 
						||
| 
								 | 
							
								      this._result = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  FilterEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {
							 | 
						||
| 
								 | 
							
								    if (firstPass) {
							 | 
						||
| 
								 | 
							
								      this._result[i] = value;
							 | 
						||
| 
								 | 
							
								      var val = tryCatch(this._mapFn)(value, i);
							 | 
						||
| 
								 | 
							
								      if (val === TRY_CATCH_ERROR) {
							 | 
						||
| 
								 | 
							
								        this._settledAt(REJECTED, i, val.error, false);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        this._eachEntry(val, i, false);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._remaining--;
							 | 
						||
| 
								 | 
							
								      if (!value) {
							 | 
						||
| 
								 | 
							
								        this._result[i] = EMPTY_OBJECT;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return FilterEnumerator;
							 | 
						||
| 
								 | 
							
								}(MapEnumerator);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 `filter` is similar to JavaScript's native `filter` method.
							 | 
						||
| 
								 | 
							
								 `filterFn` is eagerly called meaning that as soon as any promise
							 | 
						||
| 
								 | 
							
								  resolves its value will be passed to `filterFn`. `filter` returns
							 | 
						||
| 
								 | 
							
								  a promise that will become fulfilled with the result of running
							 | 
						||
| 
								 | 
							
								  `filterFn` on the values the promises become fulfilled with.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { filter, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = resolve(1);
							 | 
						||
| 
								 | 
							
								  let promise2 = resolve(2);
							 | 
						||
| 
								 | 
							
								  let promise3 = resolve(3);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promises = [promise1, promise2, promise3];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let filterFn = function(item){
							 | 
						||
| 
								 | 
							
								    return item > 1;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  filter(promises, filterFn).then(function(result){
							 | 
						||
| 
								 | 
							
								    // result is [ 2, 3 ]
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  If any of the `promises` given to `filter` are rejected, the first promise
							 | 
						||
| 
								 | 
							
								  that is rejected will be given as an argument to the returned promise's
							 | 
						||
| 
								 | 
							
								  rejection handler. For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { filter, reject, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promise1 = resolve(1);
							 | 
						||
| 
								 | 
							
								  let promise2 = reject(new Error('2'));
							 | 
						||
| 
								 | 
							
								  let promise3 = reject(new Error('3'));
							 | 
						||
| 
								 | 
							
								  let promises = [ promise1, promise2, promise3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let filterFn = function(item){
							 | 
						||
| 
								 | 
							
								    return item > 1;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  filter(promises, filterFn).then(function(array){
							 | 
						||
| 
								 | 
							
								    // Code here never runs because there are rejected promises!
							 | 
						||
| 
								 | 
							
								  }, function(reason) {
							 | 
						||
| 
								 | 
							
								    // reason.message === '2'
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  `filter` will also wait for any promises returned from `filterFn`.
							 | 
						||
| 
								 | 
							
								  For instance, you may want to fetch a list of users then return a subset
							 | 
						||
| 
								 | 
							
								  of those users based on some asynchronous operation:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ```javascript
							 | 
						||
| 
								 | 
							
								  import { filter, resolve } from 'rsvp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let alice = { name: 'alice' };
							 | 
						||
| 
								 | 
							
								  let bob   = { name: 'bob' };
							 | 
						||
| 
								 | 
							
								  let users = [ alice, bob ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let promises = users.map(function(user){
							 | 
						||
| 
								 | 
							
								    return resolve(user);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let filterFn = function(user){
							 | 
						||
| 
								 | 
							
								    // Here, Alice has permissions to create a blog post, but Bob does not.
							 | 
						||
| 
								 | 
							
								    return getPrivilegesForUser(user).then(function(privs){
							 | 
						||
| 
								 | 
							
								      return privs.can_create_blog_post === true;
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  filter(promises, filterFn).then(function(users){
							 | 
						||
| 
								 | 
							
								    // true, because the server told us only Alice can create a blog post.
							 | 
						||
| 
								 | 
							
								    users.length === 1;
							 | 
						||
| 
								 | 
							
								    // false, because Alice is the only user present in `users`
							 | 
						||
| 
								 | 
							
								    users[0] === bob;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @method filter
							 | 
						||
| 
								 | 
							
								  @public
							 | 
						||
| 
								 | 
							
								  @static
							 | 
						||
| 
								 | 
							
								  @for rsvp
							 | 
						||
| 
								 | 
							
								  @param {Array} promises
							 | 
						||
| 
								 | 
							
								  @param {Function} filterFn - function to be called on each resolved value to
							 | 
						||
| 
								 | 
							
								  filter the final results.
							 | 
						||
| 
								 | 
							
								  @param {String} [label] optional string describing the promise. Useful for
							 | 
						||
| 
								 | 
							
								  tooling.
							 | 
						||
| 
								 | 
							
								  @return {Promise}
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function filter(promises, filterFn, label) {
							 | 
						||
| 
								 | 
							
								  if (typeof filterFn !== 'function') {
							 | 
						||
| 
								 | 
							
								    return Promise.reject(new TypeError("filter expects function as a second argument"), label);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Promise.resolve(promises, label).then(function (promises) {
							 | 
						||
| 
								 | 
							
								    if (!Array.isArray(promises)) {
							 | 
						||
| 
								 | 
							
								      throw new TypeError("filter must be called with an array");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return new FilterEnumerator(Promise, promises, filterFn, label).promise;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var len = 0;
							 | 
						||
| 
								 | 
							
								var vertxNext = void 0;
							 | 
						||
| 
								 | 
							
								function asap(callback, arg) {
							 | 
						||
| 
								 | 
							
								  queue$1[len] = callback;
							 | 
						||
| 
								 | 
							
								  queue$1[len + 1] = arg;
							 | 
						||
| 
								 | 
							
								  len += 2;
							 | 
						||
| 
								 | 
							
								  if (len === 2) {
							 | 
						||
| 
								 | 
							
								    // If len is 1, that means that we need to schedule an async flush.
							 | 
						||
| 
								 | 
							
								    // If additional callbacks are queued before the queue is flushed, they
							 | 
						||
| 
								 | 
							
								    // will be processed by this flush that we are scheduling.
							 | 
						||
| 
								 | 
							
								    scheduleFlush$1();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var browserWindow = typeof window !== 'undefined' ? window : undefined;
							 | 
						||
| 
								 | 
							
								var browserGlobal = browserWindow || {};
							 | 
						||
| 
								 | 
							
								var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
							 | 
						||
| 
								 | 
							
								var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// test for web worker but not in IE10
							 | 
						||
| 
								 | 
							
								var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// node
							 | 
						||
| 
								 | 
							
								function useNextTick() {
							 | 
						||
| 
								 | 
							
								  var nextTick = process.nextTick;
							 | 
						||
| 
								 | 
							
								  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
							 | 
						||
| 
								 | 
							
								  // setImmediate should be used instead instead
							 | 
						||
| 
								 | 
							
								  var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/);
							 | 
						||
| 
								 | 
							
								  if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {
							 | 
						||
| 
								 | 
							
								    nextTick = setImmediate;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return function () {
							 | 
						||
| 
								 | 
							
								    return nextTick(flush);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// vertx
							 | 
						||
| 
								 | 
							
								function useVertxTimer() {
							 | 
						||
| 
								 | 
							
								  if (typeof vertxNext !== 'undefined') {
							 | 
						||
| 
								 | 
							
								    return function () {
							 | 
						||
| 
								 | 
							
								      vertxNext(flush);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return useSetTimeout();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function useMutationObserver() {
							 | 
						||
| 
								 | 
							
								  var iterations = 0;
							 | 
						||
| 
								 | 
							
								  var observer = new BrowserMutationObserver(flush);
							 | 
						||
| 
								 | 
							
								  var node = document.createTextNode('');
							 | 
						||
| 
								 | 
							
								  observer.observe(node, { characterData: true });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return function () {
							 | 
						||
| 
								 | 
							
								    return node.data = iterations = ++iterations % 2;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// web worker
							 | 
						||
| 
								 | 
							
								function useMessageChannel() {
							 | 
						||
| 
								 | 
							
								  var channel = new MessageChannel();
							 | 
						||
| 
								 | 
							
								  channel.port1.onmessage = flush;
							 | 
						||
| 
								 | 
							
								  return function () {
							 | 
						||
| 
								 | 
							
								    return channel.port2.postMessage(0);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function useSetTimeout() {
							 | 
						||
| 
								 | 
							
								  return function () {
							 | 
						||
| 
								 | 
							
								    return setTimeout(flush, 1);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var queue$1 = new Array(1000);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function flush() {
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < len; i += 2) {
							 | 
						||
| 
								 | 
							
								    var callback = queue$1[i];
							 | 
						||
| 
								 | 
							
								    var arg = queue$1[i + 1];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    callback(arg);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    queue$1[i] = undefined;
							 | 
						||
| 
								 | 
							
								    queue$1[i + 1] = undefined;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  len = 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function attemptVertex() {
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    var vertx = Function('return this')().require('vertx');
							 | 
						||
| 
								 | 
							
								    vertxNext = vertx.runOnLoop || vertx.runOnContext;
							 | 
						||
| 
								 | 
							
								    return useVertxTimer();
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								    return useSetTimeout();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var scheduleFlush$1 = void 0;
							 | 
						||
| 
								 | 
							
								// Decide what async method to use to triggering processing of queued callbacks:
							 | 
						||
| 
								 | 
							
								if (isNode) {
							 | 
						||
| 
								 | 
							
								  scheduleFlush$1 = useNextTick();
							 | 
						||
| 
								 | 
							
								} else if (BrowserMutationObserver) {
							 | 
						||
| 
								 | 
							
								  scheduleFlush$1 = useMutationObserver();
							 | 
						||
| 
								 | 
							
								} else if (isWorker) {
							 | 
						||
| 
								 | 
							
								  scheduleFlush$1 = useMessageChannel();
							 | 
						||
| 
								 | 
							
								} else if (browserWindow === undefined && typeof require === 'function') {
							 | 
						||
| 
								 | 
							
								  scheduleFlush$1 = attemptVertex();
							 | 
						||
| 
								 | 
							
								} else {
							 | 
						||
| 
								 | 
							
								  scheduleFlush$1 = useSetTimeout();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// defaults
							 | 
						||
| 
								 | 
							
								config.async = asap;
							 | 
						||
| 
								 | 
							
								config.after = function (cb) {
							 | 
						||
| 
								 | 
							
								  return setTimeout(cb, 0);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								var cast = resolve$2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var async = function (callback, arg) {
							 | 
						||
| 
								 | 
							
								  return config.async(callback, arg);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function on() {
							 | 
						||
| 
								 | 
							
								  config.on.apply(config, arguments);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function off() {
							 | 
						||
| 
								 | 
							
								  config.off.apply(config, arguments);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`
							 | 
						||
| 
								 | 
							
								if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {
							 | 
						||
| 
								 | 
							
								  var callbacks = window['__PROMISE_INSTRUMENTATION__'];
							 | 
						||
| 
								 | 
							
								  configure('instrument', true);
							 | 
						||
| 
								 | 
							
								  for (var eventName in callbacks) {
							 | 
						||
| 
								 | 
							
								    if (callbacks.hasOwnProperty(eventName)) {
							 | 
						||
| 
								 | 
							
								      on(eventName, callbacks[eventName]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// the default export here is for backwards compat:
							 | 
						||
| 
								 | 
							
								//   https://github.com/tildeio/rsvp.js/issues/434
							 | 
						||
| 
								 | 
							
								var rsvp = {
							 | 
						||
| 
								 | 
							
								  asap: asap,
							 | 
						||
| 
								 | 
							
								  cast: cast,
							 | 
						||
| 
								 | 
							
								  Promise: Promise,
							 | 
						||
| 
								 | 
							
								  EventTarget: EventTarget,
							 | 
						||
| 
								 | 
							
								  all: all$1,
							 | 
						||
| 
								 | 
							
								  allSettled: allSettled,
							 | 
						||
| 
								 | 
							
								  race: race$1,
							 | 
						||
| 
								 | 
							
								  hash: hash,
							 | 
						||
| 
								 | 
							
								  hashSettled: hashSettled,
							 | 
						||
| 
								 | 
							
								  rethrow: rethrow,
							 | 
						||
| 
								 | 
							
								  defer: defer,
							 | 
						||
| 
								 | 
							
								  denodeify: denodeify,
							 | 
						||
| 
								 | 
							
								  configure: configure,
							 | 
						||
| 
								 | 
							
								  on: on,
							 | 
						||
| 
								 | 
							
								  off: off,
							 | 
						||
| 
								 | 
							
								  resolve: resolve$2,
							 | 
						||
| 
								 | 
							
								  reject: reject$2,
							 | 
						||
| 
								 | 
							
								  map: map,
							 | 
						||
| 
								 | 
							
								  async: async,
							 | 
						||
| 
								 | 
							
								  filter: filter
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export default rsvp;
							 | 
						||
| 
								 | 
							
								export { asap, cast, Promise, EventTarget, all$1 as all, allSettled, race$1 as race, hash, hashSettled, rethrow, defer, denodeify, configure, on, off, resolve$2 as resolve, reject$2 as reject, map, async, filter };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=rsvp.es.map
							 |