bluebird.reduce(
[1,2,3,4,5],
async ({ errors, log }, value, index) => {
const isEven = number => Promise.resolve(number % 2 === 0);
const isThree = number => Promise.resolve(number === 3);
const conditionalErrorMessage = (message, fn) => async (...args) => {
const result = await fn(...args);
log.push(`evaluating ${fn.name}(${JSON.stringify(...args)}) === ${result}`);
return result ? message : undefined;
}
const evenError = conditionalErrorMessage('Error: number is even', isEven);
const threeError = conditionalErrorMessage('Error: number is three', isThree);
const error = await evenError(value) || await threeError(value);
if (error) {
return { errors: [...errors, `${error} index[${index}]=${value}`], log };
}
return { errors, log };
},
{ errors: [], log: [] }
)