<!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 */