<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<h1>Curry me!</h1>
have a look at script.js
</body>
</html>
$(function() {
// Function currying function :)
//
var curry = function(f) {
var curry_ = function(f, tl, accin) {
return function() {
var l = arguments.length,
accout = accin.concat([].splice.call(arguments, 0));
if (l + accin.length >= tl) {
return f.apply(this, accout);
}
return curry_(f, tl, accout);
};
};
return curry_(f, f.length, []);
}
// Some tests
console.log('----- T1');
function foo(a, b, c) {
return [a, b, c];
}
var cfoo = curry(foo);
console.log("cfoo(1, 2, 3)", cfoo(1, 2, 3));
console.log("cfoo(1, 2)(3)", cfoo(1, 2)(3));
console.log("cfoo(1)(2, 3)", cfoo(1)(2, 3));
console.log("cfoo(1)(2)(3)", cfoo(1)(2)(3));
console.log(cfoo(1, 2, 3));
console.log('----- T2');
function deepfoo() {
return function(a, b, c) {
return ['intern', a, b, c];
}
}
var ifoo = deepfoo();
var cifoo = curry(ifoo);
console.log("cifoo(1, 2)(3)", cifoo(1, 2)(3));
console.log("cifoo(1)(2, 3)", cifoo(1)(2, 3));
console.log("cifoo(1, 2, 3)", cifoo(1, 2, 3));
console.log('----- T3');
console.log("curry(cfoo(1))(2, 3)", curry(cfoo(1))(2, 3));
console.log('----- T4');
var cfoo0 = curry(foo);
var cfoo1 = cfoo0(1);
var cfoo2 = cfoo1(2);
var cfoo3 = cfoo2(3);
console.log("cfoo0(1, 2, 3)", cfoo0(1, 2, 3));
console.log("cfoo1(2, 3)", cfoo1(2, 3));
console.log("cfoo2(3)", cfoo2(3));
console.log("cfoo3()", cfoo3);
console.log('----- T5');
console.log("cfoo2('K')", cfoo2('K'));
console.log("cfoo0('a', 'b', 'c')", cfoo0('a', 'b', 'c'));
console.log("cfoo1('A', 'B')", cfoo1('A', 'B'));
console.log("cfoo3()", cfoo3);
})
/* Styles go here */