95 lines
1.7 KiB
JavaScript
95 lines
1.7 KiB
JavaScript
|
'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,
|
||
|
};
|