UNPKG

diffusion

Version:

Diffusion JavaScript client

98 lines (83 loc) 2.71 kB
/*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; };