Es6 Ncurry
17 February 2014
While reading through Highland Streams, I noticed how many
of the functional bits ES6 will help–as soon as we get them. One function I rather liked, ncurry
follows the basic curry syntax but solves the “function.length problem” by passing n, the
length, as the first parameter.
The important part internally works just like leave (see
Take or Leave Functional Programming).
I rewrote the functions needed using ES6 notation; making heavy use of rest and spread operators. This
included an ES6-style rewrite of leave.
I see one possible downside to this implementation. We can’t use this when applying leave’s function.
We have to use null unless we add a receiver parameter to the signature somewhere.
Try it in the repl
var slice_ = _part_.create_( Array.prototype.slice );
var take_ = slice_.bind( null, 0 );
var leave = ( n )
=> ( fn, ...a )
=> ( ...b )
=> fn.apply( null, take_( n )( [...a, ...b] ) );
var ncurry = ( n, fn, ...a ) => {
if ( a.length >= n ) {
return leave( n )( fn )( ...a );
}
return ( ...b ) => {
var ab = [...a, ...b];
return ab.length < n ? ncurry( n, fn, ...ab ) : leave( n )( fn )( ...ab );
};
};
var max = ncurry( 3, Math.max );
max( 1, 2 )( 3, 4 ); //3Try it in the repl