Last active
August 29, 2015 14:15
-
-
Save Gwash3189/43f3bbfb48970b849dd0 to your computer and use it in GitHub Desktop.
advanced_is.js
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 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