var curry, flip, fix, apply; curry = function(f){ return curry$(f); }; flip = curry$(function(f, x, y){ return f(y, x); }); fix = function(f){ return function(g, x){ return function(){ return f(g(g)).apply(null, arguments); }; }(function(g, x){ return function(){ return f(g(g)).apply(null, arguments); }; }); }; apply = curry$(function(f, list){ return f.apply(null, list); }); module.exports = { curry: curry, flip: flip, fix: fix, apply: apply }; function curry$(f, bound){ var context, _curry = function(args) { return f.length > 1 ? function(){ var params = args ? args.concat() : []; context = bound ? context || this : this; return params.push.apply(params, arguments) < f.length && arguments.length ? _curry.call(context, params) : f.apply(context, params); } : f; }; return _curry(); }