Skip to content

Instantly share code, notes, and snippets.

@Gwash3189
Last active August 29, 2015 14:15
Show Gist options
  • Save Gwash3189/43f3bbfb48970b849dd0 to your computer and use it in GitHub Desktop.
Save Gwash3189/43f3bbfb48970b849dd0 to your computer and use it in GitHub Desktop.
advanced_is.js
var chainedAndFuncs = [];
var chainedOrFuncs = [];
var lastIntentEnum = {
none: 0,
and: 1,
or: 2
};
var lastChainedIntent = lastIntentEnum.none;
var convertArgumentsToArray = function(args) {
var a = Array.prototype.slice.call(args);
return a.sort();
};
var reverseForEach = function(arr, fun) {
var values = [];
for (var i = arr.length - 1; i > -1; --i) {
values.push(fun(arr[i], i, arr));
}
return values;
};
var compose = function() {
var funcs = Object.keys(arguments);
var outterArgs = arguments;
return function() {
var value;
var innerArgs = arguments
return reverseForEach(funcs, function(funcName) {
return outterArgs[funcName].apply(null, innerArgs);
});
};
};
var markFunctionAsAndChained = function(fun) {
if(chainedAndFuncs.indexOf(fun) === -1){
chainedAndFuncs.unshift(fun);
}
};
var markFunctionAsOrChained = function(fun) {
if(chainedOrFuncs.indexOf(fun) === -1){
chainedOrFuncs.unshift(fun);
}
};
var createNotFunctions = function(is) {
is.Not = {};
Object.keys(is).forEach(function(prop) {
if (prop !== "Not") {
is.Not[prop] = function() {
return ! unwrapFunction(is[prop]).apply(null, arguments);
};
}
});
return is;
};
var makeChainable = function(fun, addToArray) {
var obj = Object.defineProperty(fun, "And", {
get: function() {
lastChainedIntent = lastIntentEnum.and;
markFunctionAsAndChained(addToArray || fun);
return is;
}
});
return Object.defineProperty(fun, "Or", {
get: function() {
lastChainedIntent = lastIntentEnum.or;
markFunctionAsOrChained(addToArray || fun);
return is;
}
});
};
var unwrapFunction = function(fun) {
return fun.__original || fun;
};
var registerFunc = function(fun, makeChainable) {
var chainable = makeChainable(function() {
if(lastChainedIntent === lastIntentEnum.or){
markFunctionAsOrChained(fun);
} else {
markFunctionAsAndChained(fun);
}
var result = composeAllFunctions(chainedAndFuncs, chainedOrFuncs, arguments);
chainedAndFuncs = [];
return result;
}, fun);
chainable.__original = fun;
return chainable;
function composeFunctions(funcs, args) {
return compose.apply(null, funcs).apply(null, args);
}
function composeAllAndFunctions (chainedAndFuncs, args) {
if(chainedAndFuncs.length > 0){
var results = composeFunctions(chainedAndFuncs, args);
return results.filter(function(x){return x;}).length === results.length;
}
return true;
}
function composeAllOrFunctions (chainedOrFuncs, args) {
if(chainedOrFuncs.length > 0){
var results = composeFunctions(chainedOrFuncs, args);
return results.filter(function(x){return x;}).length > 0;
}
return true;
}
function composeAllFunctions(ands, ors, args){
return composeAllAndFunctions(ands,args) && composeAllOrFunctions(ors, args)
}
};
var makeApiChainable = function(is, registerFunc, makeChainable){
var newObj = {};
Object.keys(is).forEach(function(prop){
if(typeof is[prop] === "object"){
newObj[prop] = makeApiChainable(is[prop], registerFunc, makeChainable);
} else if(prop !== "Not") {
newObj[prop] = registerFunc(is[prop], registerFunc, makeChainable)
}
});
return newObj;
};
var api = {
Null: function(value) {
return value === null;
},
Undefined: function(value) {
return value === undefined;
},
Defined: function(value) {
return value !== undefined
},
String: function(value) {
return typeof value === "string";
},
Empty: function(value){
return (value.length || [].length) <= 0;
},
Number: function(value) {
return typeof value === "number";
},
Array: function(value){
return value instanceof Array;
},
Date: function(value){
return value instanceof Date;
}
};
debugger;
var is = makeApiChainable(createNotFunctions(api),function(fun){ return registerFunc(fun, makeChainable)}, makeChainable);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment