Function Pointer Currying

It is possible to curry a function pointer by providing partial (or all) arguments.

Currying is done via the curry keyword and produces a new function pointer which carries the curried arguments.

When the curried function pointer is called, the curried arguments are inserted starting from the left.

The actual call arguments should be reduced by the number of curried arguments.

fn mul(x, y) {                  // function with two parameters
    x * y
}

let func = mul;                 // <- de-sugars to 'Fn("mul")'

func.call(21, 2) == 42;         // two arguments are required for 'mul'

let curried = func.curry(21);   // currying produces a new function pointer which
                                // carries 21 as the first argument

let curried = curry(func, 21);  // function-call style also works

curried.call(2) == 42;          // <- de-sugars to 'func.call(21, 2)'
                                //    only one argument is now required