DLang's Uniform Function Call Syntax (UFCS) port to JavaScript
It's mutates the
Object.prototype
, be careful when you are using it.
npm install ufcs
A free function can be called with a syntax that looks as if the function were a member function of its first parameter type.
Idea is simple, result is awesome.
// With UFCS, you can call this function ...
funcName ( firstParameter, [otherParameters...] )
// ... like this.
firstParameter.funcName ( [otherParameters...] )
Just wrap the function and ufcs
will handle rest.
var uniform = require('ufcs');
uniform(add);
function add(x, y) {
return x + y;
}
var result = add(2, 3); //=> 5
var result = (2).add(3); //=> 5
Since it mutates Object.prototype
you can use it with every type. So, you can chain the function.
var result = add(2, 3).add(4).add(5); //=> 2 + 3 + 4 + 5 = 14
uniform(add);
function add(x, y) { return x + y; }
uniform(remove);
function remove(x, y) { return x - y; }
uniform(multiply);
function multiply(x, y) { return x * y; }
uniform(divide);
function divide(x, y) { return x / y; }
(2).add(3).multiply(6).divide(2).remove(3).add(5).divide(5); //=> 3.4, It's ((((2 + 3) * 6) / 2) - 3 + 5) / 5
function add(x, y) { return x + y; }
function remove(x, y) { return x - y; }
function multiply(x, y) { return x * y; }
function divide(x, y) { return x / y; }
uniform(add, remove, multiply, divide);
(2).add(3).multiply(6).divide(2).remove(3).add(5).divide(5); //=> 3.4, It's ((((2 + 3) * 6) / 2) - 3 + 5) / 5
Alternative syntax:
uniform(
function add(x, y) { return x + y; },
function remove(x, y) { return x - y; },
function multiply(x, y) { return x * y; },
function divide(x, y) { return x / y; }
);
Normally, it's not allowed to uniform an anonymous function, but in this case, you can. Please do not use this
in these functions.
var Maths = {
add: function (x, y) { return x + y; },
remove: function (x, y) { return x - y; },
multiply: function (x, y) { return x * y; },
divide: function (x, y) { return x / y; }
};
uniform(Maths); // Uniform all the methods.
add(1, 2).divide(3); //=> 1
(1).add(2).divide(3); //=> 1
MIT.