{"version":3,"file":"frameComparisons.mjs","sources":["../../../src/dataframe/frameComparisons.ts"],"sourcesContent":["import { isEqual } from 'lodash';\n\nimport { DataFrame } from '../types/dataFrame';\n\n/**\n * Returns true if both frames have the same name, fields, labels and configs.\n *\n * @example\n * To compare multiple frames use:\n * ```\n * compareArrayValues(a, b, framesHaveSameStructure);\n * ```\n * @beta\n */\nexport function compareDataFrameStructures(a: DataFrame, b: DataFrame, skipConfig?: boolean): boolean {\n  if (a === b) {\n    return true;\n  }\n\n  if (a?.fields?.length !== b?.fields?.length) {\n    return false;\n  }\n\n  if (a.name !== b.name) {\n    return false;\n  }\n\n  for (let i = 0; i < a.fields.length; i++) {\n    const fA = a.fields[i];\n    const fB = b.fields[i];\n\n    if (fA.type !== fB.type || fA.name !== fB.name) {\n      return false;\n    }\n\n    // Do not check the config fields\n    if (skipConfig) {\n      continue;\n    }\n\n    // Check if labels are different\n    if (fA.labels && fB.labels && !shallowCompare(fA.labels, fB.labels)) {\n      return false;\n    }\n\n    const cfgA = fA.config;\n    const cfgB = fB.config;\n\n    if (Object.keys(cfgA).length !== Object.keys(cfgB).length) {\n      return false;\n    }\n\n    let key: keyof typeof cfgA;\n    for (key in cfgA) {\n      if (!(key in cfgB)) {\n        return false;\n      }\n\n      if (key === 'interval') {\n        continue;\n      }\n\n      // Deep comparison on all object properties\n      if (!isEqual(cfgA[key], cfgB[key])) {\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\n/**\n * Check if all values in two arrays match the compare function\n *\n * @beta\n */\nexport function compareArrayValues<T>(a: T[], b: T[], cmp: (a: T, b: T) => boolean) {\n  if (a === b) {\n    return true;\n  }\n  if (a?.length !== b?.length) {\n    return false;\n  }\n  for (let i = 0; i < a.length; i++) {\n    if (!cmp(a[i], b[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\ntype Cmp = (valA: unknown, valB: unknown) => boolean;\n\nconst defaultCmp: Cmp = (a, b) => a === b;\n\n/**\n * Checks if two objects are equal shallowly\n *\n * @beta\n */\nexport function shallowCompare<T extends {}>(a: T, b: T, cmp: Cmp = defaultCmp) {\n  if (a === b) {\n    return true;\n  }\n\n  if (Object.keys(a).length !== Object.keys(b).length) {\n    return false;\n  }\n\n  let key: keyof typeof a;\n  for (key in a) {\n    if (!cmp(a[key], b[key])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n"],"names":[],"mappings":"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"}