diffusion
Version:
Diffusion JavaScript client
98 lines (83 loc) • 2.71 kB
JavaScript
/*eslint valid-jsdoc: "off"*/
var a2a = require('util/array').argumentsToArray;
// Poor mans curry (dahl?) - only provide partial application for one call.
function curry() {
var args = a2a(arguments);
var fn = args.shift();
return function () {
return callWithArguments(fn, args.concat(a2a(arguments)));
};
}
/**
* Basic curry-right; provides partial application with arguments on the right
*/
function curryR() {
var args = a2a(arguments);
var fn = args.shift();
return function () {
return callWithArguments(fn, a2a(arguments).concat(args));
};
}
function callWithArguments(f, args, count) {
count = count === undefined ? args.length : count;
// Optimise for manageable numbers of arguments
switch (count) {
case 0 :
return f();
case 1 :
return f(args[0]);
case 2 :
return f(args[0], args[1]);
case 3 :
return f(args[0], args[1], args[2]);
case 4 :
return f(args[0], args[1], args[2], args[3]);
case 5 :
return f(args[0], args[1], args[2], args[3], args[4]);
case 6 :
return f(args[0], args[1], args[2], args[3], args[4], args[5]);
case 7 :
return f(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
case 8 :
return f(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
}
return f.apply(f, args);
}
function newWithArguments(f, args, count) {
count = count === undefined ? args.length : count;
// Optimise for manageable numbers of arguments
switch (count) {
case 0 :
return new f();
case 1 :
return new f(args[0]);
case 2 :
return new f(args[0], args[1]);
case 3 :
return new f(args[0], args[1], args[2]);
case 4 :
return new f(args[0], args[1], args[2], args[3]);
case 5 :
return new f(args[0], args[1], args[2], args[3], args[4]);
case 6 :
return new f(args[0], args[1], args[2], args[3], args[4], args[5]);
case 7 :
return new f(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
case 8 :
return new f(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
}
function Proxy() {
f.apply(this, args);
}
Proxy.prototype = f.prototype;
return new Proxy();
}
module.exports = {
curry: curry,
curryR: curryR,
callWithArguments: callWithArguments,
newWithArguments: newWithArguments
};
module.exports.identity = function(o) {
return o;
};