2560 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			2560 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | ||
|  * @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
 |