You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
1.9 KiB
99 lines
1.9 KiB
/*! |
|
* make-iterator <https://github.com/jonschlinkert/make-iterator> |
|
* |
|
* Copyright (c) 2014-2018, Jon Schlinkert. |
|
* Released under the MIT License. |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var typeOf = require('kind-of'); |
|
|
|
module.exports = function makeIterator(target, thisArg) { |
|
switch (typeOf(target)) { |
|
case 'undefined': |
|
case 'null': |
|
return noop; |
|
case 'function': |
|
// function is the first to improve perf (most common case) |
|
// also avoid using `Function#call` if not needed, which boosts |
|
// perf a lot in some cases |
|
return (typeof thisArg !== 'undefined') ? function(val, i, arr) { |
|
return target.call(thisArg, val, i, arr); |
|
} : target; |
|
case 'object': |
|
return function(val) { |
|
return deepMatches(val, target); |
|
}; |
|
case 'regexp': |
|
return function(str) { |
|
return target.test(str); |
|
}; |
|
case 'string': |
|
case 'number': |
|
default: { |
|
return prop(target); |
|
} |
|
} |
|
}; |
|
|
|
function containsMatch(array, value) { |
|
var len = array.length; |
|
var i = -1; |
|
|
|
while (++i < len) { |
|
if (deepMatches(array[i], value)) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
function matchArray(arr, value) { |
|
var len = value.length; |
|
var i = -1; |
|
|
|
while (++i < len) { |
|
if (!containsMatch(arr, value[i])) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
function matchObject(obj, value) { |
|
for (var key in value) { |
|
if (value.hasOwnProperty(key)) { |
|
if (deepMatches(obj[key], value[key]) === false) { |
|
return false; |
|
} |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
/** |
|
* Recursively compare objects |
|
*/ |
|
|
|
function deepMatches(val, value) { |
|
if (typeOf(val) === 'object') { |
|
if (Array.isArray(val) && Array.isArray(value)) { |
|
return matchArray(val, value); |
|
} else { |
|
return matchObject(val, value); |
|
} |
|
} else { |
|
return val === value; |
|
} |
|
} |
|
|
|
function prop(name) { |
|
return function(obj) { |
|
return obj[name]; |
|
}; |
|
} |
|
|
|
function noop(val) { |
|
return val; |
|
}
|
|
|