DEV Community

Discussion on: Currying in JS 🤠

Collapse
 
aminnairi profile image
Amin
"use strict";

/**
 * Curry a function of any arity
 * 
 * @param {Function} callable
 * @param {unknown[]=} [] initialParameters
 * @return {Function}
 */
function curry(callable, ...initialParameters) {
    return function(...additionalParameters) {
        const parameters = [...initialParameters, ...additionalParameters];

        if (parameters.length >= callable.length) {
            return callable(...parameters);
        }

        return curry(callable, ...parameters);
    };
}

/**
 * Uncurry a function of any arity
 * 
 * @param {Function} curriedFunction
 * @return {Function}
 */
function uncurry(curriedFunction) {
    return function(...parameters) {
        return parameters.reduce(function(next, value) {
            return next(value);
        }, curriedFunction);
    }
}

const add = curry((x, y) => x + y);
const increment = add(1);

console.log(add);           // [Function]
console.log(increment);     // [Function]
console.log(add(1, 2));     // 3
console.log(increment(2));  // 3

const $add = uncurry(add);

console.log($add);          // [Function]
console.log($add(1, 2));    // 3