| 'use strict'; |
|
|
| function noop() {} |
|
|
| function getOptions(args) { |
| |
| 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) { |
| |
| 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, |
| }; |
|
|