85 lines
1.6 KiB
JavaScript
85 lines
1.6 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var assert = require('assert');
|
||
|
|
||
|
var filter = require('arr-filter');
|
||
|
var map = require('arr-map');
|
||
|
var flatten = require('arr-flatten');
|
||
|
var forEach = require('array-each');
|
||
|
|
||
|
function noop() {}
|
||
|
|
||
|
function getExtensions(lastArg) {
|
||
|
if (typeof lastArg !== 'function') {
|
||
|
return lastArg;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function filterSuccess(elem) {
|
||
|
return elem.state === 'success';
|
||
|
}
|
||
|
|
||
|
function filterError(elem) {
|
||
|
return elem.state === 'error';
|
||
|
}
|
||
|
|
||
|
function buildOnSettled(done) {
|
||
|
if (typeof done !== 'function') {
|
||
|
done = noop;
|
||
|
}
|
||
|
|
||
|
function onSettled(error, result) {
|
||
|
if (error) {
|
||
|
return done(error, null);
|
||
|
}
|
||
|
|
||
|
var settledErrors = filter(result, filterError);
|
||
|
var settledResults = filter(result, filterSuccess);
|
||
|
|
||
|
var errors = null;
|
||
|
if (settledErrors.length) {
|
||
|
errors = map(settledErrors, 'value');
|
||
|
}
|
||
|
|
||
|
var results = null;
|
||
|
if (settledResults.length) {
|
||
|
results = map(settledResults, 'value');
|
||
|
}
|
||
|
|
||
|
done(errors, results);
|
||
|
}
|
||
|
|
||
|
return onSettled;
|
||
|
}
|
||
|
|
||
|
function verifyArguments(args) {
|
||
|
args = flatten(args);
|
||
|
var lastIdx = args.length - 1;
|
||
|
|
||
|
assert.ok(args.length, 'A set of functions to combine is required');
|
||
|
|
||
|
forEach(args, function(arg, argIdx) {
|
||
|
var isFunction = typeof arg === 'function';
|
||
|
if (isFunction) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (argIdx === lastIdx) {
|
||
|
// Last arg can be an object of extension points
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var msg = 'Only functions can be combined, got ' + typeof arg +
|
||
|
' for argument ' + argIdx;
|
||
|
assert.ok(isFunction, msg);
|
||
|
});
|
||
|
|
||
|
return args;
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
getExtensions: getExtensions,
|
||
|
onSettled: buildOnSettled,
|
||
|
verifyArguments: verifyArguments,
|
||
|
};
|