Home

Awesome

UFCS.js

DLang's Uniform Function Call Syntax (UFCS) port to JavaScript

It's mutates the Object.prototype, be careful when you are using it.

Install

npm install ufcs

Overview

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...] )

Uniform Wrapper

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

Chaining

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

Examples

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

Multiple 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; }

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; }
);

Object Uniform

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

License

MIT.