Skip to content

Instantly share code, notes, and snippets.

@leocavalcante
Created March 3, 2013 19:51
Show Gist options
  • Save leocavalcante/5077950 to your computer and use it in GitHub Desktop.
Save leocavalcante/5077950 to your computer and use it in GitHub Desktop.
var MOUT = window.MOUT || {};
(function (module) {
var _rKind = /^\[object (.*)\]$/,
_toString = Object.prototype.toString,
UNDEF;
function kindOf(val) {
if (val === null) {
return 'Null';
} else if (val === UNDEF) {
return 'Undefined';
} else {
return _rKind.exec( _toString.call(val) )[1];
}
}
function isKind (val, kind) {
return kindOf(val) === kind;
}
var isArray = Array.isArray || function (val) {
return isKind(val, 'Array');
};
var _hasDontEnumBug,
_dontEnums;
function checkDontEnum(){
_dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
];
_hasDontEnumBug = true;
for (var key in {'toString': null}) {
_hasDontEnumBug = false;
}
}
function forIn(obj, fn, thisObj){
var key, i = 0;
if (_hasDontEnumBug == null) checkDontEnum();
for (key in obj) {
if (exec(fn, obj, key, thisObj) === false) {
break;
}
}
if (_hasDontEnumBug) {
while (key = _dontEnums[i++]) {
if (obj[key] !== Object.prototype[key]) {
if (exec(fn, obj, key, thisObj) === false) {
break;
}
}
}
}
}
function exec(fn, obj, key, thisObj){
return fn.call(thisObj, obj[key], key, obj);
}
function hasOwn(obj, prop){
return Object.prototype.hasOwnProperty.call(obj, prop);
}
function forOwn(obj, fn, thisObj){
forIn(obj, function(val, key){
if (hasOwn(obj, key)) {
return fn.call(thisObj, obj[key], key, obj);
}
});
}
function containsMatch(array, pattern) {
var i = -1, length = array.length;
while (++i < length) {
if (deepMatches(array[i], pattern)) {
return true;
}
}
return false;
}
function matchArray(target, pattern) {
var i = -1, patternLength = pattern.length;
while (++i < patternLength) {
if (!containsMatch(target, pattern[i])) {
return false;
}
}
return true;
}
function matchObject(target, pattern) {
var result = true;
forOwn(pattern, function(val, key) {
if (!deepMatches(target[key], val)) {
return (result = false);
}
});
return result;
}
function deepMatches(target, pattern){
if (target && typeof target === 'object') {
if (isArray(target) && isArray(pattern)) {
return matchArray(target, pattern);
} else {
return matchObject(target, pattern);
}
} else {
return target === pattern;
}
}
function makeIterator(src, thisObj){
switch(typeof src) {
case 'object':
return (src != null)? function(val, key, target){
return deepMatches(val, src);
} : src;
}
}
function findIndex(arr, iterator, thisObj){
iterator = makeIterator(iterator, thisObj);
var i = -1, n = arr.length;
while (++i < n) {
if (iterator(arr[i], i, arr)) {
return i;
}
}
return -1;
}
function find(arr, iterator, thisObj){
var idx = findIndex(arr, iterator, thisObj);
return idx >= 0? arr[idx] : void(0);
}
module.find = module.find || find;
}(MOUT));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment