UNPKG

ncurry

Version:

Curry for named arguments

25 lines (20 loc) 768 B
'use strict' 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