95 lines
1.7 KiB
JavaScript
Raw Normal View History

'use strict';
function noop() {}
function getOptions(args) {
// TODO: use `.at(-1)` when the API is available
var lastArg = args.slice(-1)[0];
if (typeof lastArg !== 'function') {
return lastArg;
}
}
function filterSuccess(elem) {
return elem.state === 'success';
}
function filterError(elem) {
return elem.state === 'error';
}
function pluckValue(elem) {
return elem.value;
}
function buildOnSettled(done) {
if (typeof done !== 'function') {
done = noop;
}
function onSettled(error, result) {
if (error) {
return done(error, null);
}
if (!Array.isArray(result)) {
result = [];
}
var settledErrors = result.filter(filterError);
var settledResults = result.filter(filterSuccess);
var errors = null;
if (settledErrors.length) {
errors = settledErrors.map(pluckValue);
}
var results = null;
if (settledResults.length) {
results = settledResults.map(pluckValue);
}
done(errors, results);
}
return onSettled;
}
function verifyArguments(args) {
args = Array.prototype.concat.apply([], args);
if (!args.length) {
throw new Error('A set of functions to combine is required');
}
args.forEach(verifyEachArg);
return args;
}
function verifyEachArg(arg, argIdx, args) {
var isFunction = typeof arg === 'function';
if (isFunction) {
return;
}
if (argIdx === args.length - 1) {
// Last arg can be an object of extension points
return;
}
var msg =
'Only functions can be combined, got ' +
typeof arg +
' for argument ' +
argIdx;
throw new Error(msg);
}
module.exports = {
getOptions: getOptions,
onSettled: buildOnSettled,
verifyArguments: verifyArguments,
};