Skip to content

Instantly share code, notes, and snippets.

@RSNara
Last active October 4, 2015 07:43
Show Gist options
  • Save RSNara/b2a66944370edfddfb3b to your computer and use it in GitHub Desktop.
Save RSNara/b2a66944370edfddfb3b to your computer and use it in GitHub Desktop.
Just a short implementation of curry and compose.
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