| /** |
| * 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:</p> |
| * |
| * 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, Promise$_CreatePromiseArray, PromiseArray, apiRejection) { |
| |
| function Promise$_mapper(values) { |
| var fn = this; |
| var receiver = void 0; |
| |
| if (typeof fn !== "function") { |
| receiver = fn.receiver; |
| fn = fn.fn; |
| } |
| var shouldDefer = false; |
| |
| var ret = new Array(values.length); |
| |
| if (receiver === void 0) { |
| for (var i = 0, len = values.length; i < len; ++i) { |
| var value = fn(values[i], i, len); |
| if (!shouldDefer) { |
| var maybePromise = Promise._cast(value, |
| Promise$_mapper, void 0); |
| if (maybePromise instanceof Promise) { |
| if (maybePromise.isFulfilled()) { |
| ret[i] = maybePromise._settledValue; |
| continue; |
| } |
| else { |
| shouldDefer = true; |
| } |
| value = maybePromise; |
| } |
| } |
| ret[i] = value; |
| } |
| } |
| else { |
| for (var i = 0, len = values.length; i < len; ++i) { |
| var value = fn.call(receiver, values[i], i, len); |
| if (!shouldDefer) { |
| var maybePromise = Promise._cast(value, |
| Promise$_mapper, void 0); |
| if (maybePromise instanceof Promise) { |
| if (maybePromise.isFulfilled()) { |
| ret[i] = maybePromise._settledValue; |
| continue; |
| } |
| else { |
| shouldDefer = true; |
| } |
| value = maybePromise; |
| } |
| } |
| ret[i] = value; |
| } |
| } |
| return shouldDefer |
| ? Promise$_CreatePromiseArray(ret, PromiseArray, |
| Promise$_mapper, void 0).promise() |
| : ret; |
| } |
| |
| function Promise$_Map(promises, fn, useBound, caller, ref) { |
| if (typeof fn !== "function") { |
| return apiRejection("fn must be a function"); |
| } |
| |
| if (useBound === true && promises._isBound()) { |
| fn = { |
| fn: fn, |
| receiver: promises._boundTo |
| }; |
| } |
| |
| var ret = Promise$_CreatePromiseArray( |
| promises, |
| PromiseArray, |
| caller, |
| useBound === true && promises._isBound() |
| ? promises._boundTo |
| : void 0 |
| ).promise(); |
| |
| if (ref !== void 0) { |
| ref.ref = ret; |
| } |
| |
| return ret._then( |
| Promise$_mapper, |
| void 0, |
| void 0, |
| fn, |
| void 0, |
| caller |
| ); |
| } |
| |
| Promise.prototype.map = function Promise$map(fn, ref) { |
| return Promise$_Map(this, fn, true, this.map, ref); |
| }; |
| |
| Promise.map = function Promise$Map(promises, fn, ref) { |
| return Promise$_Map(promises, fn, false, Promise.map, ref); |
| }; |
| }; |