{
  "version": 3,
  "sources": ["../../../../../src/functions/logical/or/or.ts"],
  "sourcesContent": [
    "import {\n  FormulaError,\n  type CellValue,\n  type CellNumber,\n  type FunctionDefinition,\n  type FunctionEvaluationResult,\n  type ValueEvaluationResult,\n  type CellAddress,\n  type SpreadsheetRange,\n  type SpilledValuesEvaluationResult,\n  type SingleEvaluationResult,\n  type ErrorEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * OR function - Returns TRUE if any argument is TRUE, FALSE otherwise\n *\n * Usage: OR(logical1, [logical2], ...)\n *\n * logical1, logical2, ...: Logical values or expressions to evaluate\n *\n * Examples:\n *   OR(TRUE, FALSE) - returns TRUE\n *   OR(FALSE, FALSE) - returns FALSE\n *   OR(A1>10, B1<20) - returns TRUE if either condition is met\n *   OR(A1:A3) - returns TRUE if any value in A1:A3 is truthy\n *\n * Note:\n * - Supports spilled values (dynamic arrays) for arguments\n * - Logical evaluation: 0 and empty string are FALSE, everything else is TRUE\n * - If any argument is spilled, processes all values in the range\n * - Short-circuit evaluation: stops at first TRUE value\n */\n\n/**\n * Convert a cell value to boolean for logical evaluation\n */\nfunction isTruthy(value: CellValue): boolean {\n  switch (value.type) {\n    case \"boolean\":\n      return value.value;\n    case \"number\":\n      return value.value !== 0;\n    case \"string\":\n      return value.value !== \"\";\n    case \"infinity\":\n      return true; // Infinity is truthy\n    default:\n      return false;\n  }\n}\n\n// OR function does not create spilled results - it processes all values in ranges\n// as individual logical tests and returns a single boolean result\n\n/**\n * OR function implementation\n */\nexport const OR: FunctionDefinition = {\n  name: \"OR\",\n  evaluate: function (node, context): FunctionEvaluationResult {\n    if (node.args.length === 0) {\n      return {\n        type: \"error\",\n        err: FormulaError.VALUE,\n        message: \"OR function requires at least one argument\",\n        errAddress: context.dependencyNode,\n      };\n    }\n\n    // Process arguments one by one (like AND function)\n    for (const arg of node.args) {\n      const argResult = this.evaluateNode(arg, context);\n\n      if (argResult.type === \"error\" || argResult.type === \"awaiting-evaluation\") {\n        return argResult;\n      }\n\n      if (argResult.type === \"value\") {\n        // Single value - check if truthy\n        if (isTruthy(argResult.result)) {\n          // Short-circuit: return TRUE on first truthy value\n          return {\n            type: \"value\",\n            result: { type: \"boolean\", value: true },\n          };\n        }\n      } else if (argResult.type === \"spilled-values\") {\n        // Range - check all values in the range\n        const cellValues = argResult.evaluateAllCells.call(this, {\n          context,\n          origin: context.cellAddress,\n          evaluate: argResult.evaluate,\n          lookupOrder: \"col-major\",\n        });\n        if (cellValues.type === \"error\" || cellValues.type === \"awaiting-evaluation\") {\n          return cellValues;\n        }\n        for (const cellValue of cellValues.values) {\n          if (cellValue.result.type === \"error\" || cellValue.result.type === \"awaiting-evaluation\") {\n            return cellValue.result;\n          }\n          if (cellValue.result.type === \"value\") {\n            if (isTruthy(cellValue.result.result)) {\n              // Short-circuit: return TRUE on first truthy value\n              return {\n                type: \"value\",\n                result: { type: \"boolean\", value: true },\n              };\n            }\n          }\n        }\n      } else {\n        return {\n          type: \"error\",\n          err: FormulaError.VALUE,\n          message: \"Invalid argument type for OR function\",\n          errAddress: context.dependencyNode,\n        };\n      }\n    }\n\n    // All arguments are falsy\n    return {\n      type: \"value\",\n      result: { type: \"boolean\", value: false },\n    };\n  },\n};\n"
  ],
  "mappings": ";AAAA;AAAA;AAAA;AAuCA,SAAS,QAAQ,CAAC,OAA2B;AAAA,EAC3C,QAAQ,MAAM;AAAA,SACP;AAAA,MACH,OAAO,MAAM;AAAA,SACV;AAAA,MACH,OAAO,MAAM,UAAU;AAAA,SACpB;AAAA,MACH,OAAO,MAAM,UAAU;AAAA,SACpB;AAAA,MACH,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAUN,IAAM,KAAyB;AAAA,EACpC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,MAC1B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,WAAW,OAAO,KAAK,MAAM;AAAA,MAC3B,MAAM,YAAY,KAAK,aAAa,KAAK,OAAO;AAAA,MAEhD,IAAI,UAAU,SAAS,WAAW,UAAU,SAAS,uBAAuB;AAAA,QAC1E,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,UAAU,SAAS,SAAS;AAAA,QAE9B,IAAI,SAAS,UAAU,MAAM,GAAG;AAAA,UAE9B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,EAAE,MAAM,WAAW,OAAO,KAAK;AAAA,UACzC;AAAA,QACF;AAAA,MACF,EAAO,SAAI,UAAU,SAAS,kBAAkB;AAAA,QAE9C,MAAM,aAAa,UAAU,iBAAiB,KAAK,MAAM;AAAA,UACvD;AAAA,UACA,QAAQ,QAAQ;AAAA,UAChB,UAAU,UAAU;AAAA,UACpB,aAAa;AAAA,QACf,CAAC;AAAA,QACD,IAAI,WAAW,SAAS,WAAW,WAAW,SAAS,uBAAuB;AAAA,UAC5E,OAAO;AAAA,QACT;AAAA,QACA,WAAW,aAAa,WAAW,QAAQ;AAAA,UACzC,IAAI,UAAU,OAAO,SAAS,WAAW,UAAU,OAAO,SAAS,uBAAuB;AAAA,YACxF,OAAO,UAAU;AAAA,UACnB;AAAA,UACA,IAAI,UAAU,OAAO,SAAS,SAAS;AAAA,YACrC,IAAI,SAAS,UAAU,OAAO,MAAM,GAAG;AAAA,cAErC,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,QAAQ,EAAE,MAAM,WAAW,OAAO,KAAK;AAAA,cACzC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,EAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,aAAa;AAAA,UAClB,SAAS;AAAA,UACT,YAAY,QAAQ;AAAA,QACtB;AAAA;AAAA,IAEJ;AAAA,IAGA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,WAAW,OAAO,MAAM;AAAA,IAC1C;AAAA;AAEJ;",
  "debugId": "4301A45DE683310964756E2164756E21",
  "names": []
}