Closures & Scopehard
Implement curry(fn)
Write a `curry` function that transforms a multi-argument function into a sequence of unary functions. `curry(add)(1)(2)(3)` should equal `add(1, 2, 3)`.
Asked at Meta, Google
Answer
function curry(fn) { return function curried(...args) { if (args.length >= fn.length) { return fn.apply(this, args) } return function (...moreArgs) { return curried.apply(this, args.concat(moreArgs)) } } } // Usage function add(a, b, c) { return a + b + c } const curriedAdd = curry(add) curriedAdd(1)(2)(3) // 6 curriedAdd(1, 2)(3) // 6 curriedAdd(1)(2, 3) // 6 curriedAdd(1, 2, 3) // 6
Source: frontendinterviewhandbook.com