function makeCombinationFunction(combiner, format) {
let formatFn =
typeof format === "string"
? (subFormats) => subFormats.join(` ${format} `)
: format;
function Combiner(...subFns) {
let arities = subFns.map((fn) => fn.arity);
let fn = (...args) => {
let chunked = chunkArray(args, arities);
return combiner(subFns.map((fn, i) => fn(...chunked[i])));
};
fn.format = (...args) => {
let chunked = chunkArray(args, arities);
return formatFn(
subFns.map((fn, i) => {
let base = fn.format(...chunked[i]);
if (fn.wrapParen) {
base = `(${base})`;
}
return base;
})
);
};
fn.arity = _.sum(arities);
fn.wrapParen = true;
return fn;
}
return Combiner;
}