Last active
October 4, 2015 07:43
-
-
Save RSNara/b2a66944370edfddfb3b to your computer and use it in GitHub Desktop.
Just a short implementation of curry and compose.
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
var _ = (function() { | |
var _ = { | |
curry: curry, | |
compose: compose | |
}; | |
return _; | |
function realArgumentCount(unreal, args) { | |
var count = 0; | |
for (var i = 0; i < args.length; i++) { | |
if (args[i] !== unreal) { | |
count++; | |
} | |
} | |
return count; | |
} | |
function merge(unreal, args1, args2) { | |
var args = []; | |
for (var f=0, i=0; f < args1.length || i < args2.length; f++) { | |
if (args1[f] !== unreal && f < args1.length) { | |
args.push(args1[f]); | |
} else { | |
args.push(args2[i++]); | |
} | |
} | |
return args; | |
} | |
function curry(fn) { | |
return function func() { | |
var args = new Array(arguments.length); | |
for (var i=0;i<arguments.length;i++){args[i]=arguments[i];} | |
if (realArgumentCount(_, args) < fn.length) { | |
return function inner(){ | |
var innerArgs = new Array(arguments.length); | |
for (var i=0;i<arguments.length;i++){innerArgs[i]=arguments[i];} | |
return func.apply(this, merge(_, args, innerArgs)); | |
} | |
} else { | |
return fn.apply(this, args); | |
} | |
} | |
} | |
function compose() { | |
var fns = new Array(arguments.length); | |
for (var i=0;i<arguments.length;i++){fns[i]=arguments[i];} | |
return function(value) { | |
for (var i = 0; i < fns.length; i++) { | |
// expect(fns[i]).to.be.a('function'); | |
value = fns[i].call(this, value); | |
} | |
return value; | |
}; | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment