{
  "version": 3,
  "sources": ["../../../../src/functions/text/text-helpers.ts"],
  "sourcesContent": [
    "import {\n  FormulaError,\n  type CellString,\n  type FunctionEvaluationResult,\n  type ValueEvaluationResult,\n  type CellAddress,\n  type SpreadsheetRange,\n  type ErrorEvaluationResult,\n  type SingleEvaluationResult,\n} from \"../../core/types.mjs\";\nimport type { FormulaEngine } from \"../../core/engine.mjs\";\nimport type { FormulaEvaluator } from \"../../evaluator/formula-evaluator.mjs\";\nimport type { EvaluationContext } from \"../../evaluator/evaluation-context.mjs\";\n\n/**\n * Strictly extracts string value without type coercion\n */\nexport function convertToString(result: FunctionEvaluationResult, context: EvaluationContext): string | ErrorEvaluationResult {\n  if (result.type === \"awaiting-evaluation\") {\n    return result;\n  }\n  \n  if (result.type !== \"value\") {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"Expected a value result\",\n      errAddress: context.dependencyNode,\n    };\n  }\n\n  if (result.result.type === \"string\") {\n    return result.result.value;\n  } else {\n    // No type coercion - only strings are valid\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"Expected a string value\",\n      errAddress: context.dependencyNode,\n    };\n  }\n}\n\n/**\n * Strictly extracts numeric value without type coercion\n */\nexport function extractNumericValue(result: FunctionEvaluationResult, context: EvaluationContext): number | ErrorEvaluationResult {\n  if (result.type === \"awaiting-evaluation\") {\n    return result;\n  }\n  \n  if (result.type !== \"value\") {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"Expected a value result\",\n      errAddress: context.dependencyNode,\n    };\n  }\n\n  if (result.result.type === \"number\") {\n    return result.result.value;\n  } else {\n    // No type coercion - only numbers are valid\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"Expected a number value\",\n      errAddress: context.dependencyNode,\n    };\n  }\n}\n\n/**\n * MID substring operation for MID function\n */\nexport function midOperation(\n  textResult: FunctionEvaluationResult,\n  startNumResult: FunctionEvaluationResult,\n  numCharsResult: FunctionEvaluationResult,\n  context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n  const textStr = convertToString(textResult, context);\n  const startNum = extractNumericValue(startNumResult, context);\n  const numChars = extractNumericValue(numCharsResult, context);\n\n  // Check if any of the results are awaiting evaluation or errors\n  if (typeof textStr === \"object\" && (textStr.type === \"awaiting-evaluation\" || textStr.type === \"error\")) {\n    return textStr;\n  }\n  if (typeof startNum === \"object\" && (startNum.type === \"awaiting-evaluation\" || startNum.type === \"error\")) {\n    return startNum;\n  }\n  if (typeof numChars === \"object\" && (numChars.type === \"awaiting-evaluation\" || numChars.type === \"error\")) {\n    return numChars;\n  }\n\n  // At this point, all values should be primitive types\n  const textValue = textStr as string;\n  const startNumValue = startNum as number;\n  const numCharsValue = numChars as number;\n\n  // Validate startNum and numChars\n  if (startNumValue < 1) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"StartNum argument must be a positive number\",\n      errAddress: context.dependencyNode,\n    };\n  }\n  if (numCharsValue < 0) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: \"NumChars argument must be a positive number\",\n      errAddress: context.dependencyNode,\n    };\n  }\n\n  // Convert to 0-based index (Excel uses 1-based)\n  const startIndex = Math.floor(startNumValue) - 1;\n  const length = Math.floor(numCharsValue);\n\n  // Extract substring\n  const result = textValue.substring(startIndex, startIndex + length);\n\n  return { type: \"value\", result: { type: \"string\", value: result } };\n}\n\n/**\n * Helper for creating spilled-values result for MID function (3 parameters)\n */\nexport function createMidSpilledResult(\n  this: FormulaEvaluator,\n  {\n    textResult,\n    startNumResult,\n    numCharsResult,\n    context,\n  }: {\n    textResult: FunctionEvaluationResult;\n    startNumResult: FunctionEvaluationResult;\n    numCharsResult: FunctionEvaluationResult;\n    context: EvaluationContext;\n  }\n): FunctionEvaluationResult {\n  const hasSpilledText = textResult.type === \"spilled-values\";\n  const hasSpilledStart = startNumResult.type === \"spilled-values\";\n  const hasSpilledNum = numCharsResult.type === \"spilled-values\";\n\n  if (!hasSpilledText && !hasSpilledStart && !hasSpilledNum) {\n    throw new Error(\"createMidSpilledResult called without spilled values\");\n  }\n\n  return {\n    type: \"spilled-values\",\n    spillArea: (origin: CellAddress) => {\n      // Calculate spill area (union of all spilled ranges)\n      let spillArea: SpreadsheetRange;\n\n      if (hasSpilledText && textResult.type === \"spilled-values\") {\n        spillArea = textResult.spillArea(origin);\n      } else if (hasSpilledStart && startNumResult.type === \"spilled-values\") {\n        spillArea = startNumResult.spillArea(origin);\n      } else if (hasSpilledNum && numCharsResult.type === \"spilled-values\") {\n        spillArea = numCharsResult.spillArea(origin);\n      } else {\n        // This shouldn't happen since we check for spilled values at the beginning\n        throw new Error(\"No spilled values found\");\n      }\n\n      // Union with other spilled ranges if they exist\n      if (\n        hasSpilledText &&\n        hasSpilledStart &&\n        textResult.type === \"spilled-values\" &&\n        startNumResult.type === \"spilled-values\"\n      ) {\n        spillArea = this.unionRanges(\n          this.projectRange(textResult.spillArea(origin), origin),\n          this.projectRange(startNumResult.spillArea(origin), origin)\n        );\n      }\n\n      if (\n        (hasSpilledText || hasSpilledStart) &&\n        hasSpilledNum &&\n        numCharsResult.type === \"spilled-values\"\n      ) {\n        const projectedSpillArea = this.projectRange(spillArea, origin);\n        const numSpillArea = this.projectRange(\n          numCharsResult.spillArea(origin),\n          origin\n        );\n        spillArea = this.unionRanges(projectedSpillArea, numSpillArea);\n      }\n      return spillArea;\n    },\n    source: \"MID with spilled values\",\n    evaluate: (\n      spilledCell,\n      evalContext\n    ): SingleEvaluationResult => {\n      // Evaluate all arguments at this spilled position\n      const spillTextResult = hasSpilledText\n        ? textResult.evaluate(spilledCell, evalContext)\n        : textResult;\n      const spillStartResult = hasSpilledStart\n        ? startNumResult.evaluate(spilledCell, evalContext)\n        : startNumResult;\n      const spillNumResult = hasSpilledNum\n        ? numCharsResult.evaluate(spilledCell, evalContext)\n        : numCharsResult;\n\n      if (!spillTextResult || spillTextResult.type === \"error\") {\n        return spillTextResult;\n      }\n      if (!spillStartResult || spillStartResult.type === \"error\") {\n        return spillStartResult;\n      }\n      if (!spillNumResult || spillNumResult.type === \"error\") {\n        return spillNumResult;\n      }\n\n      return midOperation(spillTextResult, spillStartResult, spillNumResult, evalContext);\n    },\n    evaluateAllCells: (intersectingRange) => {\n      throw new Error(\"WIP: evaluateAllCells for MID is not implemented\");\n    },\n  };\n}\n"
  ],
  "mappings": "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",
  "debugId": "44068AC17257A2B164756E2164756E21",
  "names": []
}