Last active
December 14, 2015 16:49
-
-
Save bongofury/5118266 to your computer and use it in GitHub Desktop.
js partial application pattern
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
//simple partial application | |
//-------------------------- | |
var partial = function() { | |
var fn = arguments[0]; | |
var slice = Array.prototype.slice; | |
var args = slice.call(arguments, 1); | |
return function() { | |
return fn.apply(null, args.concat(slice.call(arguments, 0))); | |
}; | |
}; | |
var addMultiple = function() { | |
var sum = 0; | |
for (var i = 0; i<arguments.length; i++) | |
sum += arguments[i]; | |
return sum; | |
} | |
var addSomething = partial(addMultiple, 1); | |
console.log(addSomething(10, 20)); | |
//partial application (any w/ placeholder) | |
//---------------------------------------- | |
var partialAny = (function () { | |
function partialAny(fn) { | |
var slice = Array.prototype.slice; | |
var args = slice.call(arguments, 1); | |
return function () { | |
var actualArgs = []; | |
var partial = slice.call(arguments, 0); | |
for (var i = 0; i < args.length; i++) { | |
actualArgs[i] = (args[i] === partialAny.placeholder) ? partial.shift() : args[i]; | |
} | |
return fn.apply(null, actualArgs.concat(partial)) | |
} | |
} | |
partialAny.placeholder = {}; | |
return partialAny; | |
}()); | |
function calcHex(a, b, c) { | |
return '#' + a + b + c; | |
} | |
var __ = partialAny.placeholder; | |
var setFirstValue = partialAny(calcHex, __, 'ff', 'aa'); | |
console.log(setFirstValue('ca')); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment