{
  "version": 3,
  "sources": ["../../../../../src/evaluator/arithmetic/power/power.ts"],
  "sourcesContent": [
    "import type { ArethmeticEvaluator } from \"../../../core/types.mjs\";\nimport { FormulaError } from \"../../../core/types.mjs\";\n\nexport const power: ArethmeticEvaluator = (left, right, context) => {\n  // Only allow number and infinity types\n  if ((left.type !== \"number\" && left.type !== \"infinity\") ||\n      (right.type !== \"number\" && right.type !== \"infinity\")) {\n    return {\n      type: \"error\",\n      err: FormulaError.VALUE,\n      message: `Cannot exponentiate ${left.type} and ${right.type}`,\n      errAddress: context.dependencyNode,\n    };\n  }\n\n  // Handle infinity cases\n  if (left.type === \"infinity\" || right.type === \"infinity\") {\n    \n    // Special cases for infinity exponentiation\n    if (left.type === \"infinity\" && right.type === \"infinity\") {\n      // ∞^∞ = +∞ (mathematical convention)\n      return { type: \"infinity\", sign: \"positive\" };\n    }\n    \n    // Infinity raised to a power\n    if (left.type === \"infinity\" && right.type === \"number\") {\n      if (right.value === 0) {\n        // ∞^0 = 1 (mathematical convention)\n        return { type: \"number\", value: 1 };\n      }\n      \n      if (right.value > 0) {\n        // ∞^(positive) = ∞, (-∞)^(positive) depends on whether exponent is even/odd\n        if (left.sign === \"positive\") {\n          return { type: \"infinity\", sign: \"positive\" };\n        } else {\n          // For negative infinity, we need to check if exponent is integer and even/odd\n          if (Number.isInteger(right.value)) {\n            const isEven = right.value % 2 === 0;\n            return { type: \"infinity\", sign: isEven ? \"positive\" : \"negative\" };\n          } else {\n            // Non-integer exponent with negative base is complex\n            return {\n              type: \"error\",\n              err: FormulaError.NUM,\n              message: \"Cannot raise negative infinity to non-integer power\",\n              errAddress: context.dependencyNode,\n            };\n          }\n        }\n      } else {\n        // ∞^(negative) = 0\n        return { type: \"number\", value: 0 };\n      }\n    }\n    \n    // Number raised to infinity\n    if (left.type === \"number\" && right.type === \"infinity\") {\n      const absBase = Math.abs(left.value);\n      \n      if (absBase === 1) {\n        // 1^∞ = 1, (-1)^∞ is indeterminate but we'll return 1\n        return { type: \"number\", value: 1 };\n      }\n      \n      if (absBase > 1) {\n        if (right.sign === \"positive\") {\n          // |base| > 1: base^(+∞) = +∞\n          return { type: \"infinity\", sign: \"positive\" };\n        } else {\n          // |base| > 1: base^(-∞) = 0\n          return { type: \"number\", value: 0 };\n        }\n      } else {\n        // 0 < |base| < 1\n        if (right.sign === \"positive\") {\n          // 0 < |base| < 1: base^(+∞) = 0\n          return { type: \"number\", value: 0 };\n        } else {\n          // 0 < |base| < 1: base^(-∞) = +∞\n          return { type: \"infinity\", sign: \"positive\" };\n        }\n      }\n    }\n  }\n  \n  // Both numbers\n  if (left.type === \"number\" && right.type === \"number\") {\n    // Special cases\n    if (left.value === 0 && right.value === 0) {\n      // 0^0 is indeterminate, return 1 by convention\n      return { type: \"number\", value: 1 };\n    }\n    \n    if (left.value === 0 && right.value < 0) {\n      // 0^(negative) = infinity\n      return { type: \"infinity\", sign: \"positive\" };\n    }\n    \n    if (left.value < 0 && !Number.isInteger(right.value)) {\n      // Negative base with non-integer exponent produces complex numbers\n      return {\n        type: \"error\",\n        err: FormulaError.NUM,\n        message: \"Cannot raise negative number to non-integer power\",\n        errAddress: context.dependencyNode,\n      };\n    }\n    \n    const result = Math.pow(left.value, right.value);\n    \n    // Check for overflow to infinity\n    if (result === Infinity) {\n      return { type: \"infinity\", sign: \"positive\" };\n    }\n    if (result === -Infinity) {\n      return { type: \"infinity\", sign: \"negative\" };\n    }\n    \n    return { type: \"number\", value: result };\n  }\n  \n  // This should never be reached due to the type check at the beginning\n  return {\n    type: \"error\",\n    err: FormulaError.VALUE,\n    message: `Cannot exponentiate ${left.type} and ${right.type}`,\n    errAddress: context.dependencyNode,\n  };\n};"
  ],
  "mappings": "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",
  "debugId": "4ED5745BD313697964756E2164756E21",
  "names": []
}