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.
		
		
		
		
			
				
					2560 lines
				
				74 KiB
			
		
		
			
		
	
	
					2560 lines
				
				74 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 (global, factory) {
							 | 
						||
| 
								 | 
							
								  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
							 | 
						||
| 
								 | 
							
								  typeof define === 'function' && define.amd ? define(['exports'], factory) :
							 | 
						||
| 
								 | 
							
								  (factory((global.RSVP = {})));
							 | 
						||
| 
								 | 
							
								}(this, (function (exports) { 'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  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
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  exports.default = rsvp;
							 | 
						||
| 
								 | 
							
								  exports.asap = asap;
							 | 
						||
| 
								 | 
							
								  exports.cast = cast;
							 | 
						||
| 
								 | 
							
								  exports.Promise = Promise;
							 | 
						||
| 
								 | 
							
								  exports.EventTarget = EventTarget;
							 | 
						||
| 
								 | 
							
								  exports.all = all$1;
							 | 
						||
| 
								 | 
							
								  exports.allSettled = allSettled;
							 | 
						||
| 
								 | 
							
								  exports.race = race$1;
							 | 
						||
| 
								 | 
							
								  exports.hash = hash;
							 | 
						||
| 
								 | 
							
								  exports.hashSettled = hashSettled;
							 | 
						||
| 
								 | 
							
								  exports.rethrow = rethrow;
							 | 
						||
| 
								 | 
							
								  exports.defer = defer;
							 | 
						||
| 
								 | 
							
								  exports.denodeify = denodeify;
							 | 
						||
| 
								 | 
							
								  exports.configure = configure;
							 | 
						||
| 
								 | 
							
								  exports.on = on;
							 | 
						||
| 
								 | 
							
								  exports.off = off;
							 | 
						||
| 
								 | 
							
								  exports.resolve = resolve$2;
							 | 
						||
| 
								 | 
							
								  exports.reject = reject$2;
							 | 
						||
| 
								 | 
							
								  exports.map = map;
							 | 
						||
| 
								 | 
							
								  exports.async = async;
							 | 
						||
| 
								 | 
							
								  exports.filter = filter;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Object.defineProperty(exports, '__esModule', { value: true });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								})));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=rsvp.map
							 |