« Back to Index

Curry implementation in Node

View original Gist on GitHub

curry.js

module.exports = curry;

function curry (f) {
	var arity = f.length;
	var params = [];
	var end = createEnd(f, arity);
	return createCurried(params, arity, end);
}

function createEnd (f, arity) {
	var src = 'return f(';
	for (var i = 0; i < arity; i++) {
		src += (i ? ', p[' : 'p[') + i + ']';
	}
	src += ');';
	var endCall = new Function ('f', 'p', src);
	return function end (p) {
		return endCall(f, p);
	};
}

function createCurried (collected, arity, end) {
	return function () {
		var params = appendArgs(collected, arguments);
		return params.length < arity
			? createCurried(params, arity, end)
			: end(params);
	}
}

function appendArgs (arr, args) {
	return arr.concat(arr.slice.call(args));
}