ncurry
Version:
Curry for named arguments
25 lines (20 loc) • 768 B
JavaScript
function curryNamed (keys, fn) {
return function helper (cache) {
return function (...objects) {
const incoming = Object.assign({}, ...objects)
const argsOverridden = includesSome(Object.keys(cache), Object.keys(incoming))
const error = `The following arguments were overidden: ${argsOverridden}`
if (argsOverridden.length > 0) throw Error(error)
const obj = Object.assign({}, cache, ...objects)
return includesEvery(keys, Object.keys(obj)) ? fn(obj) : helper(obj)
}
}({})
}
const includesEvery = (mandatory, received) =>
mandatory.every(key =>
received.includes(key))
const includesSome = (mandatory, received) =>
mandatory.filter(key =>
received.includes(key))
module.exports = curryNamed