Skip to content

Instantly share code, notes, and snippets.

@koshuang
Last active November 19, 2016 20:49
Show Gist options
  • Save koshuang/5996002 to your computer and use it in GitHub Desktop.
Save koshuang/5996002 to your computer and use it in GitHub Desktop.
javascript functional programing example
/** functional.js **/
function flip (func) {
// preserve f
// construct g
return function() {
var args = Array.prototype.slice.call(arguments);
// flip arguments when called
return func.apply(null, args.reverse());
};
}
function asArray(quasiArray, start) {
var result = [];
for (var i = (start || 0); i < quasiArray.length; i++)
result.push(quasiArray[i]);
return result;
}
function partial(func) {
var fixedArgs = asArray(arguments, 1);
return function(){
return func.apply(null, fixedArgs.concat(asArray(arguments)));
};
}
function compose(func1, func2) {
return function() {
return func1(func2.apply(null, arguments));
};
}
function wrap(func1, func2) {
return function() {
var arr = [];
arr.push(func2);
arr = arr.concat(asArray(arguments));
var fun = partial.apply(null, arr);
func1.call(null, fun);
};
}
var flow = flip(compose);
/** utils.js **/
function log(x) {
console.log(x);
}
function add(x, y) {
return x + y;
}
function sub(x, y) {
return x - y;
}
function multiple(x, y) {
return x * y;
}
function div(x, y) {
return x / y;
}
var newSetTimeout = flip(setTimeout); //newSetTimeout(timeout, func)
/** example 1 **/
var double = partial(multiple, 2); //double(int)
var add_and_double = compose(double, add);
var result = add_and_double(1, 2);
log(result);
/** example 2 **/
var delay = partial(newSetTimeout, 1000); //delay(func)
var logDiv = flow(div, log); //divAndLog(x, y)
var delayDiv = wrap(delay, logDiv); //delayDiv(x, y)
delayDiv(1, 2);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment