You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.6 KiB
84 lines
1.6 KiB
'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, |
|
};
|
|
|