{
  "version": 3,
  "sources": ["../../../../src/core/utils/range-utils.ts"],
  "sourcesContent": [
    "/**\n * Range utility functions for handling range arithmetic and operations\n */\n\nimport type { SpreadsheetRange, SpreadsheetRangeEnd } from \"../types.cjs\";\n\n/**\n * Check if two ranges intersect\n */\nexport function rangesIntersect(\n  range1: SpreadsheetRange,\n  range2: SpreadsheetRange\n): boolean {\n  // Get finite end values\n  const r1EndCol =\n    range1.end.col.type === \"number\" ? range1.end.col.value : Infinity;\n  const r1EndRow =\n    range1.end.row.type === \"number\" ? range1.end.row.value : Infinity;\n  const r2EndCol =\n    range2.end.col.type === \"number\" ? range2.end.col.value : Infinity;\n  const r2EndRow =\n    range2.end.row.type === \"number\" ? range2.end.row.value : Infinity;\n\n  // Check if ranges overlap\n  const colOverlap =\n    range1.start.col <= r2EndCol && range2.start.col <= r1EndCol;\n  const rowOverlap =\n    range1.start.row <= r2EndRow && range2.start.row <= r1EndRow;\n\n  return colOverlap && rowOverlap;\n}\n\n/**\n * Check if one range is completely contained within another\n */\nexport function isRangeContained(\n  inner: SpreadsheetRange,\n  outer: SpreadsheetRange\n): boolean {\n  const innerEndCol =\n    inner.end.col.type === \"number\" ? inner.end.col.value : Infinity;\n  const innerEndRow =\n    inner.end.row.type === \"number\" ? inner.end.row.value : Infinity;\n  const outerEndCol =\n    outer.end.col.type === \"number\" ? outer.end.col.value : Infinity;\n  const outerEndRow =\n    outer.end.row.type === \"number\" ? outer.end.row.value : Infinity;\n\n  return (\n    inner.start.col >= outer.start.col &&\n    inner.start.row >= outer.start.row &&\n    innerEndCol <= outerEndCol &&\n    innerEndRow <= outerEndRow\n  );\n}\n\n/**\n * Subtract one range from another, returning the remaining ranges\n * Returns an array of ranges representing `original - subtract`\n * \n * For infinite ranges in the original:\n * - If subtract range is finite, we still return the infinite portions\n * - This can result in up to 4 ranges (4 sides around the subtracted area)\n */\nexport function subtractRange(\n  original: SpreadsheetRange,\n  subtract: SpreadsheetRange\n): SpreadsheetRange[] {\n  // If ranges don't intersect, return original unchanged\n  if (!rangesIntersect(original, subtract)) {\n    return [original];\n  }\n\n  // If original is completely contained in subtract, return empty\n  if (isRangeContained(original, subtract)) {\n    return [];\n  }\n\n  const result: SpreadsheetRange[] = [];\n\n  // Get finite end values for easier arithmetic\n  const origEndCol =\n    original.end.col.type === \"number\" ? original.end.col.value : Infinity;\n  const origEndRow =\n    original.end.row.type === \"number\" ? original.end.row.value : Infinity;\n  const subEndCol =\n    subtract.end.col.type === \"number\" ? subtract.end.col.value : Infinity;\n  const subEndRow =\n    subtract.end.row.type === \"number\" ? subtract.end.row.value : Infinity;\n\n  // Calculate the intersection bounds\n  const intersectStartCol = Math.max(original.start.col, subtract.start.col);\n  const intersectStartRow = Math.max(original.start.row, subtract.start.row);\n  const intersectEndCol = Math.min(origEndCol, subEndCol);\n  const intersectEndRow = Math.min(origEndRow, subEndRow);\n\n  // Create up to 4 rectangles around the intersection:\n  // Top, Bottom, Left, Right\n\n  // Top rectangle (above the intersection)\n  if (original.start.row < intersectStartRow) {\n    result.push({\n      start: { col: original.start.col, row: original.start.row },\n      end: {\n        col: createRangeEnd(origEndCol),\n        row: createRangeEnd(intersectStartRow - 1),\n      },\n    });\n  }\n\n  // Bottom rectangle (below the intersection)\n  if (origEndRow > intersectEndRow) {\n    result.push({\n      start: { col: original.start.col, row: intersectEndRow + 1 },\n      end: {\n        col: createRangeEnd(origEndCol),\n        row: createRangeEnd(origEndRow),\n      },\n    });\n  }\n\n  // Left rectangle (left of the intersection, within the vertical bounds of intersection)\n  if (original.start.col < intersectStartCol) {\n    result.push({\n      start: { col: original.start.col, row: intersectStartRow },\n      end: {\n        col: createRangeEnd(intersectStartCol - 1),\n        row: createRangeEnd(intersectEndRow),\n      },\n    });\n  }\n\n  // Right rectangle (right of the intersection, within the vertical bounds of intersection)\n  if (origEndCol > intersectEndCol) {\n    result.push({\n      start: { col: intersectEndCol + 1, row: intersectStartRow },\n      end: {\n        col: createRangeEnd(origEndCol),\n        row: createRangeEnd(intersectEndRow),\n      },\n    });\n  }\n\n  return result;\n}\n\n/**\n * Helper to create a SpreadsheetRangeEnd from a number (handles infinity)\n */\nfunction createRangeEnd(value: number): SpreadsheetRangeEnd {\n  if (!isFinite(value)) {\n    return { type: \"infinity\", sign: \"positive\" };\n  }\n  return { type: \"number\", value };\n}\n\n/**\n * Calculate the intersection of two ranges\n * Returns the overlapping rectangle, or null if ranges don't intersect\n */\nexport function intersectRanges(\n  range1: SpreadsheetRange,\n  range2: SpreadsheetRange\n): SpreadsheetRange | null {\n  if (!rangesIntersect(range1, range2)) {\n    return null;\n  }\n\n  // Get finite end values\n  const r1EndCol =\n    range1.end.col.type === \"number\" ? range1.end.col.value : Infinity;\n  const r1EndRow =\n    range1.end.row.type === \"number\" ? range1.end.row.value : Infinity;\n  const r2EndCol =\n    range2.end.col.type === \"number\" ? range2.end.col.value : Infinity;\n  const r2EndRow =\n    range2.end.row.type === \"number\" ? range2.end.row.value : Infinity;\n\n  // Calculate intersection bounds\n  const startCol = Math.max(range1.start.col, range2.start.col);\n  const startRow = Math.max(range1.start.row, range2.start.row);\n  const endCol = Math.min(r1EndCol, r2EndCol);\n  const endRow = Math.min(r1EndRow, r2EndRow);\n\n  return {\n    start: { col: startCol, row: startRow },\n    end: {\n      col: createRangeEnd(endCol),\n      row: createRangeEnd(endRow),\n    },\n  };\n}\n\n"
  ],
  "mappings": "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",
  "debugId": "C7B123826D489BDD64756E2164756E21",
  "names": []
}