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