@ricsam/formula-engine 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cjs/core/commands/table-commands.cjs +158 -10
  2. package/dist/cjs/core/commands/table-commands.cjs.map +3 -3
  3. package/dist/cjs/core/commands/types.cjs.map +2 -2
  4. package/dist/cjs/core/engine-snapshot.cjs +2 -2
  5. package/dist/cjs/core/engine-snapshot.cjs.map +2 -2
  6. package/dist/cjs/core/engine.cjs +24 -3
  7. package/dist/cjs/core/engine.cjs.map +3 -3
  8. package/dist/cjs/core/managers/dependency-manager.cjs +157 -2
  9. package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
  10. package/dist/cjs/core/managers/evaluation-manager.cjs +32 -1
  11. package/dist/cjs/core/managers/evaluation-manager.cjs.map +3 -3
  12. package/dist/cjs/core/managers/frontier-dependency-manager.cjs +4 -4
  13. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +3 -3
  14. package/dist/cjs/core/managers/workbook-manager.cjs +48 -4
  15. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  16. package/dist/cjs/evaluator/evaluation-context.cjs.map +2 -2
  17. package/dist/cjs/evaluator/formula-evaluator.cjs.map +1 -1
  18. package/dist/cjs/package.json +1 -1
  19. package/dist/mjs/core/commands/table-commands.mjs +163 -11
  20. package/dist/mjs/core/commands/table-commands.mjs.map +3 -3
  21. package/dist/mjs/core/commands/types.mjs.map +2 -2
  22. package/dist/mjs/core/engine-snapshot.mjs +2 -2
  23. package/dist/mjs/core/engine-snapshot.mjs.map +2 -2
  24. package/dist/mjs/core/engine.mjs +24 -3
  25. package/dist/mjs/core/engine.mjs.map +3 -3
  26. package/dist/mjs/core/managers/dependency-manager.mjs +157 -2
  27. package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
  28. package/dist/mjs/core/managers/evaluation-manager.mjs +32 -1
  29. package/dist/mjs/core/managers/evaluation-manager.mjs.map +3 -3
  30. package/dist/mjs/core/managers/frontier-dependency-manager.mjs +4 -4
  31. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +3 -3
  32. package/dist/mjs/core/managers/workbook-manager.mjs +48 -4
  33. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  34. package/dist/mjs/evaluator/evaluation-context.mjs.map +2 -2
  35. package/dist/mjs/evaluator/formula-evaluator.mjs.map +1 -1
  36. package/dist/mjs/package.json +1 -1
  37. package/dist/types/core/commands/types.d.ts +5 -0
  38. package/dist/types/core/engine-snapshot.d.ts +13 -13
  39. package/dist/types/core/engine.d.ts +12 -4
  40. package/dist/types/core/managers/dependency-manager.d.ts +7 -0
  41. package/dist/types/core/managers/evaluation-manager.d.ts +1 -0
  42. package/dist/types/core/managers/workbook-manager.d.ts +3 -0
  43. package/package.json +3 -2
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/managers/evaluation-manager.ts"],
4
4
  "sourcesContent": [
5
- "import { flags } from \"../../debug/flags.mjs\";\nimport { AstEvaluationNode } from \"../../evaluator/dependency-nodes/ast-evaluation-node.mjs\";\nimport { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.mjs\";\nimport { EvaluationContext } from \"../../evaluator/evaluation-context.mjs\";\nimport {\n EvaluationError,\n SheetNotFoundError,\n} from \"../../evaluator/evaluation-error.mjs\";\nimport { RangeEvaluationNode } from \"../../evaluator/range-evaluation-node.mjs\";\nimport { normalizeSerializedCellValue } from \"../../parser/formatter.mjs\";\nimport { FormulaEvaluator } from \"../../evaluator/formula-evaluator.mjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellInRangeResult,\n type CellValue,\n type ErrorEvaluationResult,\n type EvaluateAllCellsResult,\n type EvaluationOrder,\n type FunctionEvaluationResult,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type ValueEvaluationResult,\n} from \"../types.mjs\";\nimport {\n captureEvaluationErrors,\n getAbsoluteRange,\n cellAddressToKey,\n checkRangeIntersection,\n getCellReference,\n getRangeIntersection,\n getRelativeRange,\n isCellInRange,\n parseCellReference,\n rangeAddressToKey,\n} from \"../utils.mjs\";\nimport type { DependencyManager } from \"./dependency-manager.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.mjs\";\nimport { EmptyCellEvaluationNode } from \"../../evaluator/dependency-nodes/empty-cell-evaluation-node.mjs\";\nimport type { TableManager } from \"./table-manager.mjs\";\nimport type { DependencyNode } from \"./dependency-node.mjs\";\nimport { VirtualCellValueNode } from \"../../evaluator/dependency-nodes/virtual-cell-value-node.mjs\";\nimport { ResourceDependencyNode } from \"../../evaluator/dependency-nodes/resource-dependency-node.mjs\";\nimport type {\n NodeSnapshotId,\n SerializedCellInRangeResultSnapshot,\n SerializedErrorEvaluationResultSnapshot,\n SerializedEvaluateAllCellsResultSnapshot,\n SerializedFunctionEvaluationResultSnapshot,\n SerializedSingleEvaluationResultSnapshot,\n SerializedSpillMetaEvaluationResultSnapshot,\n SerializedSpilledValuesEvaluationResultSnapshot,\n} from \"../engine-snapshot.mjs\";\nimport type { MutationInvalidation } from \"../commands/types.mjs\";\n\nexport class EvaluationManager {\n private isEvaluating = false;\n\n constructor(\n private workbookManager: WorkbookManager,\n private tableManager: TableManager,\n private formulaEvaluator: FormulaEvaluator,\n private dependencyManager: DependencyManager\n ) {}\n\n clearEvaluationCache(): void {\n this.dependencyManager.clearEvaluationCache();\n }\n\n invalidateFromMutation(footprint: MutationInvalidation): void {\n this.dependencyManager.invalidateFromMutation(footprint);\n }\n\n evaluationResultToSerializedValue(\n evaluation: SingleEvaluationResult,\n cellAddress: CellAddress,\n debug?: boolean\n ): SerializedCellValue {\n if (\n evaluation.type !== \"error\" &&\n evaluation.type !== \"awaiting-evaluation\"\n ) {\n const value = evaluation.result;\n\n return value.type === \"infinity\"\n ? value.sign === \"positive\"\n ? \"INFINITY\"\n : \"-INFINITY\"\n : value.value;\n }\n\n if (evaluation.type === \"awaiting-evaluation\") {\n return (\n evaluation.errAddress.key +\n \" is awaiting evaluation of \" +\n evaluation.waitingFor.key\n );\n }\n\n if (debug) {\n const errAddress = evaluation.errAddress.key;\n if (errAddress === cellAddressToKey(cellAddress)) {\n return evaluation.err + \" \" + evaluation.message;\n }\n return (\n evaluation.err +\n \" in \" +\n evaluation.errAddress.key +\n \" \" +\n evaluation.message\n );\n }\n\n return evaluation.err;\n }\n\n private buildSnapshotOrigin(\n node: CellValueNode | SpillMetaNode | AstEvaluationNode\n ): CellAddress {\n if (\"cellAddress\" in node) {\n return node.cellAddress;\n }\n\n const contextDependency = node.getContextDependency();\n return {\n workbookName: contextDependency.workbookName ?? \"__snapshot__\",\n sheetName: contextDependency.sheetName ?? \"__snapshot__\",\n colIndex: contextDependency.colIndex ?? 0,\n rowIndex: contextDependency.rowIndex ?? 0,\n };\n }\n\n private serializeErrorEvaluationResultSnapshot(\n evaluation: Exclude<ErrorEvaluationResult, { type: \"awaiting-evaluation\" }>,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedErrorEvaluationResultSnapshot {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddressId: getNodeSnapshotId(evaluation.errAddress),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeSingleEvaluationResultSnapshot(\n evaluation: SingleEvaluationResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedSingleEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n deserializeSingleEvaluationResultSnapshot(\n evaluation: SerializedSingleEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SingleEvaluationResult {\n if (evaluation.type === \"error\") {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddress: resolveNodeSnapshotId(evaluation.errAddressId),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeEvaluateAllCellsResultSnapshot(\n evaluation: EvaluateAllCellsResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedEvaluateAllCellsResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n const values: SerializedCellInRangeResultSnapshot[] = [];\n for (const value of evaluation.values) {\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n value.result,\n getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: value.relativePos,\n result: serialized,\n });\n }\n\n return {\n type: \"values\",\n values,\n };\n }\n\n deserializeEvaluateAllCellsResultSnapshot(\n evaluation: SerializedEvaluateAllCellsResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): EvaluateAllCellsResult {\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as ErrorEvaluationResult;\n }\n\n return {\n type: \"values\",\n values: evaluation.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n };\n }\n\n serializeFunctionEvaluationResultSnapshot(\n evaluation: FunctionEvaluationResult,\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedFunctionEvaluationResultSnapshot | undefined {\n if (evaluation.type !== \"spilled-values\") {\n return this.serializeSingleEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const origin = this.buildSnapshotOrigin(options.sourceNode);\n const spillArea = evaluation.spillArea(origin);\n const relativeSpillArea = getRelativeRange(spillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n });\n\n if (evaluation.sourceRange) {\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"source-range\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n },\n };\n }\n\n if (\n relativeSpillArea.width.type !== \"number\" ||\n relativeSpillArea.height.type !== \"number\"\n ) {\n return undefined;\n }\n\n const context = new EvaluationContext(\n this.tableManager,\n options.sourceNode,\n origin\n );\n const values: SerializedCellInRangeResultSnapshot[] = [];\n\n for (let y = 0; y < relativeSpillArea.height.value; y++) {\n for (let x = 0; x < relativeSpillArea.width.value; x++) {\n const result = captureEvaluationErrors(options.sourceNode, () =>\n evaluation.evaluate({ x, y }, context)\n );\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n result,\n options.getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: { x, y },\n result: serialized,\n });\n }\n }\n\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"materialized\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n values,\n },\n };\n }\n\n deserializeFunctionEvaluationResultSnapshot(\n evaluation: SerializedFunctionEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): FunctionEvaluationResult {\n if (evaluation.type !== \"spilled-values\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n );\n }\n\n const spillSnapshot = evaluation.spill;\n if (spillSnapshot.kind === \"materialized\") {\n const values = new Map(\n spillSnapshot.values.map((value) => [\n `${value.relativePos.x},${value.relativePos.y}`,\n this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n ])\n );\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset) =>\n values.get(`${spillOffset.x},${spillOffset.y}`) ?? {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n },\n evaluateAllCells: () => ({\n type: \"values\",\n values: spillSnapshot.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n }),\n };\n }\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset, context) => {\n const cellAddress: CellAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n colIndex: spillSnapshot.sourceRange.range.start.col + spillOffset.x,\n rowIndex: spillSnapshot.sourceRange.range.start.row + spillOffset.y,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n return evalNode.evaluationResult;\n },\n evaluateAllCells: ({ intersection, context, origin }) => {\n let range = spillSnapshot.sourceRange.range;\n if (intersection) {\n const relativeRange = getRelativeRange(intersection, origin);\n const projectedIntersection = getAbsoluteRange(relativeRange, {\n colIndex: spillSnapshot.sourceRange.range.start.col,\n rowIndex: spillSnapshot.sourceRange.range.start.row,\n });\n const nextRange = getRangeIntersection(\n spillSnapshot.sourceRange.range,\n projectedIntersection\n );\n if (nextRange) {\n range = nextRange;\n }\n }\n\n const rangeAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n range,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(rangeAddress)\n );\n context.dependencyNode.addDependency(rangeNode);\n return rangeNode.result;\n },\n };\n }\n\n serializeSpillMetaEvaluationResultSnapshot(\n evaluation: SpillMetaNode[\"evaluationResult\"],\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedSpillMetaEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"does-not-spill\") {\n return { type: \"does-not-spill\" };\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const serialized = this.serializeFunctionEvaluationResultSnapshot(\n evaluation,\n options\n );\n if (!serialized || serialized.type !== \"spilled-values\") {\n return undefined;\n }\n\n return serialized;\n }\n\n deserializeSpillMetaEvaluationResultSnapshot(\n evaluation: SerializedSpillMetaEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SpillMetaNode[\"evaluationResult\"] {\n if (evaluation.type === \"does-not-spill\") {\n return evaluation;\n }\n\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n return this.deserializeFunctionEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n evaluateEmptyCell(node: EmptyCellEvaluationNode): void {\n if (node.resolved) {\n const result = node.evaluationResult;\n if (result && result.type !== \"awaiting-evaluation\") {\n return;\n }\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n const inSpilled = this.dependencyManager.getSpillValue(node.cellAddress);\n\n if (inSpilled) {\n // if we are spilling then we can just add the spill origin as a dependency and evaluate the spilled value\n const spillTarget = this.dependencyManager.getSpilledAddress(\n node.cellAddress,\n inSpilled\n );\n const spillOriginKey = cellAddressToKey(inSpilled.origin).replace(\n /^[^:]+:/,\n \"spill-meta:\"\n );\n const spillMetaNode =\n this.dependencyManager.getSpillMetaNode(spillOriginKey);\n node.addDependency(spillMetaNode);\n const result = spillMetaNode.evaluationResult;\n if (result.type === \"spilled-values\") {\n // let's evaluate the spilled value to extract dependencies\n const evaluation = captureEvaluationErrors(spillMetaNode, () => {\n return result.evaluate(spillTarget.spillOffset, ctx);\n });\n node.setEvaluationResult(evaluation);\n }\n } else {\n // upgrade any frontier dependencies that spill into the range\n node.upgradeFrontierDependencies();\n\n const evaluationResult: SingleEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n };\n // for now let's just store the empty value, the next time the cell is evaluated isSpilled will be true and the spilled value will be evaluated\n node.setEvaluationResult(evaluationResult);\n }\n\n this.dependencyManager.registerNode(node);\n }\n\n evaluateRangeNode(node: RangeEvaluationNode): void {\n if (node.resolved) {\n return;\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const result = captureEvaluationErrors(node, (): EvaluateAllCellsResult => {\n node.upgradeFrontierDependencies();\n\n const evalOrder = node.getRangeEvalOrder();\n\n const results: CellInRangeResult[] = [];\n\n for (const entry of evalOrder) {\n if (entry.type === \"value\") {\n const entryAddress = entry.address;\n const result = entry.node.evaluationResult;\n\n const relativePos = {\n x: entryAddress.colIndex - node.address.range.start.col,\n y: entryAddress.rowIndex - node.address.range.start.row,\n };\n\n results.push({ result: result, relativePos });\n } else if (\n entry.type === \"empty_cell\" ||\n entry.type === \"empty_range\"\n ) {\n for (const candidateNode of entry.candidates) {\n if (candidateNode.evaluationResult.type === \"spilled-values\") {\n const spillArea = candidateNode.evaluationResult.spillArea(\n candidateNode.cellAddress\n );\n if (entry.type === \"empty_range\") {\n const intersects = checkRangeIntersection(\n spillArea,\n entry.address.range\n );\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResults =\n candidateNode.evaluationResult.evaluateAllCells.call(\n this.formulaEvaluator,\n {\n context: ctx,\n evaluate: candidateNode.evaluationResult.evaluate,\n intersection: entry.address.range,\n origin: candidateNode.cellAddress,\n lookupOrder: \"col-major\",\n }\n );\n\n if (spilledResults.type === \"values\") {\n results.push(...spilledResults.values);\n } else {\n return spilledResults;\n }\n }\n } else {\n const intersects = isCellInRange(entry.address, spillArea);\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n\n const relativePos = {\n x:\n entry.address.colIndex -\n candidateNode.cellAddress.colIndex,\n y:\n entry.address.rowIndex -\n candidateNode.cellAddress.rowIndex,\n };\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResult = candidateNode.evaluationResult.evaluate(\n relativePos,\n ctx\n );\n\n results.push({\n relativePos: {\n x: entry.address.colIndex - node.address.range.start.col,\n y: entry.address.rowIndex - node.address.range.start.row,\n },\n result: spilledResult,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n type: \"values\",\n values: results,\n };\n });\n\n node.setResult(result);\n this.dependencyManager.registerNode(node);\n }\n\n evaluateCellNode(\n node: CellValueNode | SpillMetaNode | VirtualCellValueNode\n ): void {\n // Enable caching for resolved nodes\n if (node.resolved) {\n return;\n }\n\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.unregisterNode(node);\n }\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n\n if (node instanceof CellValueNode && node.spillMeta) {\n // we are evaluating a e.g. A1 in A1=SEQUENCE(10), where we want the value in the cell in A1, i.e. 1\n // As A1 is already pointing to a spill meta node, everything has been setup already,\n // we just need to evaluate the spill origin and assign the result to the currentDepNode\n const spillOrigin = node.spillMeta;\n if (spillOrigin.evaluationResult.type === \"spilled-values\") {\n const result = spillOrigin.evaluationResult.evaluate(\n { x: 0, y: 0 },\n ctx\n );\n node.setEvaluationResult(result);\n this.dependencyManager.registerNode(node);\n return;\n }\n }\n\n let content: SerializedCellValue;\n try {\n if (node instanceof VirtualCellValueNode) {\n content = node.cellValue;\n } else {\n content = this.workbookManager.getSerializedCellValue(node.cellAddress);\n }\n } catch (err) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"Syntax error\",\n errAddress: node,\n };\n node.setEvaluationResult(evaluationResult);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (typeof content !== \"string\" || !content.startsWith(\"=\")) {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n this.dependencyManager.registerNode(node);\n return;\n }\n // Static value cells cannot have frontier dependencies\n const result: ValueEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(content),\n };\n node.setEvaluationResult(result);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n let evaluation: FunctionEvaluationResult = captureEvaluationErrors(\n node,\n () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx)\n );\n\n // the evaluated cell IS A spilling formula, e.g. if dependencyKey points to A1, then the formula is e.g. A1=SEQUENCE(10), or A1=A3:B5\n if (evaluation.type === \"spilled-values\") {\n const spillArea = evaluation.spillArea(node.cellAddress);\n\n if (!this.canSpill(node.cellAddress, spillArea)) {\n // Override evaluation with SPILL error, but continue execution to set up nodes\n evaluation = {\n type: \"error\",\n err: FormulaError.SPILL,\n message: \"Cannot spill - area is blocked\",\n errAddress: node,\n };\n } else {\n // Spill succeeds - register it\n this.dependencyManager.setSpilledValue(node.key, {\n spillOnto: spillArea,\n origin: node.cellAddress,\n });\n }\n\n // Set up spill meta node and evaluation results (even if spill failed)\n if (node instanceof SpillMetaNode) {\n // we have already setup an origin/spill meta node relationship,\n // so we are just reevaluating the spill meta node here\n node.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(node);\n } else {\n const spillMetaNode = this.dependencyManager.getSpillMetaNode(\n node.key.replace(/^[^:]+:/, \"spill-meta:\")\n );\n\n node.addDependency(spillMetaNode);\n node.setSpillMetaNode(spillMetaNode);\n spillMetaNode.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(spillMetaNode);\n\n if (evaluation.type === \"spilled-values\") {\n const originResult = evaluation.evaluate({ x: 0, y: 0 }, ctx);\n node.setEvaluationResult(originResult);\n } else {\n // Spill failed - set error on origin cell\n node.setEvaluationResult(evaluation);\n }\n }\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (evaluation.type === \"value\") {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n this.dependencyManager.registerNode(node);\n return;\n } else {\n node.setEvaluationResult(evaluation);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n }\n\n node.setEvaluationResult(evaluation);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n }\n\n evaluateDependencyNode(dependency: DependencyNode): void {\n if (dependency instanceof EmptyCellEvaluationNode) {\n this.evaluateEmptyCell(dependency);\n return;\n }\n if (dependency instanceof RangeEvaluationNode) {\n this.evaluateRangeNode(dependency);\n return;\n }\n if (\n dependency instanceof CellValueNode ||\n dependency instanceof VirtualCellValueNode\n ) {\n this.evaluateCellNode(dependency);\n return;\n }\n if (dependency instanceof AstEvaluationNode) {\n return;\n }\n if (dependency instanceof ResourceDependencyNode) {\n return;\n }\n if (dependency instanceof SpillMetaNode) {\n this.evaluateCellNode(dependency);\n return;\n }\n throw new Error(\"Invalid dependency: \" + (dependency as any).key);\n }\n\n /**\n * User exposed method to evaluate a formula\n */\n evaluateFormula(\n /**\n * formula for example\n */\n cellValue: SerializedCellValue,\n cellAddress: CellAddress\n ): SerializedCellValue {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const node = this.dependencyManager.getVirtualCellValueNode(\n cellAddress,\n cellValue\n );\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n this.evaluateCell(node);\n }\n\n const result = node.evaluationResult;\n\n return this.evaluationResultToSerializedValue(result, cellAddress);\n }\n\n /**\n * Evaluates a cell by building the evaluation order and evaluating the dependencies in order\n */\n evaluateCell(\n node: CellValueNode | EmptyCellEvaluationNode | VirtualCellValueNode\n ): void {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n this.isEvaluating = true;\n\n let precalculatedPlan: EvaluationOrder | undefined;\n\n let requiresReRun = true;\n while (requiresReRun) {\n requiresReRun = false;\n\n // Use DependencyManager to build evaluation order\n const evaluationPlan =\n precalculatedPlan ?? this.dependencyManager.buildEvaluationOrder(node);\n\n if (evaluationPlan.hasCycle) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.CYCLE,\n message: Array.from(evaluationPlan.cycleNodes ?? [])\n .map((node) => node.key)\n .join(\" -> \"),\n errAddress: node,\n };\n // cycle detected\n if (evaluationPlan.cycleNodes) {\n for (const node of evaluationPlan.cycleNodes) {\n if (\n !(node instanceof RangeEvaluationNode) &&\n !(node instanceof ResourceDependencyNode)\n ) {\n node.setEvaluationResult(evaluationResult);\n }\n }\n }\n this.isEvaluating = false;\n }\n\n // Evaluate all dependencies in order\n const timeStart = performance.now();\n const durations: { duration: number; key: string }[] = [];\n let numResolved = 0;\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profile();\n }\n evaluationPlan.evaluationOrder.forEach((dependency) => {\n const start = performance.now();\n if (dependency.resolved) {\n numResolved++;\n }\n this.evaluateDependencyNode(dependency);\n\n const end = performance.now();\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n durations.push({ duration: end - start, key: dependency.key });\n }\n });\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profileEnd();\n }\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n const percentResolved = Math.round(\n (100 * numResolved) / evaluationPlan.evaluationOrder.size\n );\n const avgDuration =\n durations.reduce((a, b) => a + b.duration, 0) / durations.length || 0;\n console.log(\n `%c[Evaluation] %c${evaluationPlan.evaluationOrder.size} deps | %c${(\n performance.now() - timeStart\n ).toFixed(\n 1\n )}ms | %c${percentResolved}% resolved | %c${avgDuration.toFixed(\n 2\n )}ms avg`,\n \"color:#83aaff;font-weight:bold;\",\n \"color:#fff;font-weight:bold;\",\n \"color:#7fff9e\",\n \"color:#85baff\",\n \"color:#ffdfa3\"\n );\n }\n\n this.dependencyManager.markResolvedNodes(node);\n\n const nextEvaluationPlan =\n this.dependencyManager.buildEvaluationOrder(node);\n\n this.dependencyManager.updateResolvedSCCs(nextEvaluationPlan);\n\n precalculatedPlan = nextEvaluationPlan;\n\n // Check if new dependencies were discovered during evaluation\n if (nextEvaluationPlan.hash !== evaluationPlan.hash) {\n requiresReRun = true;\n } else {\n this.isEvaluating = false;\n return;\n }\n }\n this.isEvaluating = false;\n }\n\n convertScalarValueToCellValue(val: SerializedCellValue): CellValue {\n if (val === \"INFINITY\") {\n return { type: \"infinity\", sign: \"positive\" };\n }\n if (val === \"-INFINITY\") {\n return { type: \"infinity\", sign: \"negative\" };\n }\n if (typeof val === \"number\") {\n return { type: \"number\", value: val };\n }\n if (typeof val === \"boolean\") {\n return { type: \"boolean\", value: val };\n }\n if (typeof val === \"undefined\") {\n return { type: \"string\", value: \"\" };\n }\n return { type: \"string\", value: val };\n }\n\n // todo optimize using workbook manager\n canSpill(spillCandidate: CellAddress, spillArea: SpreadsheetRange): boolean {\n // Check if the spill origin cell is inside a table - spilling formulas cannot exist in tables\n if (this.tableManager.isCellInTable(spillCandidate)) {\n return false;\n }\n\n // Check if the spill area would intersect with any table - formulas cannot spill into tables\n if (\n this.tableManager.doesRangeIntersectTable(\n spillCandidate.workbookName,\n spillCandidate.sheetName,\n spillArea\n )\n ) {\n return false;\n }\n\n const sheet = this.workbookManager.getSheet(spillCandidate);\n if (!sheet) {\n throw new SheetNotFoundError(spillCandidate.sheetName);\n }\n const cellId = getCellReference(spillCandidate);\n const content = sheet.content.get(cellId);\n if (!content) {\n throw new EvaluationError(FormulaError.REF, `Cell not found: ${cellId}`);\n }\n for (const spilledValue of this.dependencyManager.spilledValues) {\n if (\n spilledValue.origin.workbookName !== spillCandidate.workbookName ||\n spilledValue.origin.sheetName !== spillCandidate.sheetName\n ) {\n continue;\n }\n if (\n spilledValue.origin.colIndex === spillCandidate.colIndex &&\n spilledValue.origin.rowIndex === spillCandidate.rowIndex\n ) {\n // we are already have a spill, this one will be replaced\n continue;\n }\n\n if (checkRangeIntersection(spillArea, spilledValue.spillOnto)) {\n return false;\n }\n }\n // let's just check the raw data if there is something in the range\n for (const key of sheet.content.keys()) {\n const cellAddress = parseCellReference(key);\n const endCol = spillArea.end.col;\n const endRow = spillArea.end.row;\n\n if (\n cellAddress.colIndex === spillCandidate.colIndex &&\n cellAddress.rowIndex === spillCandidate.rowIndex\n ) {\n continue;\n }\n\n if (endCol.type === \"number\" && endRow.type === \"number\") {\n if (\n cellAddress.colIndex >= spillArea.start.col &&\n cellAddress.colIndex <= endCol.value &&\n cellAddress.rowIndex >= spillArea.start.row &&\n cellAddress.rowIndex <= endRow.value\n ) {\n if (\n normalizeSerializedCellValue(sheet.content.get(key)) !== undefined\n ) {\n // there is something in the range, so we can't spill\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const nodeKey = cellAddressToKey(cellAddress);\n const node = this.dependencyManager.getCellValueOrEmptyCellNode(nodeKey);\n\n const sheet = this.workbookManager.getSheet(cellAddress);\n if (!sheet) {\n throw new SheetNotFoundError(cellAddress.sheetName);\n }\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n // if (cellAddressToKey(cellAddress).includes(\"G10\")) {\n // console.group(\"Evaluation of G10\");\n // flags.isProfiling = true;\n // console.time(\"Evaluation of G10\");\n // console.profile(\"Evaluation of G10\");\n // }\n this.evaluateCell(node);\n // if (flags.isProfiling) {\n // flags.isProfiling = false;\n // console.timeEnd(\"Evaluation of G10\");\n // console.profileEnd(\"Evaluation of G10\");\n // console.groupEnd();\n // }\n }\n\n const result = node.evaluationResult;\n\n return result;\n }\n}\n"
5
+ "import { flags } from \"../../debug/flags.mjs\";\nimport { AstEvaluationNode } from \"../../evaluator/dependency-nodes/ast-evaluation-node.mjs\";\nimport { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.mjs\";\nimport { EvaluationContext } from \"../../evaluator/evaluation-context.mjs\";\nimport {\n EvaluationError,\n SheetNotFoundError,\n} from \"../../evaluator/evaluation-error.mjs\";\nimport { RangeEvaluationNode } from \"../../evaluator/range-evaluation-node.mjs\";\nimport { normalizeSerializedCellValue } from \"../../parser/formatter.mjs\";\nimport { FormulaEvaluator } from \"../../evaluator/formula-evaluator.mjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellInRangeResult,\n type CellValue,\n type ErrorEvaluationResult,\n type EvaluateAllCellsResult,\n type EvaluationOrder,\n type FunctionEvaluationResult,\n type SerializedCellValue,\n type SingleEvaluationResult,\n type SpreadsheetRange,\n type ValueEvaluationResult,\n} from \"../types.mjs\";\nimport {\n captureEvaluationErrors,\n getAbsoluteRange,\n cellAddressToKey,\n checkRangeIntersection,\n getCellReference,\n getRangeIntersection,\n getRelativeRange,\n isCellInRange,\n parseCellReference,\n rangeAddressToKey,\n} from \"../utils.mjs\";\nimport type { DependencyManager } from \"./dependency-manager.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.mjs\";\nimport { EmptyCellEvaluationNode } from \"../../evaluator/dependency-nodes/empty-cell-evaluation-node.mjs\";\nimport type { TableManager } from \"./table-manager.mjs\";\nimport type { DependencyNode } from \"./dependency-node.mjs\";\nimport { VirtualCellValueNode } from \"../../evaluator/dependency-nodes/virtual-cell-value-node.mjs\";\nimport { ResourceDependencyNode } from \"../../evaluator/dependency-nodes/resource-dependency-node.mjs\";\nimport type {\n NodeSnapshotId,\n SerializedCellInRangeResultSnapshot,\n SerializedErrorEvaluationResultSnapshot,\n SerializedEvaluateAllCellsResultSnapshot,\n SerializedFunctionEvaluationResultSnapshot,\n SerializedSingleEvaluationResultSnapshot,\n SerializedSpillMetaEvaluationResultSnapshot,\n SerializedSpilledValuesEvaluationResultSnapshot,\n} from \"../engine-snapshot.mjs\";\nimport type { MutationInvalidation } from \"../commands/types.mjs\";\n\nexport class EvaluationManager {\n private isEvaluating = false;\n\n constructor(\n private workbookManager: WorkbookManager,\n private tableManager: TableManager,\n private formulaEvaluator: FormulaEvaluator,\n private dependencyManager: DependencyManager\n ) {}\n\n clearEvaluationCache(): void {\n this.dependencyManager.clearEvaluationCache();\n }\n\n private dependsOnNode(\n candidate: DependencyNode,\n target: DependencyNode,\n visited: Set<DependencyNode> = new Set()\n ): boolean {\n if (candidate === target) {\n return true;\n }\n\n if (visited.has(candidate)) {\n return false;\n }\n visited.add(candidate);\n\n for (const dep of candidate.getDependencies()) {\n if (this.dependsOnNode(dep, target, visited)) {\n return true;\n }\n }\n\n return false;\n }\n\n invalidateFromMutation(footprint: MutationInvalidation): void {\n this.dependencyManager.invalidateFromMutation(footprint);\n }\n\n evaluationResultToSerializedValue(\n evaluation: SingleEvaluationResult,\n cellAddress: CellAddress,\n debug?: boolean\n ): SerializedCellValue {\n if (\n evaluation.type !== \"error\" &&\n evaluation.type !== \"awaiting-evaluation\"\n ) {\n const value = evaluation.result;\n\n return value.type === \"infinity\"\n ? value.sign === \"positive\"\n ? \"INFINITY\"\n : \"-INFINITY\"\n : value.value;\n }\n\n if (evaluation.type === \"awaiting-evaluation\") {\n return (\n evaluation.errAddress.key +\n \" is awaiting evaluation of \" +\n evaluation.waitingFor.key\n );\n }\n\n if (debug) {\n const errAddress = evaluation.errAddress.key;\n if (errAddress === cellAddressToKey(cellAddress)) {\n return evaluation.err + \" \" + evaluation.message;\n }\n return (\n evaluation.err +\n \" in \" +\n evaluation.errAddress.key +\n \" \" +\n evaluation.message\n );\n }\n\n return evaluation.err;\n }\n\n private buildSnapshotOrigin(\n node: CellValueNode | SpillMetaNode | AstEvaluationNode\n ): CellAddress {\n if (\"cellAddress\" in node) {\n return node.cellAddress;\n }\n\n const contextDependency = node.getContextDependency();\n return {\n workbookName: contextDependency.workbookName ?? \"__snapshot__\",\n sheetName: contextDependency.sheetName ?? \"__snapshot__\",\n colIndex: contextDependency.colIndex ?? 0,\n rowIndex: contextDependency.rowIndex ?? 0,\n };\n }\n\n private serializeErrorEvaluationResultSnapshot(\n evaluation: Exclude<ErrorEvaluationResult, { type: \"awaiting-evaluation\" }>,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedErrorEvaluationResultSnapshot {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddressId: getNodeSnapshotId(evaluation.errAddress),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeSingleEvaluationResultSnapshot(\n evaluation: SingleEvaluationResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedSingleEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n deserializeSingleEvaluationResultSnapshot(\n evaluation: SerializedSingleEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SingleEvaluationResult {\n if (evaluation.type === \"error\") {\n return {\n type: \"error\",\n err: evaluation.err,\n message: evaluation.message,\n errAddress: resolveNodeSnapshotId(evaluation.errAddressId),\n sourceCell: evaluation.sourceCell,\n };\n }\n\n return {\n type: \"value\",\n result: evaluation.result,\n sourceCell: evaluation.sourceCell,\n };\n }\n\n serializeEvaluateAllCellsResultSnapshot(\n evaluation: EvaluateAllCellsResult,\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId\n ): SerializedEvaluateAllCellsResultSnapshot | undefined {\n if (evaluation.type === \"awaiting-evaluation\") {\n return undefined;\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n getNodeSnapshotId\n );\n }\n\n const values: SerializedCellInRangeResultSnapshot[] = [];\n for (const value of evaluation.values) {\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n value.result,\n getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: value.relativePos,\n result: serialized,\n });\n }\n\n return {\n type: \"values\",\n values,\n };\n }\n\n deserializeEvaluateAllCellsResultSnapshot(\n evaluation: SerializedEvaluateAllCellsResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): EvaluateAllCellsResult {\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as ErrorEvaluationResult;\n }\n\n return {\n type: \"values\",\n values: evaluation.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n };\n }\n\n serializeFunctionEvaluationResultSnapshot(\n evaluation: FunctionEvaluationResult,\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedFunctionEvaluationResultSnapshot | undefined {\n if (evaluation.type !== \"spilled-values\") {\n return this.serializeSingleEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const origin = this.buildSnapshotOrigin(options.sourceNode);\n const spillArea = evaluation.spillArea(origin);\n const relativeSpillArea = getRelativeRange(spillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n });\n\n if (evaluation.sourceRange) {\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"source-range\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n },\n };\n }\n\n if (\n relativeSpillArea.width.type !== \"number\" ||\n relativeSpillArea.height.type !== \"number\"\n ) {\n return undefined;\n }\n\n const context = new EvaluationContext(\n this.tableManager,\n options.sourceNode,\n origin\n );\n const values: SerializedCellInRangeResultSnapshot[] = [];\n\n for (let y = 0; y < relativeSpillArea.height.value; y++) {\n for (let x = 0; x < relativeSpillArea.width.value; x++) {\n const result = captureEvaluationErrors(options.sourceNode, () =>\n evaluation.evaluate({ x, y }, context)\n );\n const serialized = this.serializeSingleEvaluationResultSnapshot(\n result,\n options.getNodeSnapshotId\n );\n if (!serialized) {\n return undefined;\n }\n values.push({\n relativePos: { x, y },\n result: serialized,\n });\n }\n }\n\n return {\n type: \"spilled-values\",\n spill: {\n kind: \"materialized\",\n relativeSpillArea,\n source: evaluation.source,\n sourceCell: evaluation.sourceCell,\n sourceRange: evaluation.sourceRange,\n values,\n },\n };\n }\n\n deserializeFunctionEvaluationResultSnapshot(\n evaluation: SerializedFunctionEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): FunctionEvaluationResult {\n if (evaluation.type !== \"spilled-values\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n );\n }\n\n const spillSnapshot = evaluation.spill;\n if (spillSnapshot.kind === \"materialized\") {\n const values = new Map(\n spillSnapshot.values.map((value) => [\n `${value.relativePos.x},${value.relativePos.y}`,\n this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n ])\n );\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset) =>\n values.get(`${spillOffset.x},${spillOffset.y}`) ?? {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n },\n evaluateAllCells: () => ({\n type: \"values\",\n values: spillSnapshot.values.map((value) => ({\n relativePos: value.relativePos,\n result: this.deserializeSingleEvaluationResultSnapshot(\n value.result,\n resolveNodeSnapshotId\n ),\n })),\n }),\n };\n }\n\n return {\n type: \"spilled-values\",\n source: spillSnapshot.source,\n sourceCell: spillSnapshot.sourceCell,\n sourceRange: spillSnapshot.sourceRange,\n spillArea: (origin) =>\n getAbsoluteRange(spillSnapshot.relativeSpillArea, {\n colIndex: origin.colIndex,\n rowIndex: origin.rowIndex,\n }),\n evaluate: (spillOffset, context) => {\n const cellAddress: CellAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n colIndex: spillSnapshot.sourceRange.range.start.col + spillOffset.x,\n rowIndex: spillSnapshot.sourceRange.range.start.row + spillOffset.y,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n return evalNode.evaluationResult;\n },\n evaluateAllCells: ({ intersection, context, origin }) => {\n let range = spillSnapshot.sourceRange.range;\n if (intersection) {\n const relativeRange = getRelativeRange(intersection, origin);\n const projectedIntersection = getAbsoluteRange(relativeRange, {\n colIndex: spillSnapshot.sourceRange.range.start.col,\n rowIndex: spillSnapshot.sourceRange.range.start.row,\n });\n const nextRange = getRangeIntersection(\n spillSnapshot.sourceRange.range,\n projectedIntersection\n );\n if (nextRange) {\n range = nextRange;\n }\n }\n\n const rangeAddress = {\n workbookName: spillSnapshot.sourceRange.workbookName,\n sheetName: spillSnapshot.sourceRange.sheetName,\n range,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(rangeAddress)\n );\n context.dependencyNode.addDependency(rangeNode);\n return rangeNode.result;\n },\n };\n }\n\n serializeSpillMetaEvaluationResultSnapshot(\n evaluation: SpillMetaNode[\"evaluationResult\"],\n options: {\n sourceNode: CellValueNode | SpillMetaNode | AstEvaluationNode;\n getNodeSnapshotId: (node: DependencyNode) => NodeSnapshotId;\n }\n ): SerializedSpillMetaEvaluationResultSnapshot | undefined {\n if (evaluation.type === \"does-not-spill\") {\n return { type: \"does-not-spill\" };\n }\n\n if (evaluation.type === \"error\") {\n return this.serializeErrorEvaluationResultSnapshot(\n evaluation,\n options.getNodeSnapshotId\n );\n }\n\n const serialized = this.serializeFunctionEvaluationResultSnapshot(\n evaluation,\n options\n );\n if (!serialized || serialized.type !== \"spilled-values\") {\n return undefined;\n }\n\n return serialized;\n }\n\n deserializeSpillMetaEvaluationResultSnapshot(\n evaluation: SerializedSpillMetaEvaluationResultSnapshot,\n resolveNodeSnapshotId: (nodeId: NodeSnapshotId) => DependencyNode\n ): SpillMetaNode[\"evaluationResult\"] {\n if (evaluation.type === \"does-not-spill\") {\n return evaluation;\n }\n\n if (evaluation.type === \"error\") {\n return this.deserializeSingleEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n return this.deserializeFunctionEvaluationResultSnapshot(\n evaluation,\n resolveNodeSnapshotId\n ) as SpillMetaNode[\"evaluationResult\"];\n }\n\n evaluateEmptyCell(node: EmptyCellEvaluationNode): void {\n if (node.resolved) {\n const result = node.evaluationResult;\n if (result && result.type !== \"awaiting-evaluation\") {\n return;\n }\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n const inSpilled = this.dependencyManager.getSpillValue(node.cellAddress);\n\n if (inSpilled) {\n // if we are spilling then we can just add the spill origin as a dependency and evaluate the spilled value\n const spillTarget = this.dependencyManager.getSpilledAddress(\n node.cellAddress,\n inSpilled\n );\n const spillOriginKey = cellAddressToKey(inSpilled.origin).replace(\n /^[^:]+:/,\n \"spill-meta:\"\n );\n const spillMetaNode =\n this.dependencyManager.getSpillMetaNode(spillOriginKey);\n node.addDependency(spillMetaNode);\n const result = spillMetaNode.evaluationResult;\n if (result.type === \"spilled-values\") {\n // let's evaluate the spilled value to extract dependencies\n const evaluation = captureEvaluationErrors(spillMetaNode, () => {\n return result.evaluate(spillTarget.spillOffset, ctx);\n });\n node.setEvaluationResult(evaluation);\n }\n } else {\n // upgrade any frontier dependencies that spill into the range\n node.upgradeFrontierDependencies();\n\n const evaluationResult: SingleEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(\"\"),\n };\n // for now let's just store the empty value, the next time the cell is evaluated isSpilled will be true and the spilled value will be evaluated\n node.setEvaluationResult(evaluationResult);\n }\n\n this.dependencyManager.registerNode(node);\n }\n\n evaluateRangeNode(node: RangeEvaluationNode): void {\n if (node.resolved) {\n return;\n }\n\n this.dependencyManager.unregisterNode(node);\n node.resetDirectDepsUpdated();\n\n const result = captureEvaluationErrors(node, (): EvaluateAllCellsResult => {\n node.upgradeFrontierDependencies();\n\n const evalOrder = node.getRangeEvalOrder();\n const circularEntryCache = new Map<DependencyNode, boolean>();\n const shouldSkipCircularEntry = (candidate: DependencyNode) => {\n const cached = circularEntryCache.get(candidate);\n if (cached !== undefined) {\n return cached;\n }\n\n // If a cell inside the range depends back on the range itself, including\n // its current value would count a circular result back into the same\n // aggregate on a later rerun.\n const isCircular = this.dependsOnNode(candidate, node);\n circularEntryCache.set(candidate, isCircular);\n return isCircular;\n };\n\n const results: CellInRangeResult[] = [];\n\n for (const entry of evalOrder) {\n if (entry.type === \"value\") {\n if (shouldSkipCircularEntry(entry.node)) {\n continue;\n }\n\n const entryAddress = entry.address;\n const result = entry.node.evaluationResult;\n\n const relativePos = {\n x: entryAddress.colIndex - node.address.range.start.col,\n y: entryAddress.rowIndex - node.address.range.start.row,\n };\n\n results.push({ result: result, relativePos });\n } else if (\n entry.type === \"empty_cell\" ||\n entry.type === \"empty_range\"\n ) {\n for (const candidateNode of entry.candidates) {\n if (shouldSkipCircularEntry(candidateNode)) {\n continue;\n }\n\n if (candidateNode.evaluationResult.type === \"spilled-values\") {\n const spillArea = candidateNode.evaluationResult.spillArea(\n candidateNode.cellAddress\n );\n if (entry.type === \"empty_range\") {\n const intersects = checkRangeIntersection(\n spillArea,\n entry.address.range\n );\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResults =\n candidateNode.evaluationResult.evaluateAllCells.call(\n this.formulaEvaluator,\n {\n context: ctx,\n evaluate: candidateNode.evaluationResult.evaluate,\n intersection: entry.address.range,\n origin: candidateNode.cellAddress,\n lookupOrder: \"col-major\",\n }\n );\n\n if (spilledResults.type === \"values\") {\n results.push(...spilledResults.values);\n } else {\n return spilledResults;\n }\n }\n } else {\n const intersects = isCellInRange(entry.address, spillArea);\n if (intersects) {\n // When a spilled range intersects with our target range, we need to evaluate\n // only the cells that fall within the intersection area.\n //\n // Example: If cell A10 contains a spilled range that covers A10:B11,\n // and our target range is B10:INFINITY, then we only want to evaluate\n // the intersection B10:B11 from the spilled range.\n //\n // The evaluateAllCells method expects the intersection to be passed\n // so it can limit evaluation to only the relevant cells.\n\n const relativePos = {\n x:\n entry.address.colIndex -\n candidateNode.cellAddress.colIndex,\n y:\n entry.address.rowIndex -\n candidateNode.cellAddress.rowIndex,\n };\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n candidateNode.cellAddress\n );\n const spilledResult = candidateNode.evaluationResult.evaluate(\n relativePos,\n ctx\n );\n\n results.push({\n relativePos: {\n x: entry.address.colIndex - node.address.range.start.col,\n y: entry.address.rowIndex - node.address.range.start.row,\n },\n result: spilledResult,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n type: \"values\",\n values: results,\n };\n });\n\n node.setResult(result);\n this.dependencyManager.registerNode(node);\n }\n\n evaluateCellNode(\n node: CellValueNode | SpillMetaNode | VirtualCellValueNode\n ): void {\n // Enable caching for resolved nodes\n if (node.resolved) {\n return;\n }\n\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.unregisterNode(node);\n }\n node.resetDirectDepsUpdated();\n\n const ctx = new EvaluationContext(\n this.tableManager,\n node,\n node.cellAddress\n );\n\n if (node instanceof CellValueNode && node.spillMeta) {\n // we are evaluating a e.g. A1 in A1=SEQUENCE(10), where we want the value in the cell in A1, i.e. 1\n // As A1 is already pointing to a spill meta node, everything has been setup already,\n // we just need to evaluate the spill origin and assign the result to the currentDepNode\n const spillOrigin = node.spillMeta;\n if (spillOrigin.evaluationResult.type === \"spilled-values\") {\n const result = spillOrigin.evaluationResult.evaluate(\n { x: 0, y: 0 },\n ctx\n );\n node.setEvaluationResult(result);\n this.dependencyManager.registerNode(node);\n return;\n }\n }\n\n let content: SerializedCellValue;\n try {\n if (node instanceof VirtualCellValueNode) {\n content = node.cellValue;\n } else {\n content = this.workbookManager.getSerializedCellValue(node.cellAddress);\n }\n } catch (err) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"Syntax error\",\n errAddress: node,\n };\n node.setEvaluationResult(evaluationResult);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (typeof content !== \"string\" || !content.startsWith(\"=\")) {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n this.dependencyManager.registerNode(node);\n return;\n }\n // Static value cells cannot have frontier dependencies\n const result: ValueEvaluationResult = {\n type: \"value\",\n result: this.convertScalarValueToCellValue(content),\n };\n node.setEvaluationResult(result);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n let evaluation: FunctionEvaluationResult = captureEvaluationErrors(\n node,\n () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx)\n );\n\n // the evaluated cell IS A spilling formula, e.g. if dependencyKey points to A1, then the formula is e.g. A1=SEQUENCE(10), or A1=A3:B5\n if (evaluation.type === \"spilled-values\") {\n const spillArea = evaluation.spillArea(node.cellAddress);\n\n if (!this.canSpill(node.cellAddress, spillArea)) {\n // Override evaluation with SPILL error, but continue execution to set up nodes\n evaluation = {\n type: \"error\",\n err: FormulaError.SPILL,\n message: \"Cannot spill - area is blocked\",\n errAddress: node,\n };\n } else {\n // Spill succeeds - register it\n this.dependencyManager.setSpilledValue(node.key, {\n spillOnto: spillArea,\n origin: node.cellAddress,\n });\n }\n\n // Set up spill meta node and evaluation results (even if spill failed)\n if (node instanceof SpillMetaNode) {\n // we have already setup an origin/spill meta node relationship,\n // so we are just reevaluating the spill meta node here\n node.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(node);\n } else {\n const spillMetaNode = this.dependencyManager.getSpillMetaNode(\n node.key.replace(/^[^:]+:/, \"spill-meta:\")\n );\n\n node.addDependency(spillMetaNode);\n node.setSpillMetaNode(spillMetaNode);\n spillMetaNode.setEvaluationResult(evaluation);\n this.dependencyManager.registerNode(spillMetaNode);\n\n if (evaluation.type === \"spilled-values\") {\n const originResult = evaluation.evaluate({ x: 0, y: 0 }, ctx);\n node.setEvaluationResult(originResult);\n } else {\n // Spill failed - set error on origin cell\n node.setEvaluationResult(evaluation);\n }\n }\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n\n if (evaluation.type === \"value\") {\n if (node instanceof SpillMetaNode) {\n node.setEvaluationResult({\n type: \"does-not-spill\",\n });\n this.dependencyManager.registerNode(node);\n return;\n } else {\n node.setEvaluationResult(evaluation);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n return;\n }\n }\n\n node.setEvaluationResult(evaluation);\n if (!(node instanceof VirtualCellValueNode)) {\n this.dependencyManager.registerNode(node);\n }\n }\n\n evaluateDependencyNode(dependency: DependencyNode): void {\n if (dependency instanceof EmptyCellEvaluationNode) {\n this.evaluateEmptyCell(dependency);\n return;\n }\n if (dependency instanceof RangeEvaluationNode) {\n this.evaluateRangeNode(dependency);\n return;\n }\n if (\n dependency instanceof CellValueNode ||\n dependency instanceof VirtualCellValueNode\n ) {\n this.evaluateCellNode(dependency);\n return;\n }\n if (dependency instanceof AstEvaluationNode) {\n return;\n }\n if (dependency instanceof ResourceDependencyNode) {\n return;\n }\n if (dependency instanceof SpillMetaNode) {\n this.evaluateCellNode(dependency);\n return;\n }\n throw new Error(\"Invalid dependency: \" + (dependency as any).key);\n }\n\n /**\n * User exposed method to evaluate a formula\n */\n evaluateFormula(\n /**\n * formula for example\n */\n cellValue: SerializedCellValue,\n cellAddress: CellAddress\n ): SerializedCellValue {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const node = this.dependencyManager.getVirtualCellValueNode(\n cellAddress,\n cellValue\n );\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n this.evaluateCell(node);\n }\n\n const result = node.evaluationResult;\n\n return this.evaluationResultToSerializedValue(result, cellAddress);\n }\n\n /**\n * Evaluates a cell by building the evaluation order and evaluating the dependencies in order\n */\n evaluateCell(\n node: CellValueNode | EmptyCellEvaluationNode | VirtualCellValueNode\n ): void {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n this.isEvaluating = true;\n\n let precalculatedPlan: EvaluationOrder | undefined;\n\n let requiresReRun = true;\n while (requiresReRun) {\n requiresReRun = false;\n\n // Use DependencyManager to build evaluation order\n const evaluationPlan =\n precalculatedPlan ?? this.dependencyManager.buildEvaluationOrder(node);\n\n if (evaluationPlan.hasCycle) {\n const evaluationResult: ErrorEvaluationResult = {\n type: \"error\",\n err: FormulaError.CYCLE,\n message: Array.from(evaluationPlan.cycleNodes ?? [])\n .map((node) => node.key)\n .join(\" -> \"),\n errAddress: node,\n };\n // cycle detected\n if (evaluationPlan.cycleNodes) {\n for (const node of evaluationPlan.cycleNodes) {\n if (\n !(node instanceof RangeEvaluationNode) &&\n !(node instanceof ResourceDependencyNode)\n ) {\n node.setEvaluationResult(evaluationResult);\n }\n }\n }\n this.isEvaluating = false;\n }\n\n // Evaluate all dependencies in order\n const timeStart = performance.now();\n const durations: { duration: number; key: string }[] = [];\n let numResolved = 0;\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profile();\n }\n evaluationPlan.evaluationOrder.forEach((dependency) => {\n const start = performance.now();\n if (dependency.resolved) {\n numResolved++;\n }\n this.evaluateDependencyNode(dependency);\n\n const end = performance.now();\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n durations.push({ duration: end - start, key: dependency.key });\n }\n });\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n // console.profileEnd();\n }\n if (flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {\n const percentResolved = Math.round(\n (100 * numResolved) / evaluationPlan.evaluationOrder.size\n );\n const avgDuration =\n durations.reduce((a, b) => a + b.duration, 0) / durations.length || 0;\n console.log(\n `%c[Evaluation] %c${evaluationPlan.evaluationOrder.size} deps | %c${(\n performance.now() - timeStart\n ).toFixed(\n 1\n )}ms | %c${percentResolved}% resolved | %c${avgDuration.toFixed(\n 2\n )}ms avg`,\n \"color:#83aaff;font-weight:bold;\",\n \"color:#fff;font-weight:bold;\",\n \"color:#7fff9e\",\n \"color:#85baff\",\n \"color:#ffdfa3\"\n );\n }\n\n this.dependencyManager.markResolvedNodes(node);\n\n const nextEvaluationPlan =\n this.dependencyManager.buildEvaluationOrder(node);\n\n this.dependencyManager.updateResolvedSCCs(nextEvaluationPlan);\n\n precalculatedPlan = nextEvaluationPlan;\n\n // Check if new dependencies were discovered during evaluation\n if (nextEvaluationPlan.hash !== evaluationPlan.hash) {\n requiresReRun = true;\n } else {\n this.isEvaluating = false;\n return;\n }\n }\n this.isEvaluating = false;\n }\n\n convertScalarValueToCellValue(val: SerializedCellValue): CellValue {\n if (val === \"INFINITY\") {\n return { type: \"infinity\", sign: \"positive\" };\n }\n if (val === \"-INFINITY\") {\n return { type: \"infinity\", sign: \"negative\" };\n }\n if (typeof val === \"number\") {\n return { type: \"number\", value: val };\n }\n if (typeof val === \"boolean\") {\n return { type: \"boolean\", value: val };\n }\n if (typeof val === \"undefined\") {\n return { type: \"string\", value: \"\" };\n }\n return { type: \"string\", value: val };\n }\n\n // todo optimize using workbook manager\n canSpill(spillCandidate: CellAddress, spillArea: SpreadsheetRange): boolean {\n // Check if the spill origin cell is inside a table - spilling formulas cannot exist in tables\n if (this.tableManager.isCellInTable(spillCandidate)) {\n return false;\n }\n\n // Check if the spill area would intersect with any table - formulas cannot spill into tables\n if (\n this.tableManager.doesRangeIntersectTable(\n spillCandidate.workbookName,\n spillCandidate.sheetName,\n spillArea\n )\n ) {\n return false;\n }\n\n const sheet = this.workbookManager.getSheet(spillCandidate);\n if (!sheet) {\n throw new SheetNotFoundError(spillCandidate.sheetName);\n }\n const cellId = getCellReference(spillCandidate);\n const content = sheet.content.get(cellId);\n if (!content) {\n throw new EvaluationError(FormulaError.REF, `Cell not found: ${cellId}`);\n }\n for (const spilledValue of this.dependencyManager.spilledValues) {\n if (\n spilledValue.origin.workbookName !== spillCandidate.workbookName ||\n spilledValue.origin.sheetName !== spillCandidate.sheetName\n ) {\n continue;\n }\n if (\n spilledValue.origin.colIndex === spillCandidate.colIndex &&\n spilledValue.origin.rowIndex === spillCandidate.rowIndex\n ) {\n // we are already have a spill, this one will be replaced\n continue;\n }\n\n if (checkRangeIntersection(spillArea, spilledValue.spillOnto)) {\n return false;\n }\n }\n // let's just check the raw data if there is something in the range\n for (const key of sheet.content.keys()) {\n const cellAddress = parseCellReference(key);\n const endCol = spillArea.end.col;\n const endRow = spillArea.end.row;\n\n if (\n cellAddress.colIndex === spillCandidate.colIndex &&\n cellAddress.rowIndex === spillCandidate.rowIndex\n ) {\n continue;\n }\n\n if (endCol.type === \"number\" && endRow.type === \"number\") {\n if (\n cellAddress.colIndex >= spillArea.start.col &&\n cellAddress.colIndex <= endCol.value &&\n cellAddress.rowIndex >= spillArea.start.row &&\n cellAddress.rowIndex <= endRow.value\n ) {\n if (\n normalizeSerializedCellValue(sheet.content.get(key)) !== undefined\n ) {\n // there is something in the range, so we can't spill\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n getCellEvaluationResult(\n cellAddress: CellAddress\n ): SingleEvaluationResult | undefined {\n if (this.isEvaluating) {\n throw new Error(\"Evaluation in progress\");\n }\n\n const nodeKey = cellAddressToKey(cellAddress);\n const node = this.dependencyManager.getCellValueOrEmptyCellNode(nodeKey);\n\n const sheet = this.workbookManager.getSheet(cellAddress);\n if (!sheet) {\n throw new SheetNotFoundError(cellAddress.sheetName);\n }\n\n if (node.evaluationResult.type === \"awaiting-evaluation\") {\n // if (cellAddressToKey(cellAddress).includes(\"G10\")) {\n // console.group(\"Evaluation of G10\");\n // flags.isProfiling = true;\n // console.time(\"Evaluation of G10\");\n // console.profile(\"Evaluation of G10\");\n // }\n this.evaluateCell(node);\n // if (flags.isProfiling) {\n // flags.isProfiling = false;\n // console.timeEnd(\"Evaluation of G10\");\n // console.profileEnd(\"Evaluation of G10\");\n // console.groupEnd();\n // }\n }\n\n const result = node.evaluationResult;\n\n return result;\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "5021DEFD4ADAF93664756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "2066CABDB344597A64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -113,7 +113,7 @@ class FrontierDependencyManager {
113
113
  return this._discardedFrontierDependencies;
114
114
  }
115
115
  maybeDiscardFrontierDependency(dependency) {
116
- if (!this._resolved) {
116
+ if (!dependency.resolved && !dependency.canResolve()) {
117
117
  return;
118
118
  }
119
119
  if (this._discardedFrontierDependencies.has(dependency)) {
@@ -123,7 +123,7 @@ class FrontierDependencyManager {
123
123
  this._discardedFrontierDependencies.add(dependency);
124
124
  }
125
125
  maybeUpgradeFrontierDependency(dependency) {
126
- if (!this._resolved) {
126
+ if (!dependency.resolved && !dependency.canResolve()) {
127
127
  return;
128
128
  }
129
129
  if (this._dependencies.has(dependency)) {
@@ -161,7 +161,7 @@ class FrontierDependencyManager {
161
161
  }
162
162
  getAllDependencies() {
163
163
  this.ensureEvalOrderBuilt();
164
- return this._dependencies.union(this._frontierDependencies);
164
+ return this._dependencies.union(this.frontierDependencies);
165
165
  }
166
166
  getDiscardedFrontierDependencies() {
167
167
  return this.discardedFrontierDependencies;
@@ -191,4 +191,4 @@ export {
191
191
  FrontierDependencyManager
192
192
  };
193
193
 
194
- //# debugId=39D280E127FA1FB164756E2164756E21
194
+ //# debugId=BB9D63382A0ACAF064756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/core/managers/frontier-dependency-manager.ts"],
4
4
  "sourcesContent": [
5
- "import { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.mjs\";\nimport type { CellAddress, CellInRangeResult, RangeAddress } from \"../types.mjs\";\nimport { cellAddressToKey, checkRangeIntersection } from \"../utils.mjs\";\nimport type { DependencyManager } from \"./dependency-manager.mjs\";\nimport type { DependencyNode } from \"./dependency-node.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport type { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.mjs\";\n\ntype EvalOrderEntry =\n | {\n type: \"value\";\n address: CellAddress;\n node: CellValueNode;\n }\n | {\n type: \"empty_cell\";\n address: CellAddress;\n candidates: SpillMetaNode[];\n }\n | {\n type: \"empty_range\";\n address: RangeAddress;\n candidates: SpillMetaNode[];\n };\n\nexport class FrontierDependencyManager {\n private evalOrder: EvalOrderEntry[] = [];\n private _resolved: boolean = false;\n private _directDepsUpdated: boolean = false;\n private evalOrderInitialized: boolean = false;\n\n constructor(\n protected readonly frontierRange: RangeAddress,\n protected workbookManager: WorkbookManager,\n protected evaluationManager: DependencyManager,\n options?: { skipInitialBuild?: boolean }\n ) {\n if (options?.skipInitialBuild) {\n return;\n }\n\n this.buildInitialEvalOrder();\n }\n\n protected buildInitialEvalOrder() {\n this.evalOrderInitialized = true;\n this.evalOrder = [];\n this._frontierDependencies = new Set();\n this._discardedFrontierDependencies = new Set();\n this._dependencies = new Set();\n\n const addressToSpillMetaNode = (address: CellAddress) => {\n const node = this.evaluationManager.getSpillMetaNode(\n cellAddressToKey(address).replace(/^[^:]+:/, \"spill-meta:\")\n );\n return node;\n };\n // todo maybe pass in lookupOrder\n let directDepsUpdated = false;\n this.evalOrder = this.workbookManager\n .buildRangeEvalOrder(\"col-major\", this.frontierRange)\n .map((entry): EvalOrderEntry => {\n if (entry.type === \"value\") {\n const addressToNode = (address: CellAddress) => {\n const node = this.evaluationManager.getCellValueNode(\n cellAddressToKey(address)\n );\n return node;\n };\n return {\n type: \"value\",\n address: entry.address,\n node: addressToNode(entry.address),\n };\n } else if (entry.type === \"empty_cell\") {\n return {\n type: \"empty_cell\",\n address: entry.address,\n candidates: entry.candidates.map(addressToSpillMetaNode),\n };\n } else if (entry.type === \"empty_range\") {\n return {\n type: \"empty_range\",\n address: entry.address,\n candidates: entry.candidates.map(addressToSpillMetaNode),\n };\n }\n throw new Error(\"Invalid entry type: \" + (entry as any).type);\n });\n for (const entry of this.evalOrder) {\n if (entry.type === \"empty_cell\" || entry.type === \"empty_range\") {\n for (const candidate of entry.candidates) {\n this._frontierDependencies.add(candidate);\n directDepsUpdated = true;\n }\n } else if (entry.type === \"value\") {\n this.addDependency(entry.node);\n directDepsUpdated = true;\n }\n }\n this._directDepsUpdated = directDepsUpdated;\n }\n\n protected ensureEvalOrderBuilt() {\n if (!this.evalOrderInitialized) {\n this.buildInitialEvalOrder();\n }\n }\n\n /**\n * frontierDependencies is the set of dependency node keys that could spill values onto the target range (if evaluationResult is spilled-values)\n * Key is from cellAddressToKey\n *\n * soft edge dependencies, which can not cause cycles in the dependency graph\n */\n private _frontierDependencies: Set<SpillMetaNode> = new Set();\n\n /**\n * discardedFrontierDependencies is the set of dependency node keys that were discarded as frontier dependencies because\n * they they do not produce spilled values that spill onto the target range\n * Key is from cellAddressToKey\n */\n private _discardedFrontierDependencies: Set<SpillMetaNode> = new Set();\n\n /**\n * hard edge dependencies, which can cause cycles in the dependency graph\n */\n private _dependencies: Set<DependencyNode> = new Set();\n\n /**\n * cache, should maybe be stored in the cache manager\n */\n get iterateAllCells(): undefined | Iterable<CellInRangeResult> {\n return undefined;\n }\n\n public getRangeEvalOrder() {\n this.ensureEvalOrderBuilt();\n return this.evalOrder;\n }\n\n public getFrontierRange() {\n return this.frontierRange;\n }\n\n public restoreResolvedSnapshot(options: {\n dependencies: Set<DependencyNode>;\n }) {\n this.evalOrder = [];\n this.evalOrderInitialized = true;\n this._frontierDependencies = new Set();\n this._discardedFrontierDependencies = new Set();\n this._dependencies = new Set(options.dependencies);\n this._directDepsUpdated = false;\n this._resolved = true;\n }\n\n public invalidate() {\n this.evalOrder = [];\n this.evalOrderInitialized = false;\n this._frontierDependencies = new Set();\n this._discardedFrontierDependencies = new Set();\n this._dependencies = new Set();\n this._directDepsUpdated = false;\n this._resolved = false;\n }\n\n public get frontierDependencies() {\n this.ensureEvalOrderBuilt();\n return this._frontierDependencies\n .difference(this._discardedFrontierDependencies)\n .difference(this._dependencies);\n }\n\n public get discardedFrontierDependencies() {\n this.ensureEvalOrderBuilt();\n return this._discardedFrontierDependencies;\n }\n\n public maybeDiscardFrontierDependency(dependency: SpillMetaNode) {\n if (!this._resolved) {\n return;\n }\n if (this._discardedFrontierDependencies.has(dependency)) {\n return;\n }\n this._directDepsUpdated = true;\n this._discardedFrontierDependencies.add(dependency);\n }\n\n public maybeUpgradeFrontierDependency(dependency: SpillMetaNode) {\n if (!this._resolved) {\n return;\n }\n if (this._dependencies.has(dependency)) {\n return;\n }\n this._directDepsUpdated = true;\n this._dependencies.add(dependency);\n }\n\n /**\n * a range is considered resolved when the dependencies has been established\n */\n public resolve() {\n if (this.canResolve()) {\n this._resolved = true;\n }\n }\n\n public canResolve() {\n return !this._directDepsUpdated && this.frontierDependencies.size === 0;\n }\n\n public get resolved() {\n return this._resolved;\n }\n\n public get directDepsUpdated() {\n return this._directDepsUpdated;\n }\n\n public resetDirectDepsUpdated() {\n if (this._resolved) {\n return;\n }\n\n this._directDepsUpdated = false;\n }\n\n public getDependencies() {\n this.ensureEvalOrderBuilt();\n return this._dependencies;\n }\n\n public getFrontierDependencies() {\n return this.frontierDependencies;\n }\n\n public getAllDependencies() {\n this.ensureEvalOrderBuilt();\n return this._dependencies.union(this._frontierDependencies);\n }\n\n public getDiscardedFrontierDependencies() {\n return this.discardedFrontierDependencies;\n }\n\n public addDependency(dependency: DependencyNode) {\n this._dependencies.add(dependency);\n }\n\n public upgradeFrontierDependencies() {\n // todo can be optimized to not generate the frontier candidates every time\n // we can cache the frontier candidates for the current cell\n const frontierCandidates: SpillMetaNode[] = Array.from(\n this.frontierDependencies\n );\n\n for (const candidateNode of frontierCandidates) {\n const result = candidateNode.evaluationResult;\n\n // upgrade or downgrade frontier dependency\n if (result.type === \"spilled-values\") {\n const spillArea = result.spillArea(candidateNode.cellAddress);\n const intersects = checkRangeIntersection(\n this.frontierRange.range,\n spillArea\n );\n if (intersects) {\n this.maybeUpgradeFrontierDependency(candidateNode); // upgraded!\n } else {\n this.maybeDiscardFrontierDependency(candidateNode); // downgraded!\n }\n } else {\n this.maybeDiscardFrontierDependency(candidateNode); // downgraded!\n }\n }\n }\n}\n"
5
+ "import { CellValueNode } from \"../../evaluator/dependency-nodes/cell-value-node.mjs\";\nimport type { CellAddress, CellInRangeResult, RangeAddress } from \"../types.mjs\";\nimport { cellAddressToKey, checkRangeIntersection } from \"../utils.mjs\";\nimport type { DependencyManager } from \"./dependency-manager.mjs\";\nimport type { DependencyNode } from \"./dependency-node.mjs\";\nimport type { WorkbookManager } from \"./workbook-manager.mjs\";\nimport type { SpillMetaNode } from \"../../evaluator/dependency-nodes/spill-meta-node.mjs\";\n\ntype EvalOrderEntry =\n | {\n type: \"value\";\n address: CellAddress;\n node: CellValueNode;\n }\n | {\n type: \"empty_cell\";\n address: CellAddress;\n candidates: SpillMetaNode[];\n }\n | {\n type: \"empty_range\";\n address: RangeAddress;\n candidates: SpillMetaNode[];\n };\n\nexport class FrontierDependencyManager {\n private evalOrder: EvalOrderEntry[] = [];\n private _resolved: boolean = false;\n private _directDepsUpdated: boolean = false;\n private evalOrderInitialized: boolean = false;\n\n constructor(\n protected readonly frontierRange: RangeAddress,\n protected workbookManager: WorkbookManager,\n protected evaluationManager: DependencyManager,\n options?: { skipInitialBuild?: boolean }\n ) {\n if (options?.skipInitialBuild) {\n return;\n }\n\n this.buildInitialEvalOrder();\n }\n\n protected buildInitialEvalOrder() {\n this.evalOrderInitialized = true;\n this.evalOrder = [];\n this._frontierDependencies = new Set();\n this._discardedFrontierDependencies = new Set();\n this._dependencies = new Set();\n\n const addressToSpillMetaNode = (address: CellAddress) => {\n const node = this.evaluationManager.getSpillMetaNode(\n cellAddressToKey(address).replace(/^[^:]+:/, \"spill-meta:\")\n );\n return node;\n };\n // todo maybe pass in lookupOrder\n let directDepsUpdated = false;\n this.evalOrder = this.workbookManager\n .buildRangeEvalOrder(\"col-major\", this.frontierRange)\n .map((entry): EvalOrderEntry => {\n if (entry.type === \"value\") {\n const addressToNode = (address: CellAddress) => {\n const node = this.evaluationManager.getCellValueNode(\n cellAddressToKey(address)\n );\n return node;\n };\n return {\n type: \"value\",\n address: entry.address,\n node: addressToNode(entry.address),\n };\n } else if (entry.type === \"empty_cell\") {\n return {\n type: \"empty_cell\",\n address: entry.address,\n candidates: entry.candidates.map(addressToSpillMetaNode),\n };\n } else if (entry.type === \"empty_range\") {\n return {\n type: \"empty_range\",\n address: entry.address,\n candidates: entry.candidates.map(addressToSpillMetaNode),\n };\n }\n throw new Error(\"Invalid entry type: \" + (entry as any).type);\n });\n for (const entry of this.evalOrder) {\n if (entry.type === \"empty_cell\" || entry.type === \"empty_range\") {\n for (const candidate of entry.candidates) {\n this._frontierDependencies.add(candidate);\n directDepsUpdated = true;\n }\n } else if (entry.type === \"value\") {\n this.addDependency(entry.node);\n directDepsUpdated = true;\n }\n }\n this._directDepsUpdated = directDepsUpdated;\n }\n\n protected ensureEvalOrderBuilt() {\n if (!this.evalOrderInitialized) {\n this.buildInitialEvalOrder();\n }\n }\n\n /**\n * frontierDependencies is the set of dependency node keys that could spill values onto the target range (if evaluationResult is spilled-values)\n * Key is from cellAddressToKey\n *\n * soft edge dependencies, which can not cause cycles in the dependency graph\n */\n private _frontierDependencies: Set<SpillMetaNode> = new Set();\n\n /**\n * discardedFrontierDependencies is the set of dependency node keys that were discarded as frontier dependencies because\n * they they do not produce spilled values that spill onto the target range\n * Key is from cellAddressToKey\n */\n private _discardedFrontierDependencies: Set<SpillMetaNode> = new Set();\n\n /**\n * hard edge dependencies, which can cause cycles in the dependency graph\n */\n private _dependencies: Set<DependencyNode> = new Set();\n\n /**\n * cache, should maybe be stored in the cache manager\n */\n get iterateAllCells(): undefined | Iterable<CellInRangeResult> {\n return undefined;\n }\n\n public getRangeEvalOrder() {\n this.ensureEvalOrderBuilt();\n return this.evalOrder;\n }\n\n public getFrontierRange() {\n return this.frontierRange;\n }\n\n public restoreResolvedSnapshot(options: {\n dependencies: Set<DependencyNode>;\n }) {\n this.evalOrder = [];\n this.evalOrderInitialized = true;\n this._frontierDependencies = new Set();\n this._discardedFrontierDependencies = new Set();\n this._dependencies = new Set(options.dependencies);\n this._directDepsUpdated = false;\n this._resolved = true;\n }\n\n public invalidate() {\n this.evalOrder = [];\n this.evalOrderInitialized = false;\n this._frontierDependencies = new Set();\n this._discardedFrontierDependencies = new Set();\n this._dependencies = new Set();\n this._directDepsUpdated = false;\n this._resolved = false;\n }\n\n public get frontierDependencies() {\n this.ensureEvalOrderBuilt();\n return this._frontierDependencies\n .difference(this._discardedFrontierDependencies)\n .difference(this._dependencies);\n }\n\n public get discardedFrontierDependencies() {\n this.ensureEvalOrderBuilt();\n return this._discardedFrontierDependencies;\n }\n\n public maybeDiscardFrontierDependency(dependency: SpillMetaNode) {\n if (!dependency.resolved && !dependency.canResolve()) {\n return;\n }\n if (this._discardedFrontierDependencies.has(dependency)) {\n return;\n }\n this._directDepsUpdated = true;\n this._discardedFrontierDependencies.add(dependency);\n }\n\n public maybeUpgradeFrontierDependency(dependency: SpillMetaNode) {\n if (!dependency.resolved && !dependency.canResolve()) {\n return;\n }\n if (this._dependencies.has(dependency)) {\n return;\n }\n this._directDepsUpdated = true;\n this._dependencies.add(dependency);\n }\n\n /**\n * a range is considered resolved when the dependencies has been established\n */\n public resolve() {\n if (this.canResolve()) {\n this._resolved = true;\n }\n }\n\n public canResolve() {\n return !this._directDepsUpdated && this.frontierDependencies.size === 0;\n }\n\n public get resolved() {\n return this._resolved;\n }\n\n public get directDepsUpdated() {\n return this._directDepsUpdated;\n }\n\n public resetDirectDepsUpdated() {\n if (this._resolved) {\n return;\n }\n\n this._directDepsUpdated = false;\n }\n\n public getDependencies() {\n this.ensureEvalOrderBuilt();\n return this._dependencies;\n }\n\n public getFrontierDependencies() {\n return this.frontierDependencies;\n }\n\n public getAllDependencies() {\n this.ensureEvalOrderBuilt();\n return this._dependencies.union(this.frontierDependencies);\n }\n\n public getDiscardedFrontierDependencies() {\n return this.discardedFrontierDependencies;\n }\n\n public addDependency(dependency: DependencyNode) {\n this._dependencies.add(dependency);\n }\n\n public upgradeFrontierDependencies() {\n // todo can be optimized to not generate the frontier candidates every time\n // we can cache the frontier candidates for the current cell\n const frontierCandidates: SpillMetaNode[] = Array.from(\n this.frontierDependencies\n );\n\n for (const candidateNode of frontierCandidates) {\n const result = candidateNode.evaluationResult;\n\n // upgrade or downgrade frontier dependency\n if (result.type === \"spilled-values\") {\n const spillArea = result.spillArea(candidateNode.cellAddress);\n const intersects = checkRangeIntersection(\n this.frontierRange.range,\n spillArea\n );\n if (intersects) {\n this.maybeUpgradeFrontierDependency(candidateNode); // upgraded!\n } else {\n this.maybeDiscardFrontierDependency(candidateNode); // downgraded!\n }\n } else {\n this.maybeDiscardFrontierDependency(candidateNode); // downgraded!\n }\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "39D280E127FA1FB164756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "BB9D63382A0ACAF064756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -72,6 +72,36 @@ class WorkbookManager {
72
72
  }
73
73
  return workbook.sheets;
74
74
  }
75
+ getOrderedSheets(workbookName) {
76
+ const workbook = this.workbooks.get(workbookName);
77
+ if (!workbook) {
78
+ throw new WorkbookNotFoundError(workbookName);
79
+ }
80
+ return Array.from(workbook.sheets.entries()).map(([name, sheet], insertionOrder) => ({
81
+ name,
82
+ sheet,
83
+ insertionOrder
84
+ })).sort((left, right) => {
85
+ if (left.sheet.index !== right.sheet.index) {
86
+ return left.sheet.index - right.sheet.index;
87
+ }
88
+ return left.insertionOrder - right.insertionOrder;
89
+ }).map(({ sheet }) => sheet);
90
+ }
91
+ getOrderedSheetNames(workbookName) {
92
+ return this.getOrderedSheets(workbookName).map((sheet) => sheet.name);
93
+ }
94
+ getNextAvailableSheetName(workbookName, baseName = "Sheet") {
95
+ const workbook = this.workbooks.get(workbookName);
96
+ if (!workbook) {
97
+ throw new WorkbookNotFoundError(workbookName);
98
+ }
99
+ let suffix = 1;
100
+ while (workbook.sheets.has(`${baseName}${suffix}`)) {
101
+ suffix++;
102
+ }
103
+ return `${baseName}${suffix}`;
104
+ }
75
105
  getWorkbooks() {
76
106
  return this.workbooks;
77
107
  }
@@ -167,9 +197,13 @@ class WorkbookManager {
167
197
  if (!workbook) {
168
198
  throw new WorkbookNotFoundError(workbookName);
169
199
  }
200
+ let nextSheetIndex = -1;
201
+ for (const existingSheet of workbook.sheets.values()) {
202
+ nextSheetIndex = Math.max(nextSheetIndex, existingSheet.index);
203
+ }
170
204
  const sheet = {
171
205
  name: sheetName,
172
- index: workbook.sheets.size,
206
+ index: nextSheetIndex + 1,
173
207
  content: new Map,
174
208
  metadata: new Map,
175
209
  sheetMetadata: undefined
@@ -215,8 +249,18 @@ class WorkbookManager {
215
249
  throw new Error("Sheet with new name already exists");
216
250
  }
217
251
  sheet.name = newSheetName;
218
- workbook.sheets.set(newSheetName, sheet);
219
- workbook.sheets.delete(sheetName);
252
+ const renamedSheets = new Map;
253
+ for (const [existingSheetName, existingSheet] of workbook.sheets.entries()) {
254
+ if (existingSheetName === sheetName) {
255
+ renamedSheets.set(newSheetName, sheet);
256
+ } else {
257
+ renamedSheets.set(existingSheetName, existingSheet);
258
+ }
259
+ }
260
+ workbook.sheets.clear();
261
+ for (const [existingSheetName, existingSheet] of renamedSheets.entries()) {
262
+ workbook.sheets.set(existingSheetName, existingSheet);
263
+ }
220
264
  const oldKey = this.getSheetIndexKey(workbookName, sheetName);
221
265
  const newKey = this.getSheetIndexKey(workbookName, newSheetName);
222
266
  const indexes = this.sheetIndexes.get(oldKey);
@@ -560,4 +604,4 @@ export {
560
604
  IndexEntryBinarySearch
561
605
  };
562
606
 
563
- //# debugId=3674D247A9CFB67364756E2164756E21
607
+ //# debugId=75C3010E17AC251264756E2164756E21