curry

Transform a function into a sequence of functions each accepting a single argument.

Usage

var curry = require( '@stdlib/utils/curry' );

curry( fcn[, arity][, thisArg] )

Transforms a function into a sequence of functions each accepting a single argument.

function add( x, y ) {
    return x + y;
}

var fcn = curry( add );

var sum = fcn( 2 )( 3 );
// returns 5

By default, arity is equal to fcn.length. For functions without explicit parameters, provide an arity argument.

function add() {
    return arguments[ 0 ] + arguments[ 1 ];
}

var fcn = curry( add, 2 );

var sum = fcn( 2 )( 3 );
// returns 5

To specify the curried function execution context, provide a thisArg argument.

var obj = {
    'name': 'Ada',
    'greet': function greet( word1, word2 ) {
        return word1 + ' ' + word2 + ', ' + this.name + '!';
    }
};

var fcn = curry( obj.greet, obj );

var str = fcn( 'Hello' )( 'there' );
// returns 'Hello there, Ada!'

The function supports providing both an arity and execution context.

var obj = {
    'name': 'Ada',
    'greet': function greet() {
        return arguments[ 0 ] + ' ' + arguments[ 1 ] + ', ' + this.name + '!';
    }
};

var fcn = curry( obj.greet, 2, obj );

var str = fcn( 'Hello' )( 'there' );
// returns 'Hello there, Ada!'

Notes

  • Until return value resolution, each invocation returns a new partially applied curry function.

    function add( x, y, z ) {
        return x + y + z;
    }
    
    var fcn = curry( add );
    
    var s0 = fcn( 1 )( 2 )( 3 );
    // returns 6
    
    s0 = fcn( -1 )( -2 )( -3 );
    // returns -6
    
    s0 = fcn( 10 )( 20 )( 30 );
    // returns 60
    
    // Return a partially applied curry function:
    var f1 = fcn( 3 );
    
    var s1 = f1( 4 )( 5 );
    // returns 12
    
    s1 = f1( 6 )( 7 );
    // returns 16
    
    s1 = f1( 8 )( 9 );
    // returns 20
    
    // Return a partially applied curry function:
    var f2 = fcn( 4 )( 5 );
    
    var s2 = f2( 6 );
    // returns 15
    
    s2 = f2( 70 );
    // returns 79
    
    s2 = f2( 700 );
    // returns 709
    

Examples

var curry = require( '@stdlib/utils/curry' );

var fcn;
var out;
var i;

function add( x, y, z, w, t, s ) {
    return x + y + z + w + t + s;
}

fcn = curry( add );
out = fcn;
for ( i = 0; i < add.length; i++ ) {
    out = out( i*10 );
}
console.log( out );
Did you find this page helpful?