var makeFunctional = function(func) {
return new Proxy (func, {
get: function (target, name) {
if (target.__proto__.hasOwnProperty(name) || !window.hasOwnProperty(name))
return target[name];
return makeFunctional(function(x){return window[name](func(x))});
}
});
}
var plus1 = makeFunctional(function(x){ return x+1; });
var times2 = makeFunctional(function(x){ return x*2; });
console.log(plus1 . times2 . plus1 (2)); // ((2 + 1) * 2) + 1 = 7