uncurryRight

Transform a curried function into a function invoked with multiple arguments.

Usage

var uncurryRight = require( '@stdlib/utils/uncurry-right' );

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

Transforms a curried function into a function invoked with multiple arguments.

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

var fcn = uncurryRight( add );

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

To enforce a fixed number of parameters, provide an arity argument.

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

var fcn = uncurryRight( add, 2 );

var sum = fcn( 9 );
// throws <Error>

To specify an execution context, provide a thisArg argument.

function addY( y ) {
    this.y = y;
    return addX;
}

function addX( x ) {
    return x + this.y;
}

var fcn = uncurryRight( addY, {} );

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

The function supports providing both an arity and execution context.

function addY( y ) {
    this.y = y;
    return addX;
}

function addX( x ) {
    return x + this.y;
}

var fcn = uncurryRight( addY, 2, {} );

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

sum = fcn( 4 );
// throws <Error>

Notes

  • The difference between this function and uncurry is the order in which arguments are applied. This function applies arguments starting from the right.

Examples

var fromCodePoint = require( '@stdlib/string/from-code-point' );
var curryRight = require( '@stdlib/utils/curry-right' );
var uncurryRight = require( '@stdlib/utils/uncurry-right' );

var uncurried;
var curried;
var abcs;
var out;
var a;
var i;

function concat() {
    var len;
    var out;
    var i;

    len = arguments.length;
    out = '';
    for ( i = 0; i < len; i++ ) {
        out += arguments[ i ];
        if ( i < len-1 ) {
            out += ',';
        }
    }
    return out;
}

// Character codes:
a = 97;

abcs = new Array( 26 );
for ( i = 0; i < abcs.length; i++ ) {
    abcs[ i ] = fromCodePoint( a + i );
}
out = concat.apply( null, abcs );
// returns 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'

// Transform `concat` into a right curried function:
curried = curryRight( concat, 26 );

out = curried;
for ( i = abcs.length-1; i >= 0; i-- ) {
    out = out( abcs[ i ] );
}
console.log( out );
// => 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'

// Uncurry a right curried function:
uncurried = uncurryRight( curried );

out = uncurried.apply( null, abcs );
// returns 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'