/** * Copyright (c) 2014 Petka Antonov * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions:

* * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ "use strict"; module.exports = function(Promise, INTERNAL) { var apiRejection = require("./errors_api_rejection.js")(Promise); var isArray = require("./util.js").isArray; var raceLater = function Promise$_raceLater(promise) { return promise.then(function Promise$_lateRacer(array) { return Promise$_Race(array, Promise$_lateRacer, promise); }); }; var hasOwn = {}.hasOwnProperty; function Promise$_Race(promises, caller, parent) { var maybePromise = Promise._cast(promises, caller, void 0); if (Promise.is(maybePromise)) { return raceLater(maybePromise); } else if (!isArray(promises)) { return apiRejection("expecting an array, a promise or a thenable"); } var ret = new Promise(INTERNAL); ret._setTrace(caller, parent); if (parent !== void 0) { if (parent._isBound()) { ret._setBoundTo(parent._boundTo); } if (parent._cancellable()) { ret._setCancellable(); ret._cancellationParent = parent; } } var fulfill = ret._fulfill; var reject = ret._reject; for (var i = 0, len = promises.length; i < len; ++i) { var val = promises[i]; if (val === void 0 && !(hasOwn.call(promises, i))) { continue; } Promise.cast(val)._then( fulfill, reject, void 0, ret, null, caller ); } return ret; } Promise.race = function Promise$Race(promises) { return Promise$_Race(promises, Promise.race, void 0); }; Promise.prototype.race = function Promise$race() { return Promise$_Race(this, this.race, void 0); }; };