1var Stack = require('./_Stack'),
2    baseIsEqual = require('./_baseIsEqual');
3
4/** Used to compose bitmasks for value comparisons. */
5var COMPARE_PARTIAL_FLAG = 1,
6    COMPARE_UNORDERED_FLAG = 2;
7
8/**
9 * The base implementation of `_.isMatch` without support for iteratee shorthands.
10 *
11 * @private
12 * @param {Object} object The object to inspect.
13 * @param {Object} source The object of property values to match.
14 * @param {Array} matchData The property names, values, and compare flags to match.
15 * @param {Function} [customizer] The function to customize comparisons.
16 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
17 */
18function baseIsMatch(object, source, matchData, customizer) {
19  var index = matchData.length,
20      length = index,
21      noCustomizer = !customizer;
22
23  if (object == null) {
24    return !length;
25  }
26  object = Object(object);
27  while (index--) {
28    var data = matchData[index];
29    if ((noCustomizer && data[2])
30          ? data[1] !== object[data[0]]
31          : !(data[0] in object)
32        ) {
33      return false;
34    }
35  }
36  while (++index < length) {
37    data = matchData[index];
38    var key = data[0],
39        objValue = object[key],
40        srcValue = data[1];
41
42    if (noCustomizer && data[2]) {
43      if (objValue === undefined && !(key in object)) {
44        return false;
45      }
46    } else {
47      var stack = new Stack;
48      if (customizer) {
49        var result = customizer(objValue, srcValue, key, object, source, stack);
50      }
51      if (!(result === undefined
52            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
53            : result
54          )) {
55        return false;
56      }
57    }
58  }
59  return true;
60}
61
62module.exports = baseIsMatch;
63