Last active
November 19, 2016 20:49
-
-
Save koshuang/5996002 to your computer and use it in GitHub Desktop.
javascript functional programing example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 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