{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/client/reactive/utils/equality.js"],"names":["shallowEqualsArray","arr1","arr2","length","index","shallowEqualsSet","set1","set2","size","val","has","shallowEqualsMap","map1","map2","key","value","entries","get","shallowEquals","obj1","obj2","keys1","Object","keys","keys2","hasOwnProperty2","prototype","hasOwnProperty","bind","valueA","valueB","deepEquals","objA","objB","comparedObjects","Map","ensureComparedObjectsFor","obj","set","Set","comparedObjectsHAS","comparedObjectsADD","add","isAlreadyCompared","markAsAlreadyCompared","objectsStillToCompare","currentPair","pop","push"],"mappings":"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","file":"equality.js","sourcesContent":["// checks elements of arrays pairwise for identity equality\nexport function shallowEqualsArray(arr1, arr2) {\n  if (arr1 === arr2) { return true; }\n  if (arr1.length !== arr2.length) { return false; }\n\n  for (let index = 0; index < arr1.length; index++) {\n    if (arr1[index] !== arr2[index]) { return false; }\n  }\n\n  return true;\n}\n\n// checks elements for identity equality\nexport function shallowEqualsSet(set1, set2) {\n  if (set1 === set2) { return true; }\n  if (set1.size !== set2.size) return false;\n  \n  for (let val of set1) {\n    if (!set2.has(val)) { return false; }\n  }\n  \n  return true;\n}\n\n// checks keys and values for identity equality\nexport function shallowEqualsMap(map1, map2) {\n  if (map1 === map2) { return true; }\n  if (map1.size !== map2.size) return false;\n  \n  for (let [key, value] of map1.entries()) {\n    if (value !== map2.get(key)) { return false; }\n  }\n  \n  return true;\n}\n\n\n// checks all properties for identity equality\nexport function shallowEquals(obj1, obj2) {\n  // strict equality\n  if (obj1 === obj2) { return true; }\n  \n  // only for object-like values\n  if (typeof obj1 !== \"object\" || !obj1 || typeof obj2 !== \"object\" || !obj2) {\n    return false;\n  }\n\n  const keys1 = Object.keys(obj1);\n  const keys2 = Object.keys(obj2);\n\n  // same number of keys\n  if (keys1.length !== keys2.length) {\n    return false;\n  }\n\n  const hasOwnProperty2 = Object.prototype.hasOwnProperty.bind(obj2);\n\n  // Test for A's keys different from B.\n  for (let index = 0; index < keys1.length; index++) {\n    const key = keys1[index];\n\n    if (!hasOwnProperty2(key)) {\n      return false;\n    }\n\n    const valueA = obj1[key];\n    const valueB = obj2[key];\n\n    if(valueA !== valueB) { return false; }\n  }\n\n  return true;\n}\n\n\n// deeply checks all properties for equality\nexport function deepEquals(objA, objB) {\n  \n  // objects that are already marked as compared\n  const comparedObjects = new Map(); // Map<Object, Set<Object>>\n  function ensureComparedObjectsFor(obj) {\n    if(!comparedObjects.has(obj)) {\n      comparedObjects.set(obj, new Set());\n    }\n  }\n  function comparedObjectsHAS(obj, obj2) {\n    ensureComparedObjectsFor(obj);\n    return comparedObjects.get(obj).has(obj2);\n  }\n  function comparedObjectsADD(obj, obj2) {\n    ensureComparedObjectsFor(obj);\n    comparedObjects.get(obj).add(obj2);\n  }\n\n  function isAlreadyCompared(obj1, obj2) {\n    return comparedObjectsHAS(obj1, obj2) || comparedObjectsHAS(obj2, obj1);\n  }\n  function markAsAlreadyCompared(obj1, obj2) {\n    comparedObjectsADD(obj1, obj2);\n    comparedObjectsADD(obj2, obj1);\n  }\n\n  const objectsStillToCompare = [[objA,objB]];\n  \n  let currentPair;\n  while(currentPair = objectsStillToCompare.pop()) {\n    const [obj1, obj2] = currentPair;\n    \n    // strict equality\n    if (obj1 === obj2) { continue; }\n\n    // only for object-like values\n    if (typeof obj1 !== \"object\" || !obj1 || typeof obj2 !== \"object\" || !obj2) {\n      return false;\n    }\n\n    const keys1 = Object.keys(obj1);\n    const keys2 = Object.keys(obj2);\n\n    // same number of keys\n    if (keys1.length !== keys2.length) {\n      return false;\n    }\n\n    const hasOwnProperty2 = Object.prototype.hasOwnProperty.bind(obj2);\n\n    // Test for A's keys different from B.\n    for (let index = 0; index < keys1.length; index++) {\n      const key = keys1[index];\n\n      if (!hasOwnProperty2(key)) {\n        return false;\n      }\n\n      const valueA = obj1[key];\n      const valueB = obj2[key];\n\n      if(!isAlreadyCompared(valueA, valueB)) {\n        markAsAlreadyCompared(valueA, valueB);\n        objectsStillToCompare.push([valueA, valueB]);\n      }\n    }\n  }\n\n  return true;\n}\n"]}