Skip to content

Commit

Permalink
Merge pull request #3 from omsmith/optimize
Browse files Browse the repository at this point in the history
optimize to reduce allocations (also for speed)
  • Loading branch information
pgaubatz committed Jan 16, 2016
2 parents d4e8413 + 9c619f0 commit 423e0ce
Showing 1 changed file with 42 additions and 42 deletions.
84 changes: 42 additions & 42 deletions lib/promise-settle.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,53 +3,53 @@
module.exports = settle;

function settle(promises) {
return Promise.resolve()
.then(function () {
return promises;
})
.then(function (promises) {
if (!Array.isArray(promises)) throw new TypeError('Expected an array of Promises');

var promiseResults = promises.map(function (promise) {
return Promise.resolve()
.then(function () {
return promise;
})
.then(function (result) {
return promiseResult(result);
})
.catch(function (err) {
return promiseResult(null, err);
});
});

return Promise.all(promiseResults);
});
}

function promiseResult(result, err) {
var isFulfilled = (typeof err === 'undefined');
var value = isFulfilled
? returns.bind(result)
: throws.bind(new Error('Promise is rejected'));

var isRejected = !isFulfilled;
var reason = isRejected
? returns.bind(err)
: throws.bind(new Error('Promise is fulfilled'));
return Promise
.resolve(promises)
.then(_settle);
}

function _settle(promises) {
if (!Array.isArray(promises)) throw new TypeError('Expected an array of Promises');

return Promise.all(promises.map(_settlePromise));
}

function _settlePromise(promise) {
return Promise
.resolve(promise)
.then(_promiseResolved, _promiseRejected);
}

function _promiseResolved(result) {
return {
isFulfilled: _true,
isRejected: _false,
value: function () { return result; },
reason: _isFulfilled
};
}

function _promiseRejected(err) {
return {
isFulfilled: returns.bind(isFulfilled),
isRejected: returns.bind(isRejected),
value: value,
reason: reason
isFulfilled: _false,
isRejected: _true,
value: _isRejected,
reason: function () { return err; }
};
}

function returns() {
return this;
function _true() {
return true;
}

function _false() {
return false;
}

function _isRejected() {
throw new Error('Promise is rejected');
}

function throws() {
throw this;
function _isFulfilled() {
throw new Error('Promise is fulfilled');
}

0 comments on commit 423e0ce

Please sign in to comment.