|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
module.exports = function( |
|
Promise, Promise$_CreatePromiseArray, PromiseArray, apiRejection) { |
|
|
|
var ASSERT = require("./assert.js"); |
|
|
|
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); |
|
}; |
|
}; |
|
|