@devmm/puredocs-excel-formula 1.0.4 → 1.0.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula-value.ts","../src/formula-token.ts","../src/formula-lexer.ts","../src/formula-node.ts","../src/formula-parser.ts","../src/functions/math-functions.ts","../src/functions/text-functions.ts","../src/functions/logical-functions.ts","../src/functions/date-functions.ts","../src/functions/lookup-functions.ts","../src/functions/statistical-functions.ts","../src/functions/info-functions.ts","../src/functions/finance-functions.ts","../src/functions/meta-functions.ts","../src/functions/aggregate-functions.ts","../src/functions/array-functions.ts","../src/function-registry.ts","../src/formula-context.ts","../src/lru-cache.ts","../src/formula-evaluator.ts","../src/recalc-references.ts","../src/recalc-engine.ts"],"names":["FormulaError","num","value","rows","columns","row","offset","TokenType","upper","BinaryOperator","UnaryOperator","left","right","ln","arg","_pos","len","count","code","mode","mid","out","best","column","sumSq","a","pv","fv","pmt","rate","nper","sum","days","cellRefFromRowCol","countA","variance","asArray","byCol","byRow","FormulaHelper","_functions","parseCellRef","resolveName","cellKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Discriminated union for formula values.\r\n * Port of TVE.PureDocs.Excel.Formulas.FormulaValue (C# readonly struct)\r\n *\r\n * C# used a value-type struct with LayoutKind.Auto for zero-GC scalar values.\r\n * TypeScript/JS uses a class with static factory methods and cached singletons.\r\n * The tradeoff: objects vs structs — acceptable for JS runtimes.\r\n */\r\nimport { toOADate } from '@devmm/puredocs-excel';\r\n\r\nexport const enum FormulaError {\r\n None = 0,\r\n Null = 1,\r\n Div0 = 2,\r\n Value = 3,\r\n Ref = 4,\r\n Name = 5,\r\n Num = 6,\r\n NA = 7,\r\n Calc = 8,\r\n Spill = 9,\r\n}\r\n\r\nexport type FormulaValueKind = 'blank' | 'number' | 'text' | 'boolean' | 'error' | 'array' | 'lambda';\r\n\r\n/**\r\n * A callable value produced by LAMBDA. Kept as an opaque interface so\r\n * formula-value.ts stays decoupled from the AST/context modules.\r\n */\r\nexport interface LambdaLike {\r\n /** Number of declared parameters. */\r\n readonly arity: number;\r\n /** Invokes the lambda with the given argument values (runs to completion). */\r\n call(args: FormulaValue[]): FormulaValue;\r\n /**\r\n * Runs the lambda body ONCE in tail-aware mode. Returns either the final value\r\n * or a TailCall describing the next tail call, so a trampoline can iterate\r\n * without growing the JS stack. Optional; call() is the fallback.\r\n */\r\n step?(args: FormulaValue[]): FormulaValue | TailCall;\r\n}\r\n\r\n/**\r\n * A pending tail call produced by evaluating a node in tail position. The\r\n * trampoline in a lambda's call() loops on these instead of recursing.\r\n */\r\nexport class TailCall {\r\n constructor(readonly lambda: LambdaLike, readonly args: FormulaValue[]) {}\r\n}\r\n\r\nexport class FormulaValue {\r\n readonly kind: FormulaValueKind;\r\n /** Numeric payload (also used for boolean: 1=true, 0=false). */\r\n readonly #num: number;\r\n /** String, ArrayValue, or LambdaLike payload. */\r\n readonly #obj: string | ArrayValue | LambdaLike | undefined;\r\n readonly errorCode: FormulaError;\r\n\r\n private constructor(\r\n kind: FormulaValueKind,\r\n num = 0,\r\n obj?: string | ArrayValue | LambdaLike,\r\n errorCode: FormulaError = FormulaError.None,\r\n ) {\r\n this.kind = kind;\r\n this.#num = num;\r\n this.#obj = obj;\r\n this.errorCode = errorCode;\r\n }\r\n\r\n // ── Cached singletons ────────────────────────────────────────────────────\r\n\r\n static readonly blank = new FormulaValue('blank');\r\n static readonly zero = new FormulaValue('number', 0);\r\n static readonly one = new FormulaValue('number', 1);\r\n static readonly true_ = new FormulaValue('boolean', 1);\r\n static readonly false_ = new FormulaValue('boolean', 0);\r\n static readonly emptyString = new FormulaValue('text', 0, '');\r\n static readonly errorDiv0 = new FormulaValue('error', 0, undefined, FormulaError.Div0);\r\n static readonly errorValue = new FormulaValue('error', 0, undefined, FormulaError.Value);\r\n static readonly errorRef = new FormulaValue('error', 0, undefined, FormulaError.Ref);\r\n static readonly errorName = new FormulaValue('error', 0, undefined, FormulaError.Name);\r\n static readonly errorNA = new FormulaValue('error', 0, undefined, FormulaError.NA);\r\n static readonly errorNum = new FormulaValue('error', 0, undefined, FormulaError.Num);\r\n static readonly errorNull = new FormulaValue('error', 0, undefined, FormulaError.Null);\r\n\r\n // ── Static factories ─────────────────────────────────────────────────────\r\n\r\n static number(v: number): FormulaValue {\r\n if (v === 0) return FormulaValue.zero;\r\n if (v === 1) return FormulaValue.one;\r\n return new FormulaValue('number', v);\r\n }\r\n\r\n static text(v: string): FormulaValue {\r\n if (v === '') return FormulaValue.emptyString;\r\n return new FormulaValue('text', 0, v);\r\n }\r\n\r\n static boolean(v: boolean): FormulaValue {\r\n return v ? FormulaValue.true_ : FormulaValue.false_;\r\n }\r\n\r\n static error(e: FormulaError): FormulaValue {\r\n switch (e) {\r\n case FormulaError.Div0: return FormulaValue.errorDiv0;\r\n case FormulaError.Value: return FormulaValue.errorValue;\r\n case FormulaError.Ref: return FormulaValue.errorRef;\r\n case FormulaError.Name: return FormulaValue.errorName;\r\n case FormulaError.NA: return FormulaValue.errorNA;\r\n case FormulaError.Num: return FormulaValue.errorNum;\r\n case FormulaError.Null: return FormulaValue.errorNull;\r\n default: return new FormulaValue('error', 0, undefined, e);\r\n }\r\n }\r\n\r\n static array(a: ArrayValue): FormulaValue {\r\n return new FormulaValue('array', 0, a);\r\n }\r\n\r\n static lambda(fn: LambdaLike): FormulaValue {\r\n return new FormulaValue('lambda', 0, fn);\r\n }\r\n\r\n // ── Type checks ──────────────────────────────────────────────────────────\r\n\r\n get isBlank(): boolean { return this.kind === 'blank'; }\r\n get isNumber(): boolean { return this.kind === 'number'; }\r\n get isText(): boolean { return this.kind === 'text'; }\r\n get isBoolean(): boolean { return this.kind === 'boolean'; }\r\n get isError(): boolean { return this.kind === 'error'; }\r\n get isArray(): boolean { return this.kind === 'array'; }\r\n get isLambda(): boolean { return this.kind === 'lambda'; }\r\n get isNumeric(): boolean { return this.kind === 'number' || this.kind === 'boolean' || this.kind === 'blank'; }\r\n\r\n // ── Value accessors ──────────────────────────────────────────────────────\r\n\r\n get numberValue(): number { return this.#num; }\r\n get textValue(): string { return (this.#obj as string) ?? ''; }\r\n get booleanValue(): boolean { return this.#num !== 0; }\r\n get arrayVal(): ArrayValue { return (this.#obj as ArrayValue) ?? ArrayValue.empty; }\r\n get lambdaVal(): LambdaLike { return this.#obj as LambdaLike; }\r\n\r\n // ── Coercion (Excel semantics, no exceptions) ─────────────────────────────\r\n\r\n coerceToNumber(): FormulaValue {\r\n switch (this.kind) {\r\n case 'number': return this;\r\n case 'blank': return FormulaValue.zero;\r\n case 'boolean': return FormulaValue.number(this.#num);\r\n case 'error': return this;\r\n case 'text': {\r\n const n = parseFloat(this.textValue);\r\n return isNaN(n) ? FormulaValue.errorValue : FormulaValue.number(n);\r\n }\r\n default: return FormulaValue.errorValue;\r\n }\r\n }\r\n\r\n tryAsDouble(): { ok: true; value: number } | { ok: false } {\r\n switch (this.kind) {\r\n case 'number': return { ok: true, value: this.#num };\r\n case 'blank': return { ok: true, value: 0 };\r\n case 'boolean': return { ok: true, value: this.#num };\r\n case 'text': {\r\n const n = parseFloat(this.textValue);\r\n return isNaN(n) ? { ok: false } : { ok: true, value: n };\r\n }\r\n default: return { ok: false };\r\n }\r\n }\r\n\r\n coerceToBool(): FormulaValue {\r\n switch (this.kind) {\r\n case 'boolean': return this;\r\n case 'number': return FormulaValue.boolean(this.#num !== 0);\r\n case 'blank': return FormulaValue.false_;\r\n case 'error': return this;\r\n case 'text': {\r\n const u = this.textValue.toUpperCase();\r\n if (u === 'TRUE') return FormulaValue.true_;\r\n if (u === 'FALSE') return FormulaValue.false_;\r\n return FormulaValue.errorValue;\r\n }\r\n default: return FormulaValue.errorValue;\r\n }\r\n }\r\n\r\n asText(): string {\r\n switch (this.kind) {\r\n case 'text': return this.textValue;\r\n case 'number': return String(this.#num);\r\n case 'boolean': return this.#num !== 0 ? 'TRUE' : 'FALSE';\r\n case 'blank': return '';\r\n case 'error': return FormulaValue.errorToString(this.errorCode);\r\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\r\n default: return '';\r\n }\r\n }\r\n\r\n // ── Comparison (Excel semantics) ─────────────────────────────────────────\r\n\r\n static areEqual(a: FormulaValue, b: FormulaValue): boolean {\r\n if (a.isBlank && b.isBlank) return true;\r\n if (a.isBlank) {\r\n if (b.isNumber) return Math.abs(b.numberValue) < 1e-10;\r\n if (b.isText) return b.textValue === '';\r\n if (b.isBoolean) return !b.booleanValue;\r\n return false;\r\n }\r\n if (b.isBlank) return FormulaValue.areEqual(b, a);\r\n if (a.kind !== b.kind) return false;\r\n switch (a.kind) {\r\n case 'number': return Math.abs(a.#num - b.#num) < 1e-10;\r\n case 'boolean': return a.#num === b.#num;\r\n case 'text': return a.textValue.toUpperCase() === b.textValue.toUpperCase();\r\n default: return false;\r\n }\r\n }\r\n\r\n /** Excel-compatible sort order: Number/Blank < Text < Boolean. */\r\n static compare(a: FormulaValue, b: FormulaValue): number {\r\n const order = (v: FormulaValue) => v.kind === 'boolean' ? 2 : v.isText ? 1 : 0;\r\n const oa = order(a), ob = order(b);\r\n if (oa !== ob) return oa - ob;\r\n switch (oa) {\r\n case 0: return (a.isBlank ? 0 : a.numberValue) - (b.isBlank ? 0 : b.numberValue);\r\n case 1: return a.textValue.toUpperCase() < b.textValue.toUpperCase() ? -1 : a.textValue.toUpperCase() > b.textValue.toUpperCase() ? 1 : 0;\r\n case 2: return a.#num - b.#num;\r\n default: return 0;\r\n }\r\n }\r\n\r\n // ── Error helpers ─────────────────────────────────────────────────────────\r\n\r\n static errorToString(e: FormulaError): string {\r\n const map: Record<FormulaError, string> = {\r\n [FormulaError.None]: '',\r\n [FormulaError.Null]: '#NULL!',\r\n [FormulaError.Div0]: '#DIV/0!',\r\n [FormulaError.Value]: '#VALUE!',\r\n [FormulaError.Ref]: '#REF!',\r\n [FormulaError.Name]: '#NAME?',\r\n [FormulaError.Num]: '#NUM!',\r\n [FormulaError.NA]: '#N/A',\r\n [FormulaError.Calc]: '#CALC!',\r\n [FormulaError.Spill]: '#SPILL!',\r\n };\r\n return map[e] ?? '#ERROR!';\r\n }\r\n\r\n static errorFromString(s: string): FormulaError {\r\n const map: Record<string, FormulaError> = {\r\n '#NULL!': FormulaError.Null,\r\n '#DIV/0!': FormulaError.Div0,\r\n '#VALUE!': FormulaError.Value,\r\n '#REF!': FormulaError.Ref,\r\n '#NAME?': FormulaError.Name,\r\n '#NUM!': FormulaError.Num,\r\n '#N/A': FormulaError.NA,\r\n '#CALC!': FormulaError.Calc,\r\n '#SPILL!': FormulaError.Spill,\r\n };\r\n return map[s] ?? FormulaError.Value;\r\n }\r\n\r\n // ── JS interop ────────────────────────────────────────────────────────────\r\n\r\n static fromObjectSync(value: unknown): FormulaValue {\r\n if (value === null || value === undefined) return FormulaValue.blank;\r\n if (typeof value === 'number') return isNaN(value) ? FormulaValue.errorValue : FormulaValue.number(value);\r\n if (typeof value === 'boolean') return FormulaValue.boolean(value);\r\n if (typeof value === 'string') return value === '' ? FormulaValue.blank : FormulaValue.text(value);\r\n if (value instanceof Date) {\r\n return FormulaValue.number(toOADate(value));\r\n }\r\n return FormulaValue.text(String(value));\r\n }\r\n\r\n toObject(): unknown {\r\n switch (this.kind) {\r\n case 'number': return this.#num;\r\n case 'text': return this.textValue;\r\n case 'boolean': return this.booleanValue;\r\n case 'blank': return null;\r\n case 'error': return FormulaValue.errorToString(this.errorCode);\r\n case 'array': return this.arrayVal.toObjectArray();\r\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\r\n default: return null;\r\n }\r\n }\r\n\r\n toString(): string { return this.asText(); }\r\n}\r\n\r\n// ── ArrayValue ────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * 2D array value for formula results and range data.\r\n * Port of TVE.PureDocs.Excel.Formulas.ArrayValue (C#)\r\n */\r\nexport class ArrayValue {\r\n static readonly empty = new ArrayValue(0, 0);\r\n\r\n readonly #data: FormulaValue[];\r\n readonly rows: number;\r\n readonly columns: number;\r\n\r\n constructor(rows: number, columns: number) {\r\n this.rows = rows;\r\n this.columns = columns;\r\n this.#data = new Array<FormulaValue>(rows * columns).fill(FormulaValue.blank);\r\n }\r\n\r\n get length(): number { return this.#data.length; }\r\n\r\n get(row: number, col: number): FormulaValue {\r\n if (row < 0 || row >= this.rows || col < 0 || col >= this.columns) {\r\n return FormulaValue.errorRef;\r\n }\r\n return this.#data[row * this.columns + col]!;\r\n }\r\n\r\n set(row: number, col: number, value: FormulaValue): void {\r\n if (row >= 0 && row < this.rows && col >= 0 && col < this.columns) {\r\n this.#data[row * this.columns + col] = value;\r\n }\r\n }\r\n\r\n getFlat(index: number): FormulaValue {\r\n return index >= 0 && index < this.#data.length\r\n ? this.#data[index]!\r\n : FormulaValue.errorRef;\r\n }\r\n\r\n setFlat(index: number, value: FormulaValue): void {\r\n if (index >= 0 && index < this.#data.length) {\r\n this.#data[index] = value;\r\n }\r\n }\r\n\r\n /** Iterate all values in row-major order. */\r\n values(): Iterable<FormulaValue> { return this.#data; }\r\n\r\n toObjectArray(): unknown[] {\r\n return this.#data.map(v => v.toObject());\r\n }\r\n\r\n /** Create from a flat array (single column). */\r\n static fromFlat(values: FormulaValue[]): ArrayValue {\r\n const arr = new ArrayValue(values.length, 1);\r\n values.forEach((v, i) => arr.setFlat(i, v));\r\n return arr;\r\n }\r\n\r\n /** Create a 1×1 array wrapping a scalar value (for broadcasting). */\r\n static fromScalar(value: FormulaValue): ArrayValue {\r\n const arr = new ArrayValue(1, 1);\r\n arr.setFlat(0, value);\r\n return arr;\r\n }\r\n\r\n /** Element-wise broadcasting operation (mirrors ArrayValue.Broadcast in C#). */\r\n static broadcast(\r\n a: ArrayValue,\r\n b: ArrayValue,\r\n op: (av: FormulaValue, bv: FormulaValue) => FormulaValue,\r\n ): ArrayValue {\r\n const rows = Math.max(a.rows, b.rows);\r\n const cols = Math.max(a.columns, b.columns);\r\n\r\n // Validate compatibility\r\n if ((a.rows !== 1 && b.rows !== 1 && a.rows !== b.rows) ||\r\n (a.columns !== 1 && b.columns !== 1 && a.columns !== b.columns)) {\r\n const err = new ArrayValue(rows, cols);\r\n for (let i = 0; i < err.length; i++) err.setFlat(i, FormulaValue.errorValue);\r\n return err;\r\n }\r\n\r\n const result = new ArrayValue(rows, cols);\r\n for (let r = 0; r < rows; r++) {\r\n for (let c = 0; c < cols; c++) {\r\n const av = a.get(r < a.rows ? r : 0, c < a.columns ? c : 0);\r\n const bv = b.get(r < b.rows ? r : 0, c < b.columns ? c : 0);\r\n result.set(r, c, op(av, bv));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Implicit intersection: reduce array to scalar based on formula position. */\r\n implicitIntersect(formulaRow: number, formulaCol: number, rangeStartRow: number, rangeStartCol: number): FormulaValue {\r\n if (this.rows === 1 && this.columns === 1) return this.get(0, 0);\r\n if (this.columns === 1) {\r\n const offset = formulaRow - rangeStartRow;\r\n return offset >= 0 && offset < this.rows ? this.get(offset, 0) : FormulaValue.errorValue;\r\n }\r\n if (this.rows === 1) {\r\n const offset = formulaCol - rangeStartCol;\r\n return offset >= 0 && offset < this.columns ? this.get(0, offset) : FormulaValue.errorValue;\r\n }\r\n const ro = formulaRow - rangeStartRow;\r\n const co = formulaCol - rangeStartCol;\r\n return ro >= 0 && ro < this.rows && co >= 0 && co < this.columns\r\n ? this.get(ro, co)\r\n : FormulaValue.errorValue;\r\n }\r\n\r\n transpose(): ArrayValue {\r\n const result = new ArrayValue(this.columns, this.rows);\r\n for (let r = 0; r < this.rows; r++) {\r\n for (let c = 0; c < this.columns; c++) {\r\n result.set(c, r, this.get(r, c));\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n","/**\r\n * Tokens produced by the formula lexer.\r\n * Port of TVE.PureDocs.Excel.Formulas.FormulaToken + FormulaTokenType (C#)\r\n */\r\n\r\nexport const enum TokenType {\r\n Number,\r\n String,\r\n Boolean,\r\n CellReference,\r\n Colon,\r\n Function,\r\n LeftParen,\r\n RightParen,\r\n Comma,\r\n Plus,\r\n Minus,\r\n Multiply,\r\n Divide,\r\n Power,\r\n Percent,\r\n Ampersand,\r\n Equal,\r\n NotEqual,\r\n LessThan,\r\n LessThanOrEqual,\r\n GreaterThan,\r\n GreaterThanOrEqual,\r\n SheetReference,\r\n NamedRange,\r\n SpillReference,\r\n Exclamation,\r\n AtSign,\r\n ErrorLiteral,\r\n EOF,\r\n}\r\n\r\nexport interface Token {\r\n readonly type: TokenType;\r\n readonly value: string;\r\n readonly position: number;\r\n}\r\n\r\nexport function makeToken(type: TokenType, value: string, position: number): Token {\r\n return { type, value, position };\r\n}\r\n","/**\r\n * Tokenises an Excel formula string into a sequence of tokens.\r\n * Full port of TVE.PureDocs.Excel.Formulas.FormulaLexer (C#)\r\n *\r\n * Supports:\r\n * - String literals (\"hello\")\r\n * - Error literals (#N/A, #REF!, #VALUE!, etc.)\r\n * - Quoted sheet references ('My Sheet'!A1)\r\n * - Unquoted sheet references (Sheet1!A1)\r\n * - _xlfn. prefix stripping\r\n * - Cell references ($A$1, A1, AA123)\r\n * - Named ranges\r\n * - @ implicit intersection operator\r\n * - All standard operators\r\n */\r\nimport { Token, TokenType, makeToken } from './formula-token.js';\r\n\r\nexport class FormulaException extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'FormulaException';\r\n }\r\n}\r\n\r\nconst KNOWN_ERRORS = new Set([\r\n '#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A', '#CALC!', '#SPILL!',\r\n]);\r\n\r\nexport class FormulaLexer {\r\n readonly #formula: string;\r\n #pos = 0;\r\n\r\n constructor(formula: string) {\r\n if (!formula) throw new FormulaException('Formula cannot be empty.');\r\n this.#formula = formula;\r\n }\r\n\r\n tokenize(): Token[] {\r\n this.#pos = 0;\r\n const tokens: Token[] = [];\r\n\r\n while (this.#pos < this.#formula.length) {\r\n this.#skipWhitespace();\r\n if (this.#pos >= this.#formula.length) break;\r\n\r\n const token = this.#readNextToken();\r\n if (token) tokens.push(token);\r\n }\r\n\r\n tokens.push(makeToken(TokenType.EOF, '', this.#pos));\r\n return tokens;\r\n }\r\n\r\n // ── Private tokenisers ─────────────────────────────────────────────────────\r\n\r\n #readNextToken(): Token | null {\r\n const c = this.#formula[this.#pos]!;\r\n\r\n if (c === '\"') return this.#readString();\r\n if (c === '#') return this.#readErrorLiteral();\r\n if (c === \"'\") return this.#readQuotedSheetRef();\r\n\r\n if (c === '.' && this.#pos + 1 < this.#formula.length && /\\d/.test(this.#formula[this.#pos + 1]!)) {\r\n return this.#readNumber();\r\n }\r\n if (/\\d/.test(c)) return this.#readNumber();\r\n if (/[a-zA-Z_$]/.test(c)) return this.#readIdentifier();\r\n\r\n return this.#readOperator();\r\n }\r\n\r\n #readString(): Token {\r\n const start = this.#pos++;\r\n let value = '';\r\n\r\n while (this.#pos < this.#formula.length) {\r\n const ch = this.#formula[this.#pos];\r\n if (ch === '\"') {\r\n this.#pos++;\r\n if (this.#formula[this.#pos] === '\"') { value += '\"'; this.#pos++; }\r\n else return makeToken(TokenType.String, value, start);\r\n } else {\r\n value += ch;\r\n this.#pos++;\r\n }\r\n }\r\n throw new FormulaException(`Unterminated string at position ${start}.`);\r\n }\r\n\r\n #readErrorLiteral(): Token {\r\n const start = this.#pos;\r\n let raw = '#';\r\n this.#pos++;\r\n\r\n while (this.#pos < this.#formula.length) {\r\n const ch = this.#formula[this.#pos]!;\r\n if (/[a-zA-Z0-9/]/.test(ch) || ch === '!' || ch === '?') {\r\n raw += ch;\r\n this.#pos++;\r\n if (ch === '!' || ch === '?') break;\r\n } else break;\r\n }\r\n\r\n const upper = raw.toUpperCase();\r\n if (!KNOWN_ERRORS.has(upper)) {\r\n throw new FormulaException(`Unknown error literal \"${raw}\" at position ${start}.`);\r\n }\r\n return makeToken(TokenType.ErrorLiteral, upper, start);\r\n }\r\n\r\n #readQuotedSheetRef(): Token {\r\n const start = this.#pos++;\r\n let sheetName = '';\r\n\r\n while (this.#pos < this.#formula.length) {\r\n const ch = this.#formula[this.#pos]!;\r\n if (ch === \"'\") {\r\n this.#pos++;\r\n if (this.#formula[this.#pos] === \"'\") { sheetName += \"'\"; this.#pos++; }\r\n else {\r\n if (this.#formula[this.#pos] !== '!') {\r\n throw new FormulaException(`Expected '!' after quoted sheet name at position ${start}.`);\r\n }\r\n this.#pos++; // skip !\r\n const cellRef = this.#readCellRefChars();\r\n return makeToken(TokenType.SheetReference, `${sheetName}!${cellRef}`, start);\r\n }\r\n } else {\r\n sheetName += ch;\r\n this.#pos++;\r\n }\r\n }\r\n throw new FormulaException(`Unterminated quoted sheet name at position ${start}.`);\r\n }\r\n\r\n #readNumber(): Token {\r\n const start = this.#pos;\r\n let raw = '';\r\n let hasDot = false;\r\n let hasE = false;\r\n\r\n while (this.#pos < this.#formula.length) {\r\n const ch = this.#formula[this.#pos]!;\r\n if (/\\d/.test(ch)) { raw += ch; this.#pos++; }\r\n else if (ch === '.' && !hasDot && !hasE) { hasDot = true; raw += ch; this.#pos++; }\r\n else if ((ch === 'e' || ch === 'E') && !hasE && raw.length > 0) {\r\n hasE = true; raw += ch; this.#pos++;\r\n if (this.#formula[this.#pos] === '+' || this.#formula[this.#pos] === '-') {\r\n raw += this.#formula[this.#pos++];\r\n }\r\n } else break;\r\n }\r\n\r\n return makeToken(TokenType.Number, raw, start);\r\n }\r\n\r\n #readIdentifier(): Token {\r\n const start = this.#pos;\r\n let raw = '';\r\n\r\n while (this.#pos < this.#formula.length) {\r\n const ch = this.#formula[this.#pos]!;\r\n if (/[a-zA-Z0-9_$.]/.test(ch)) { raw += ch; this.#pos++; }\r\n else break;\r\n }\r\n\r\n // Strip _xlfn. prefix\r\n let upper = raw.toUpperCase();\r\n if (upper.startsWith('_XLFN.')) { raw = raw.slice(6); upper = upper.slice(6); }\r\n\r\n if (upper === 'TRUE') return makeToken(TokenType.Boolean, 'TRUE', start);\r\n if (upper === 'FALSE') return makeToken(TokenType.Boolean, 'FALSE', start);\r\n\r\n // Sheet reference: Identifier!CellRef\r\n if (this.#formula[this.#pos] === '!') {\r\n this.#pos++; // skip !\r\n const cellRef = this.#readCellRefChars();\r\n return makeToken(TokenType.SheetReference, `${raw}!${cellRef}`, start);\r\n }\r\n\r\n // Function: Identifier followed by (\r\n this.#skipWhitespace();\r\n if (this.#formula[this.#pos] === '(') {\r\n return makeToken(TokenType.Function, upper, start);\r\n }\r\n\r\n // Cell reference or named range\r\n const stripped = raw.replace(/\\$/g, '');\r\n if (isCellRef(stripped)) {\r\n // Spill-range operator: A1# refers to the array that spills from A1.\r\n if (this.#formula[this.#pos] === '#') {\r\n this.#pos++; // consume '#'\r\n return makeToken(TokenType.SpillReference, stripped, start);\r\n }\r\n return makeToken(TokenType.CellReference, stripped, start);\r\n }\r\n return makeToken(TokenType.NamedRange, raw, start);\r\n }\r\n\r\n #readCellRefChars(): string {\r\n let ref = '';\r\n while (this.#pos < this.#formula.length) {\r\n const ch = this.#formula[this.#pos]!;\r\n if (/[a-zA-Z0-9$]/.test(ch)) { ref += ch; this.#pos++; }\r\n else break;\r\n }\r\n return ref.replace(/\\$/g, '');\r\n }\r\n\r\n #readOperator(): Token {\r\n const start = this.#pos;\r\n const ch = this.#formula[this.#pos++]!;\r\n\r\n switch (ch) {\r\n case '(': return makeToken(TokenType.LeftParen, '(', start);\r\n case ')': return makeToken(TokenType.RightParen, ')', start);\r\n case ',': return makeToken(TokenType.Comma, ',', start);\r\n case ':': return makeToken(TokenType.Colon, ':', start);\r\n case '+': return makeToken(TokenType.Plus, '+', start);\r\n case '-': return makeToken(TokenType.Minus, '-', start);\r\n case '*': return makeToken(TokenType.Multiply, '*', start);\r\n case '/': return makeToken(TokenType.Divide, '/', start);\r\n case '^': return makeToken(TokenType.Power, '^', start);\r\n case '%': return makeToken(TokenType.Percent, '%', start);\r\n case '&': return makeToken(TokenType.Ampersand, '&', start);\r\n case '=': return makeToken(TokenType.Equal, '=', start);\r\n case '@': return makeToken(TokenType.AtSign, '@', start);\r\n case '!': return makeToken(TokenType.Exclamation,'!', start);\r\n case '<':\r\n if (this.#formula[this.#pos] === '>') { this.#pos++; return makeToken(TokenType.NotEqual, '<>', start); }\r\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.LessThanOrEqual, '<=', start); }\r\n return makeToken(TokenType.LessThan, '<', start);\r\n case '>':\r\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.GreaterThanOrEqual, '>=', start); }\r\n return makeToken(TokenType.GreaterThan, '>', start);\r\n default:\r\n throw new FormulaException(`Unexpected character '${ch}' at position ${start}.`);\r\n }\r\n }\r\n\r\n #skipWhitespace(): void {\r\n while (this.#pos < this.#formula.length && /\\s/.test(this.#formula[this.#pos]!)) {\r\n this.#pos++;\r\n }\r\n }\r\n}\r\n\r\nfunction isCellRef(s: string): boolean {\r\n if (s.length < 2) return false;\r\n let i = 0;\r\n while (i < s.length && /[a-zA-Z]/.test(s[i]!)) i++;\r\n if (i === 0 || i >= s.length) return false;\r\n while (i < s.length && /\\d/.test(s[i]!)) i++;\r\n return i === s.length;\r\n}\r\n","/**\r\n * AST node types for formula expressions.\r\n * Port of TVE.PureDocs.Excel.Formulas.FormulaNode (C#)\r\n */\r\nimport { FormulaValue, FormulaError, ArrayValue, TailCall } from './formula-value.js';\r\nimport type { FormulaContext } from './formula-context.js';\r\n\r\n// ── Base ───────────────────────────────────────────────────────────────────\r\n\r\nexport abstract class FormulaNode {\r\n abstract evaluate(ctx: FormulaContext): FormulaValue;\r\n\r\n /**\r\n * Evaluates this node in tail position. Returns a TailCall when the node's\r\n * value is a call to a lambda in tail position (so the caller's trampoline can\r\n * iterate without growing the stack); otherwise the final value. The default\r\n * is a plain evaluate — only control-flow and call nodes override it.\r\n */\r\n evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\r\n return this.evaluate(ctx);\r\n }\r\n}\r\n\r\n// ── Literals ───────────────────────────────────────────────────────────────\r\n\r\nexport class NumberNode extends FormulaNode {\r\n constructor(readonly value: number) { super(); }\r\n evaluate(): FormulaValue { return FormulaValue.number(this.value); }\r\n}\r\n\r\nexport class StringNode extends FormulaNode {\r\n constructor(readonly value: string) { super(); }\r\n evaluate(): FormulaValue { return FormulaValue.text(this.value); }\r\n}\r\n\r\nexport class BooleanNode extends FormulaNode {\r\n constructor(readonly value: boolean) { super(); }\r\n evaluate(): FormulaValue { return FormulaValue.boolean(this.value); }\r\n}\r\n\r\nexport class ErrorNode extends FormulaNode {\r\n constructor(readonly errorValue: FormulaValue) { super(); }\r\n evaluate(): FormulaValue { return this.errorValue; }\r\n}\r\n\r\n/** Represents an empty/omitted argument in a function call (e.g. IF(A1,,0)). */\r\nexport class BlankNode extends FormulaNode {\r\n evaluate(): FormulaValue { return FormulaValue.blank; }\r\n}\r\n\r\n// ── References ────────────────────────────────────────────────────────────\r\n\r\nexport class CellReferenceNode extends FormulaNode {\r\n constructor(readonly reference: string) { super(); }\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.getCellValue(this.reference);\r\n }\r\n}\r\n\r\nexport class RangeReferenceNode extends FormulaNode {\r\n constructor(readonly startRef: string, readonly endRef: string) { super(); }\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.getRangeValues(this.startRef, this.endRef);\r\n }\r\n}\r\n\r\nexport class SheetCellReferenceNode extends FormulaNode {\r\n constructor(readonly sheetName: string, readonly cellReference: string) { super(); }\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.getSheetCellValue(this.sheetName, this.cellReference);\r\n }\r\n}\r\n\r\nexport class SheetRangeReferenceNode extends FormulaNode {\r\n constructor(\r\n readonly sheetName: string,\r\n readonly startRef: string,\r\n readonly endRef: string,\r\n ) { super(); }\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.getSheetRangeValues(this.sheetName, this.startRef, this.endRef);\r\n }\r\n}\r\n\r\nexport class NamedRangeNode extends FormulaNode {\r\n constructor(readonly name: string) { super(); }\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.resolveNamedRange(this.name);\r\n }\r\n}\r\n\r\n/** Spill-range reference (A1#): the array that spills from an anchor cell. */\r\nexport class SpillReferenceNode extends FormulaNode {\r\n constructor(readonly anchorRef: string) { super(); }\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.resolveSpillRange(this.anchorRef);\r\n }\r\n}\r\n\r\n// ── Operators ─────────────────────────────────────────────────────────────\r\n\r\nexport const enum BinaryOperator {\r\n Add, Subtract, Multiply, Divide, Power,\r\n Concatenate,\r\n Equal, NotEqual, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual,\r\n}\r\n\r\nexport const enum UnaryOperator {\r\n Negate, Plus, Percent,\r\n}\r\n\r\nexport class BinaryOpNode extends FormulaNode {\r\n constructor(\r\n readonly left: FormulaNode,\r\n readonly op: BinaryOperator,\r\n readonly right: FormulaNode,\r\n ) { super(); }\r\n\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n const l = this.left.evaluate(ctx);\r\n const r = this.right.evaluate(ctx);\r\n\r\n // Array broadcasting\r\n if (l.isArray || r.isArray) {\r\n const la = l.isArray ? l.arrayVal : ArrayValue.fromScalar(l);\r\n const ra = r.isArray ? r.arrayVal : ArrayValue.fromScalar(r);\r\n return FormulaValue.array(\r\n ArrayValue.broadcast(la, ra, (a, b) => this.#evalScalar(a, b)),\r\n );\r\n }\r\n\r\n return this.#evalScalar(l, r);\r\n }\r\n\r\n #evalScalar(l: FormulaValue, r: FormulaValue): FormulaValue {\r\n const op = this.op;\r\n\r\n // Comparisons\r\n if (op === BinaryOperator.Equal) return FormulaValue.boolean(FormulaValue.areEqual(l, r));\r\n if (op === BinaryOperator.NotEqual) return FormulaValue.boolean(!FormulaValue.areEqual(l, r));\r\n if (op === BinaryOperator.LessThan) return FormulaValue.boolean(FormulaValue.compare(l, r) < 0);\r\n if (op === BinaryOperator.LessThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) <= 0);\r\n if (op === BinaryOperator.GreaterThan) return FormulaValue.boolean(FormulaValue.compare(l, r) > 0);\r\n if (op === BinaryOperator.GreaterThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) >= 0);\r\n\r\n // Concatenation\r\n if (op === BinaryOperator.Concatenate) {\r\n if (l.isError) return l;\r\n if (r.isError) return r;\r\n return FormulaValue.text(l.asText() + r.asText());\r\n }\r\n\r\n // Arithmetic — coerce to numbers\r\n const ln = l.coerceToNumber();\r\n if (ln.isError) return ln;\r\n const rn = r.coerceToNumber();\r\n if (rn.isError) return rn;\r\n\r\n const lv = ln.numberValue;\r\n const rv = rn.numberValue;\r\n\r\n switch (op) {\r\n case BinaryOperator.Add: return FormulaValue.number(lv + rv);\r\n case BinaryOperator.Subtract: return FormulaValue.number(lv - rv);\r\n case BinaryOperator.Multiply: return FormulaValue.number(lv * rv);\r\n case BinaryOperator.Divide:\r\n if (rv === 0) return FormulaValue.errorDiv0;\r\n return FormulaValue.number(lv / rv);\r\n case BinaryOperator.Power:\r\n return FormulaValue.number(Math.pow(lv, rv));\r\n default:\r\n return FormulaValue.errorValue;\r\n }\r\n }\r\n}\r\n\r\nexport class UnaryOpNode extends FormulaNode {\r\n constructor(readonly op: UnaryOperator, readonly operand: FormulaNode) { super(); }\r\n\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n const val = this.operand.evaluate(ctx);\r\n\r\n if (this.op === UnaryOperator.Plus) {\r\n return val.coerceToNumber();\r\n }\r\n if (this.op === UnaryOperator.Negate) {\r\n const n = val.coerceToNumber();\r\n if (n.isError) return n;\r\n return FormulaValue.number(-n.numberValue);\r\n }\r\n if (this.op === UnaryOperator.Percent) {\r\n const n = val.coerceToNumber();\r\n if (n.isError) return n;\r\n return FormulaValue.number(n.numberValue / 100);\r\n }\r\n return FormulaValue.errorValue;\r\n }\r\n}\r\n\r\n/** @ implicit intersection operator (Excel 365). */\r\nexport class ImplicitIntersectionNode extends FormulaNode {\r\n constructor(readonly inner: FormulaNode) { super(); }\r\n\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n const val = this.inner.evaluate(ctx);\r\n if (!val.isArray) return val;\r\n return val.arrayVal.implicitIntersect(ctx.formulaRow, ctx.formulaCol, 0, 0);\r\n }\r\n}\r\n\r\n// ── Function call ─────────────────────────────────────────────────────────\r\n\r\nexport class FunctionCallNode extends FormulaNode {\r\n constructor(\r\n readonly functionName: string,\r\n readonly args: FormulaNode[],\r\n ) { super(); }\r\n\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n return ctx.evaluateFunction(this.functionName, this.args);\r\n }\r\n\r\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\r\n const name = this.functionName;\r\n const a = this.args;\r\n\r\n // Control-flow functions are tail-transparent: tail position flows into the\r\n // branch they select. Branch selection mirrors the handlers exactly.\r\n switch (name) {\r\n case 'IF': {\r\n const cond = a[0]!.evaluate(ctx);\r\n if (cond.isError) return cond;\r\n const b = cond.coerceToBool();\r\n if (b.isError) return b;\r\n if (b.booleanValue) return a[1]!.evaluateTail(ctx);\r\n return a.length > 2 ? a[2]!.evaluateTail(ctx) : FormulaValue.false_;\r\n }\r\n case 'IFS': {\r\n for (let i = 0; i + 1 < a.length; i += 2) {\r\n const cond = a[i]!.evaluate(ctx);\r\n if (cond.isError) return cond;\r\n const b = cond.coerceToBool();\r\n if (b.isError) return b;\r\n if (b.booleanValue) return a[i + 1]!.evaluateTail(ctx);\r\n }\r\n return FormulaValue.errorNA;\r\n }\r\n case 'IFERROR': {\r\n const v = a[0]!.evaluate(ctx);\r\n return v.isError ? a[1]!.evaluateTail(ctx) : v;\r\n }\r\n case 'IFNA': {\r\n const v = a[0]!.evaluate(ctx);\r\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluateTail(ctx) : v;\r\n }\r\n case 'LET': {\r\n if (a.length < 3 || a.length % 2 === 0) break;\r\n const bindings = new Map<string, FormulaValue>();\r\n ctx.pushScope(bindings);\r\n try {\r\n for (let i = 0; i < a.length - 1; i += 2) {\r\n const nn = a[i]!;\r\n if (!(nn instanceof NamedRangeNode)) return FormulaValue.errorValue;\r\n const val = a[i + 1]!.evaluate(ctx);\r\n if (val.isError) return val;\r\n bindings.set(nn.name.toUpperCase(), val);\r\n }\r\n // Args of any tail call are evaluated eagerly here (scope still in place).\r\n return a[a.length - 1]!.evaluateTail(ctx);\r\n } finally {\r\n ctx.popScope();\r\n }\r\n }\r\n }\r\n\r\n // A call to an unregistered name that resolves to a lambda is a tail call.\r\n if (!ctx.hasFunction(name)) {\r\n const named = ctx.resolveNamedRange(name);\r\n if (named.isLambda) {\r\n return new TailCall(named.lambdaVal, a.map(arg => arg.evaluate(ctx)));\r\n }\r\n }\r\n return this.evaluate(ctx);\r\n }\r\n}\r\n\r\n/**\r\n * Calls the value produced by an expression (e.g. an inline LAMBDA:\r\n * `LAMBDA(x,x+1)(5)`). The callee must evaluate to a lambda, else #VALUE!.\r\n */\r\nexport class CallNode extends FormulaNode {\r\n constructor(readonly callee: FormulaNode, readonly args: FormulaNode[]) { super(); }\r\n\r\n evaluate(ctx: FormulaContext): FormulaValue {\r\n const fn = this.callee.evaluate(ctx);\r\n if (fn.isError) return fn;\r\n if (!fn.isLambda) return FormulaValue.errorValue;\r\n return fn.lambdaVal.call(this.args.map(a => a.evaluate(ctx)));\r\n }\r\n\r\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\r\n const fn = this.callee.evaluate(ctx);\r\n if (fn.isError) return fn;\r\n if (!fn.isLambda) return FormulaValue.errorValue;\r\n return new TailCall(fn.lambdaVal, this.args.map(a => a.evaluate(ctx)));\r\n }\r\n}\r\n","/**\r\n * Recursive descent parser converting formula tokens into an AST.\r\n * Port of TVE.PureDocs.Excel.Formulas.FormulaParser (C#)\r\n *\r\n * Operator precedence (low → high):\r\n * Comparison: =, <>, <, <=, >, >=\r\n * Concatenation: &\r\n * Addition/Subtraction: +, -\r\n * Multiplication/Division: *, /\r\n * Unary: +, -, @ (prefix)\r\n * Power: ^ (right-associative)\r\n * Percent: % (postfix)\r\n * Primary: literals, refs, functions, parentheses\r\n */\r\nimport { Token, TokenType } from './formula-token.js';\r\nimport { FormulaException } from './formula-lexer.js';\r\nimport {\r\n FormulaNode, NumberNode, StringNode, BooleanNode, ErrorNode, BlankNode,\r\n CellReferenceNode, RangeReferenceNode, SheetCellReferenceNode, SheetRangeReferenceNode,\r\n NamedRangeNode, SpillReferenceNode, FunctionCallNode, CallNode,\r\n BinaryOpNode, BinaryOperator, UnaryOpNode, UnaryOperator,\r\n ImplicitIntersectionNode,\r\n} from './formula-node.js';\r\nimport { FormulaValue } from './formula-value.js';\r\n\r\nexport class FormulaParser {\r\n readonly #tokens: Token[];\r\n #pos = 0;\r\n\r\n constructor(tokens: Token[]) {\r\n this.#tokens = tokens;\r\n }\r\n\r\n parse(): FormulaNode {\r\n this.#pos = 0;\r\n const node = this.#parseComparison();\r\n if (this.#current.type !== TokenType.EOF) {\r\n throw new FormulaException(\r\n `Unexpected token '${this.#current.value}' at position ${this.#current.position}.`,\r\n );\r\n }\r\n return node;\r\n }\r\n\r\n // ── Token helpers ──────────────────────────────────────────────────────────\r\n\r\n get #current(): Token {\r\n return this.#tokens[this.#pos] ?? { type: TokenType.EOF, value: '', position: -1 };\r\n }\r\n\r\n #advance(): Token {\r\n const t = this.#current;\r\n this.#pos++;\r\n return t;\r\n }\r\n\r\n #expect(type: TokenType): Token {\r\n if (this.#current.type !== type) {\r\n throw new FormulaException(\r\n `Expected token type ${type} but got ${this.#current.type} ('${this.#current.value}') at position ${this.#current.position}.`,\r\n );\r\n }\r\n return this.#advance();\r\n }\r\n\r\n // ── Precedence levels ──────────────────────────────────────────────────────\r\n\r\n #parseComparison(): FormulaNode {\r\n let left = this.#parseConcatenation();\r\n while (true) {\r\n const op = comparisonOp(this.#current.type);\r\n if (op === null) break;\r\n this.#advance();\r\n left = new BinaryOpNode(left, op, this.#parseConcatenation());\r\n }\r\n return left;\r\n }\r\n\r\n #parseConcatenation(): FormulaNode {\r\n let left = this.#parseAddSub();\r\n while (this.#current.type === TokenType.Ampersand) {\r\n this.#advance();\r\n left = new BinaryOpNode(left, BinaryOperator.Concatenate, this.#parseAddSub());\r\n }\r\n return left;\r\n }\r\n\r\n #parseAddSub(): FormulaNode {\r\n let left = this.#parseMulDiv();\r\n while (true) {\r\n const t = this.#current.type;\r\n if (t !== TokenType.Plus && t !== TokenType.Minus) break;\r\n this.#advance();\r\n const op = t === TokenType.Plus ? BinaryOperator.Add : BinaryOperator.Subtract;\r\n left = new BinaryOpNode(left, op, this.#parseMulDiv());\r\n }\r\n return left;\r\n }\r\n\r\n #parseMulDiv(): FormulaNode {\r\n let left = this.#parseUnary();\r\n while (true) {\r\n const t = this.#current.type;\r\n if (t !== TokenType.Multiply && t !== TokenType.Divide) break;\r\n this.#advance();\r\n const op = t === TokenType.Multiply ? BinaryOperator.Multiply : BinaryOperator.Divide;\r\n left = new BinaryOpNode(left, op, this.#parseUnary());\r\n }\r\n return left;\r\n }\r\n\r\n #parseUnary(): FormulaNode {\r\n if (this.#current.type === TokenType.Minus) {\r\n this.#advance();\r\n return new UnaryOpNode(UnaryOperator.Negate, this.#parsePower());\r\n }\r\n if (this.#current.type === TokenType.Plus) {\r\n this.#advance();\r\n return new UnaryOpNode(UnaryOperator.Plus, this.#parsePower());\r\n }\r\n if (this.#current.type === TokenType.AtSign) {\r\n this.#advance();\r\n return new ImplicitIntersectionNode(this.#parsePower());\r\n }\r\n return this.#parsePower();\r\n }\r\n\r\n #parsePower(): FormulaNode {\r\n const left = this.#parsePercent();\r\n if (this.#current.type === TokenType.Power) {\r\n this.#advance();\r\n // Right-associative\r\n return new BinaryOpNode(left, BinaryOperator.Power, this.#parseUnary());\r\n }\r\n return left;\r\n }\r\n\r\n #parsePercent(): FormulaNode {\r\n let node = this.#parsePostfix();\r\n while (this.#current.type === TokenType.Percent) {\r\n this.#advance();\r\n node = new UnaryOpNode(UnaryOperator.Percent, node);\r\n }\r\n return node;\r\n }\r\n\r\n /** Handles postfix call syntax on an expression, e.g. LAMBDA(x,x+1)(5). */\r\n #parsePostfix(): FormulaNode {\r\n let node = this.#parsePrimary();\r\n while (this.#current.type === TokenType.LeftParen) {\r\n this.#advance(); // consume '('\r\n node = new CallNode(node, this.#parseArgList());\r\n }\r\n return node;\r\n }\r\n\r\n #parsePrimary(): FormulaNode {\r\n const token = this.#current;\r\n\r\n switch (token.type) {\r\n case TokenType.Number: {\r\n this.#advance();\r\n const n = parseFloat(token.value);\r\n if (isNaN(n)) throw new FormulaException(`Invalid number: ${token.value}`);\r\n return new NumberNode(n);\r\n }\r\n\r\n case TokenType.String:\r\n this.#advance();\r\n return new StringNode(token.value);\r\n\r\n case TokenType.Boolean:\r\n this.#advance();\r\n return new BooleanNode(token.value === 'TRUE');\r\n\r\n case TokenType.ErrorLiteral:\r\n this.#advance();\r\n return new ErrorNode(FormulaValue.error(FormulaValue.errorFromString(token.value)));\r\n\r\n case TokenType.CellReference: {\r\n this.#advance();\r\n // Check for range A1:B5\r\n if (this.#current.type === TokenType.Colon) {\r\n this.#advance();\r\n const end = this.#expect(TokenType.CellReference);\r\n return new RangeReferenceNode(token.value, end.value);\r\n }\r\n return new CellReferenceNode(token.value);\r\n }\r\n\r\n case TokenType.SheetReference: {\r\n this.#advance();\r\n const parts = token.value.split('!');\r\n const sheetName = parts[0]!;\r\n const cellRef = parts[1] ?? '';\r\n // Check for range Sheet1!A1:B5\r\n if (this.#current.type === TokenType.Colon) {\r\n this.#advance();\r\n const end = this.#expect(TokenType.CellReference);\r\n return new SheetRangeReferenceNode(sheetName, cellRef, end.value);\r\n }\r\n return new SheetCellReferenceNode(sheetName, cellRef);\r\n }\r\n\r\n case TokenType.NamedRange:\r\n this.#advance();\r\n return new NamedRangeNode(token.value);\r\n\r\n case TokenType.SpillReference:\r\n this.#advance();\r\n return new SpillReferenceNode(token.value);\r\n\r\n case TokenType.Function:\r\n return this.#parseFunction();\r\n\r\n case TokenType.LeftParen: {\r\n this.#advance();\r\n const expr = this.#parseComparison();\r\n this.#expect(TokenType.RightParen);\r\n return expr;\r\n }\r\n\r\n default:\r\n throw new FormulaException(\r\n `Unexpected token '${token.value}' (type ${token.type}) at position ${token.position}.`,\r\n );\r\n }\r\n }\r\n\r\n #parseFunction(): FormulaNode {\r\n const nameToken = this.#advance();\r\n this.#expect(TokenType.LeftParen);\r\n return new FunctionCallNode(nameToken.value.toUpperCase(), this.#parseArgList());\r\n }\r\n\r\n /** Parses a comma-separated argument list up to and including the ')'. */\r\n #parseArgList(): FormulaNode[] {\r\n const args: FormulaNode[] = [];\r\n\r\n if (this.#current.type !== TokenType.RightParen) {\r\n // First arg — may be blank if leading comma\r\n if (this.#current.type === TokenType.Comma) {\r\n args.push(new BlankNode());\r\n } else {\r\n args.push(this.#parseComparison());\r\n }\r\n\r\n while (this.#current.type === TokenType.Comma) {\r\n this.#advance(); // consume comma\r\n if (\r\n this.#current.type === TokenType.Comma ||\r\n this.#current.type === TokenType.RightParen\r\n ) {\r\n args.push(new BlankNode());\r\n } else {\r\n args.push(this.#parseComparison());\r\n }\r\n }\r\n }\r\n\r\n this.#expect(TokenType.RightParen);\r\n return args;\r\n }\r\n}\r\n\r\nfunction comparisonOp(type: TokenType): BinaryOperator | null {\r\n switch (type) {\r\n case TokenType.Equal: return BinaryOperator.Equal;\r\n case TokenType.NotEqual: return BinaryOperator.NotEqual;\r\n case TokenType.LessThan: return BinaryOperator.LessThan;\r\n case TokenType.LessThanOrEqual: return BinaryOperator.LessThanOrEqual;\r\n case TokenType.GreaterThan: return BinaryOperator.GreaterThan;\r\n case TokenType.GreaterThanOrEqual: return BinaryOperator.GreaterThanOrEqual;\r\n default: return null;\r\n }\r\n}\r\n","/**\r\n * Mathematical and aggregate Excel functions.\r\n * Port of TVE.PureDocs.Excel.Formulas.MathFunctions (C#)\r\n */\r\nimport { FormulaValue } from '../formula-value.js';\r\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\r\nimport type { FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerMath(r: FunctionRegistry): void {\r\n r.register('SUM', sum, 1);\r\n r.register('AVERAGE', average, 1);\r\n r.register('MIN', min, 1);\r\n r.register('MAX', max, 1);\r\n r.register('COUNT', count, 1);\r\n r.register('COUNTA', countA, 1);\r\n r.register('COUNTBLANK', countBlank, 1, 1);\r\n r.register('COUNTIF', countIf, 2, 2);\r\n r.register('COUNTIFS', countIfs, 2);\r\n r.register('SUMIF', sumIf, 2, 3);\r\n r.register('SUMIFS', sumIfs, 3);\r\n r.register('AVERAGEIF', averageIf, 2, 3);\r\n r.register('AVERAGEIFS', averageIfs, 3);\r\n r.register('PRODUCT', product, 1);\r\n r.register('SUMPRODUCT', sumProduct, 1);\r\n r.register('SUMSQ', sumSq, 1);\r\n r.register('ABS', abs, 1, 1);\r\n r.register('ROUND', round, 2, 2);\r\n r.register('ROUNDUP', roundUp, 2, 2);\r\n r.register('ROUNDDOWN', roundDown, 2, 2);\r\n r.register('CEILING', ceiling, 2, 2);\r\n r.register('CEILING.MATH', ceiling, 2, 2);\r\n r.register('FLOOR', floor, 2, 2);\r\n r.register('FLOOR.MATH', floor, 2, 2);\r\n r.register('INT', int_, 1, 1);\r\n r.register('TRUNC', trunc, 1, 2);\r\n r.register('MOD', mod, 2, 2);\r\n r.register('QUOTIENT', quotient, 2, 2);\r\n r.register('POWER', power, 2, 2);\r\n r.register('SQRT', sqrt, 1, 1);\r\n r.register('SIGN', sign, 1, 1);\r\n r.register('PI', pi, 0, 0);\r\n r.register('RAND', rand, 0, 0, true);\r\n r.register('RANDBETWEEN', randBetween, 2, 2, true);\r\n r.register('LOG', log, 1, 2);\r\n r.register('LOG10', log10, 1, 1);\r\n r.register('LN', ln, 1, 1);\r\n r.register('EXP', exp, 1, 1);\r\n r.register('FACT', fact, 1, 1);\r\n r.register('COMBIN', combin, 2, 2);\r\n // Trigonometry\r\n r.register('SIN', unary(Math.sin), 1, 1);\r\n r.register('COS', unary(Math.cos), 1, 1);\r\n r.register('TAN', unary(Math.tan), 1, 1);\r\n r.register('ASIN', asin, 1, 1);\r\n r.register('ACOS', acos, 1, 1);\r\n r.register('ATAN', unary(Math.atan), 1, 1);\r\n r.register('ATAN2', atan2, 2, 2);\r\n r.register('SINH', unary(Math.sinh), 1, 1);\r\n r.register('COSH', unary(Math.cosh), 1, 1);\r\n r.register('TANH', unary(Math.tanh), 1, 1);\r\n r.register('DEGREES', unary(r2d => (r2d * 180) / Math.PI), 1, 1);\r\n r.register('RADIANS', unary(d => (d * Math.PI) / 180), 1, 1);\r\n}\r\n\r\n// ── Multi-criteria aggregates (SUMIFS/COUNTIFS/AVERAGEIFS) ────────────────────\r\n\r\n/** Value at flat index i of a value that may be a scalar or an array. */\r\nfunction valueAt(v: FormulaValue, i: number): FormulaValue {\r\n return v.isArray ? v.arrayVal.getFlat(i) : v;\r\n}\r\n\r\n/** Flat length of a value that may be a scalar or an array. */\r\nfunction lengthOf(v: FormulaValue): number {\r\n return v.isArray ? v.arrayVal.length : 1;\r\n}\r\n\r\n/**\r\n * Builds a boolean mask over `len` positions from criteria pairs\r\n * (criteria_range, criteria) starting at `startIdx`. A position stays set only\r\n * if every pair matches. Returns the first error encountered, if any.\r\n */\r\nfunction computeIfsMask(\r\n a: Args,\r\n c: Ctx,\r\n startIdx: number,\r\n len: number,\r\n): { ok: true; mask: Uint8Array } | { ok: false; error: FormulaValue } {\r\n const mask = new Uint8Array(len).fill(1);\r\n for (let p = startIdx; p + 1 < a.length; p += 2) {\r\n const cr = a[p]!.evaluate(c);\r\n if (cr.isError) return { ok: false, error: cr };\r\n const crit = a[p + 1]!.evaluate(c);\r\n if (crit.isError) return { ok: false, error: crit };\r\n const critText = crit.asText();\r\n for (let i = 0; i < len; i++) {\r\n if (!mask[i]) continue;\r\n if (!FormulaHelper.matchesCriteria(valueAt(cr, i), critText)) mask[i] = 0;\r\n }\r\n }\r\n return { ok: true, mask };\r\n}\r\n\r\nfunction sumIfs(a: Args, c: Ctx): FormulaValue {\r\n // sum_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\r\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\r\n const sumRange = a[0]!.evaluate(c);\r\n if (sumRange.isError) return sumRange;\r\n const len = lengthOf(sumRange);\r\n const m = computeIfsMask(a, c, 1, len);\r\n if (!m.ok) return m.error;\r\n\r\n let total = 0;\r\n for (let i = 0; i < len; i++) {\r\n if (!m.mask[i]) continue;\r\n const r = valueAt(sumRange, i).tryAsDouble();\r\n if (r.ok) total += r.value;\r\n }\r\n return FormulaValue.number(total);\r\n}\r\n\r\nfunction countIfs(a: Args, c: Ctx): FormulaValue {\r\n // (criteria_range, criteria)+ → 2k args (even, ≥ 2)\r\n if (a.length < 2 || a.length % 2 !== 0) return FormulaValue.errorValue;\r\n const first = a[0]!.evaluate(c);\r\n if (first.isError) return first;\r\n const len = lengthOf(first);\r\n const m = computeIfsMask(a, c, 0, len);\r\n if (!m.ok) return m.error;\r\n\r\n let n = 0;\r\n for (let i = 0; i < len; i++) if (m.mask[i]) n++;\r\n return FormulaValue.number(n);\r\n}\r\n\r\nfunction averageIfs(a: Args, c: Ctx): FormulaValue {\r\n // average_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\r\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\r\n const avgRange = a[0]!.evaluate(c);\r\n if (avgRange.isError) return avgRange;\r\n const len = lengthOf(avgRange);\r\n const m = computeIfsMask(a, c, 1, len);\r\n if (!m.ok) return m.error;\r\n\r\n let total = 0, cnt = 0;\r\n for (let i = 0; i < len; i++) {\r\n if (!m.mask[i]) continue;\r\n const r = valueAt(avgRange, i).tryAsDouble();\r\n if (r.ok) { total += r.value; cnt++; }\r\n }\r\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\r\n}\r\n\r\nfunction sumSq(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.collectNumbers(a, c);\r\n if (!r.ok) return r.error;\r\n return FormulaValue.number(r.values.reduce((s, n) => s + n * n, 0));\r\n}\r\n\r\n// ── Trigonometry ─────────────────────────────────────────────────────────────\r\n\r\n/** Wraps a single-argument Math function into a formula handler. */\r\nfunction unary(fn: (x: number) => number): (a: Args, c: Ctx) => FormulaValue {\r\n return (a, c) => {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n return r.ok ? FormulaValue.number(fn(r.value)) : r.error;\r\n };\r\n}\r\n\r\nfunction asin(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!r.ok) return r.error;\r\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\r\n return FormulaValue.number(Math.asin(r.value));\r\n}\r\n\r\nfunction acos(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!r.ok) return r.error;\r\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\r\n return FormulaValue.number(Math.acos(r.value));\r\n}\r\n\r\nfunction atan2(a: Args, c: Ctx): FormulaValue {\r\n // Excel ATAN2(x, y) — note the reversed argument order vs Math.atan2(y, x).\r\n const x = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!x.ok) return x.error;\r\n const y = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!y.ok) return y.error;\r\n if (x.value === 0 && y.value === 0) return FormulaValue.errorDiv0;\r\n return FormulaValue.number(Math.atan2(y.value, x.value));\r\n}\r\n\r\n// ── Aggregates ─────────────────────────────────────────────────────────────\r\n\r\nfunction sum(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.collectNumbers(a, c);\r\n if (!r.ok) return r.error;\r\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0));\r\n}\r\n\r\nfunction average(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.collectNumbers(a, c);\r\n if (!r.ok) return r.error;\r\n if (r.values.length === 0) return FormulaValue.errorDiv0;\r\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0) / r.values.length);\r\n}\r\n\r\nfunction min(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.collectNumbers(a, c);\r\n if (!r.ok) return r.error;\r\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.min(...r.values));\r\n}\r\n\r\nfunction max(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.collectNumbers(a, c);\r\n if (!r.ok) return r.error;\r\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.max(...r.values));\r\n}\r\n\r\nfunction count(a: Args, c: Ctx): FormulaValue {\r\n const flat = FormulaHelper.flattenArgs(a, c);\r\n let n = 0;\r\n for (const v of flat) {\r\n if (v.isNumber || (v.isText && !isNaN(parseFloat(v.textValue)))) n++;\r\n }\r\n return FormulaValue.number(n);\r\n}\r\n\r\nfunction countA(a: Args, c: Ctx): FormulaValue {\r\n return FormulaValue.number(FormulaHelper.flattenArgs(a, c).filter(v => !v.isBlank).length);\r\n}\r\n\r\nfunction countBlank(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c);\r\n if (!v.isArray) return FormulaValue.number(v.isBlank ? 1 : 0);\r\n let n = 0;\r\n for (const item of v.arrayVal.values()) if (item.isBlank) n++;\r\n return FormulaValue.number(n);\r\n}\r\n\r\nfunction countIf(a: Args, c: Ctx): FormulaValue {\r\n const range = a[0]!.evaluate(c);\r\n if (range.isError) return range;\r\n const crit = a[1]!.evaluate(c);\r\n if (crit.isError) return crit;\r\n const criteria = crit.asText();\r\n\r\n if (!range.isArray) return FormulaValue.number(FormulaHelper.matchesCriteria(range, criteria) ? 1 : 0);\r\n let n = 0;\r\n for (const item of range.arrayVal.values()) {\r\n if (!item.isBlank && FormulaHelper.matchesCriteria(item, criteria)) n++;\r\n }\r\n return FormulaValue.number(n);\r\n}\r\n\r\nfunction sumIf(a: Args, c: Ctx): FormulaValue {\r\n const range = a[0]!.evaluate(c);\r\n if (range.isError) return range;\r\n const crit = a[1]!.evaluate(c);\r\n if (crit.isError) return crit;\r\n const criteria = crit.asText();\r\n\r\n const sumRange = a.length > 2 ? a[2]!.evaluate(c) : range;\r\n if (sumRange.isError) return sumRange;\r\n\r\n if (!range.isArray) {\r\n if (FormulaHelper.matchesCriteria(range, criteria)) {\r\n const r = sumRange.tryAsDouble();\r\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.zero;\r\n }\r\n return FormulaValue.zero;\r\n }\r\n\r\n const rangeArr = range.arrayVal;\r\n const sumArr = sumRange.isArray ? sumRange.arrayVal : null;\r\n let total = 0;\r\n\r\n for (let i = 0; i < rangeArr.length; i++) {\r\n const rv = rangeArr.getFlat(i);\r\n if (rv.isBlank) continue;\r\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\r\n const sv = sumArr ? sumArr.getFlat(i) : rangeArr.getFlat(i);\r\n const r = sv.tryAsDouble();\r\n if (r.ok) total += r.value;\r\n }\r\n }\r\n return FormulaValue.number(total);\r\n}\r\n\r\nfunction averageIf(a: Args, c: Ctx): FormulaValue {\r\n const range = a[0]!.evaluate(c);\r\n if (range.isError) return range;\r\n const crit = a[1]!.evaluate(c);\r\n if (crit.isError) return crit;\r\n const criteria = crit.asText();\r\n const avgRange = a.length > 2 ? a[2]!.evaluate(c) : range;\r\n if (avgRange.isError) return avgRange;\r\n\r\n if (!range.isArray) {\r\n if (!FormulaHelper.matchesCriteria(range, criteria)) return FormulaValue.errorDiv0;\r\n const r = avgRange.tryAsDouble();\r\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.errorDiv0;\r\n }\r\n\r\n const rangeArr = range.arrayVal;\r\n const avgArr = avgRange.isArray ? avgRange.arrayVal : null;\r\n let total = 0, cnt = 0;\r\n\r\n for (let i = 0; i < rangeArr.length; i++) {\r\n const rv = rangeArr.getFlat(i);\r\n if (rv.isBlank) continue;\r\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\r\n const sv = avgArr ? avgArr.getFlat(i) : rangeArr.getFlat(i);\r\n const r = sv.tryAsDouble();\r\n if (r.ok) { total += r.value; cnt++; }\r\n }\r\n }\r\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\r\n}\r\n\r\nfunction product(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.collectNumbers(a, c);\r\n if (!r.ok) return r.error;\r\n return FormulaValue.number(r.values.reduce((p, n) => p * n, 1));\r\n}\r\n\r\nfunction sumProduct(a: Args, c: Ctx): FormulaValue {\r\n const arrays = a.map(arg => arg.evaluate(c));\r\n for (const v of arrays) if (v.isError) return v;\r\n\r\n const first = arrays[0]!;\r\n const len = first.isArray ? first.arrayVal.length : 1;\r\n let total = 0;\r\n\r\n for (let i = 0; i < len; i++) {\r\n let prod = 1;\r\n for (const v of arrays) {\r\n const item = v.isArray ? v.arrayVal.getFlat(i) : v;\r\n const r = item.tryAsDouble();\r\n if (!r.ok) { prod = 0; break; }\r\n prod *= r.value;\r\n }\r\n total += prod;\r\n }\r\n return FormulaValue.number(total);\r\n}\r\n\r\n// ── Single-arg math ────────────────────────────────────────────────────────\r\n\r\nfunction abs(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n return r.ok ? FormulaValue.number(Math.abs(r.value)) : r.error;\r\n}\r\n\r\nfunction round(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const d = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!d.ok) return d.error;\r\n const factor = Math.pow(10, Math.round(d.value));\r\n return FormulaValue.number(Math.round(n.value * factor) / factor);\r\n}\r\n\r\nfunction roundUp(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const d = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!d.ok) return d.error;\r\n const factor = Math.pow(10, Math.round(d.value));\r\n return FormulaValue.number(Math.ceil(n.value * factor) / factor);\r\n}\r\n\r\nfunction roundDown(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const d = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!d.ok) return d.error;\r\n const factor = Math.pow(10, Math.round(d.value));\r\n return FormulaValue.number(Math.floor(n.value * factor) / factor);\r\n}\r\n\r\nfunction ceiling(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const s = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!s.ok) return s.error;\r\n if (s.value === 0) return FormulaValue.zero;\r\n return FormulaValue.number(Math.ceil(n.value / s.value) * s.value);\r\n}\r\n\r\nfunction floor(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const s = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!s.ok) return s.error;\r\n if (s.value === 0) return FormulaValue.zero;\r\n return FormulaValue.number(Math.floor(n.value / s.value) * s.value);\r\n}\r\n\r\nfunction int_(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n return r.ok ? FormulaValue.number(Math.floor(r.value)) : r.error;\r\n}\r\n\r\nfunction trunc(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n let digits = 0;\r\n if (a.length > 1) {\r\n const d = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!d.ok) return d.error;\r\n digits = Math.round(d.value);\r\n }\r\n const factor = Math.pow(10, digits);\r\n return FormulaValue.number(Math.trunc(n.value * factor) / factor);\r\n}\r\n\r\nfunction mod(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const d = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!d.ok) return d.error;\r\n if (d.value === 0) return FormulaValue.errorDiv0;\r\n return FormulaValue.number(n.value - d.value * Math.floor(n.value / d.value));\r\n}\r\n\r\nfunction quotient(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const d = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!d.ok) return d.error;\r\n if (d.value === 0) return FormulaValue.errorDiv0;\r\n return FormulaValue.number(Math.trunc(n.value / d.value));\r\n}\r\n\r\nfunction power(a: Args, c: Ctx): FormulaValue {\r\n const b = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!b.ok) return b.error;\r\n const e = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!e.ok) return e.error;\r\n return FormulaValue.number(Math.pow(b.value, e.value));\r\n}\r\n\r\nfunction sqrt(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!r.ok) return r.error;\r\n if (r.value < 0) return FormulaValue.errorNum;\r\n return FormulaValue.number(Math.sqrt(r.value));\r\n}\r\n\r\nfunction sign(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n return r.ok ? FormulaValue.number(Math.sign(r.value)) : r.error;\r\n}\r\n\r\nfunction pi(): FormulaValue { return FormulaValue.number(Math.PI); }\r\nfunction rand(): FormulaValue { return FormulaValue.number(Math.random()); }\r\n\r\nfunction randBetween(a: Args, c: Ctx): FormulaValue {\r\n const lo = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!lo.ok) return lo.error;\r\n const hi = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!hi.ok) return hi.error;\r\n return FormulaValue.number(Math.floor(lo.value + Math.random() * (hi.value - lo.value + 1)));\r\n}\r\n\r\nfunction log(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n if (n.value <= 0) return FormulaValue.errorNum;\r\n let base = 10;\r\n if (a.length > 1) {\r\n const b = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!b.ok) return b.error;\r\n base = b.value;\r\n }\r\n if (base <= 0 || base === 1) return FormulaValue.errorNum;\r\n return FormulaValue.number(Math.log(n.value) / Math.log(base));\r\n}\r\n\r\nfunction log10(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!r.ok) return r.error;\r\n if (r.value <= 0) return FormulaValue.errorNum;\r\n return FormulaValue.number(Math.log10(r.value));\r\n}\r\n\r\nfunction ln(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!r.ok) return r.error;\r\n if (r.value <= 0) return FormulaValue.errorNum;\r\n return FormulaValue.number(Math.log(r.value));\r\n}\r\n\r\nfunction exp(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n return r.ok ? FormulaValue.number(Math.exp(r.value)) : r.error;\r\n}\r\n\r\nfunction fact(a: Args, c: Ctx): FormulaValue {\r\n const r = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!r.ok) return r.error;\r\n const n = Math.round(r.value);\r\n if (n < 0) return FormulaValue.errorNum;\r\n if (n > 170) return FormulaValue.errorNum;\r\n let f = 1;\r\n for (let i = 2; i <= n; i++) f *= i;\r\n return FormulaValue.number(f);\r\n}\r\n\r\nfunction combin(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const k = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!k.ok) return k.error;\r\n const N = Math.round(n.value);\r\n const K = Math.round(k.value);\r\n if (N < 0 || K < 0 || K > N) return FormulaValue.errorNum;\r\n // C(N,K) = N! / (K! * (N-K)!)\r\n let result = 1;\r\n for (let i = 0; i < K; i++) result = result * (N - i) / (i + 1);\r\n return FormulaValue.number(Math.round(result));\r\n}\r\n","/**\r\n * Text/string Excel functions.\r\n * Port of TVE.PureDocs.Excel.Formulas.TextFunctions (C#)\r\n */\r\nimport { fromOADate } from '@devmm/puredocs-excel';\r\nimport { FormulaValue } from '../formula-value.js';\r\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\r\nimport type { FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerText(r: FunctionRegistry): void {\r\n r.register('LEFT', left, 1, 2);\r\n r.register('RIGHT', right, 1, 2);\r\n r.register('MID', mid, 3, 3);\r\n r.register('LEN', len, 1, 1);\r\n r.register('UPPER', upper, 1, 1);\r\n r.register('LOWER', lower, 1, 1);\r\n r.register('PROPER', proper, 1, 1);\r\n r.register('TRIM', trim, 1, 1);\r\n r.register('CLEAN', clean, 1, 1);\r\n r.register('SUBSTITUTE', substitute, 3, 4);\r\n r.register('REPLACE', replace, 4, 4);\r\n r.register('CONCATENATE', concatenate, 1);\r\n r.register('CONCAT', concatenate, 1);\r\n r.register('TEXTJOIN', textJoin, 3);\r\n r.register('TEXT', text_, 2, 2);\r\n r.register('VALUE', value, 1, 1);\r\n r.register('FIND', find, 2, 3);\r\n r.register('SEARCH', search, 2, 3);\r\n r.register('REPT', rept, 2, 2);\r\n r.register('EXACT', exact, 2, 2);\r\n r.register('CHAR', char_, 1, 1);\r\n r.register('CODE', code, 1, 1);\r\n r.register('T', t_, 1, 1);\r\n r.register('TEXTBEFORE', textBefore, 2, 3);\r\n r.register('TEXTAFTER', textAfter, 2, 3);\r\n}\r\n\r\n// ── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nfunction str(a: Args, c: Ctx, idx: number): { ok: true; s: string } | { ok: false; e: FormulaValue } {\r\n const r = FormulaHelper.evalString(a[idx]!, c);\r\n return r.ok ? { ok: true, s: r.value } : { ok: false, e: r.error };\r\n}\r\n\r\nfunction num(a: Args, c: Ctx, idx: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\r\n const r = FormulaHelper.evalDouble(a[idx]!, c);\r\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\r\n}\r\n\r\n// ── Implementations ──────────────────────────────────────────────────────────\r\n\r\nfunction left(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n let n = 1;\r\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\r\n if (n < 0) return FormulaValue.errorValue;\r\n return FormulaValue.text(s.s.slice(0, n));\r\n}\r\n\r\nfunction right(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n let n = 1;\r\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\r\n if (n < 0) return FormulaValue.errorValue;\r\n return FormulaValue.text(n >= s.s.length ? s.s : s.s.slice(-n));\r\n}\r\n\r\nfunction mid(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\r\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\r\n const start = Math.round(sv.n) - 1;\r\n const count = Math.round(nv.n);\r\n if (start < 0 || count < 0) return FormulaValue.errorValue;\r\n return FormulaValue.text(s.s.slice(start, start + count));\r\n}\r\n\r\nfunction len(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n return FormulaValue.number(s.s.length);\r\n}\r\n\r\nfunction upper(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n return FormulaValue.text(s.s.toUpperCase());\r\n}\r\n\r\nfunction lower(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n return FormulaValue.text(s.s.toLowerCase());\r\n}\r\n\r\nfunction proper(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n let capitalise = true;\r\n let result = '';\r\n for (const ch of s.s) {\r\n result += capitalise ? ch.toUpperCase() : ch.toLowerCase();\r\n capitalise = !/[a-zA-Z]/.test(ch);\r\n }\r\n return FormulaValue.text(result);\r\n}\r\n\r\nfunction trim(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n // Excel TRIM removes leading/trailing spaces AND collapses internal spaces to one\r\n return FormulaValue.text(s.s.trim().replace(/\\s+/g, ' '));\r\n}\r\n\r\nfunction clean(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n return FormulaValue.text([...s.s].filter(ch => ch.charCodeAt(0) >= 32).join(''));\r\n}\r\n\r\nfunction substitute(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n const old = str(a, c, 1); if (!old.ok) return old.e;\r\n const nw = str(a, c, 2); if (!nw.ok) return nw.e;\r\n\r\n if (a.length > 3) {\r\n const iv = num(a, c, 3); if (!iv.ok) return iv.e;\r\n const inst = Math.round(iv.n);\r\n let count = 0, pos = 0, result = '';\r\n while (pos < s.s.length) {\r\n const idx = s.s.indexOf(old.s, pos);\r\n if (idx < 0) { result += s.s.slice(pos); break; }\r\n count++;\r\n if (count === inst) {\r\n result += s.s.slice(pos, idx) + nw.s;\r\n pos = idx + old.s.length;\r\n result += s.s.slice(pos);\r\n break;\r\n }\r\n result += s.s.slice(pos, idx + old.s.length);\r\n pos = idx + old.s.length;\r\n }\r\n return FormulaValue.text(result);\r\n }\r\n\r\n return FormulaValue.text(s.s.split(old.s).join(nw.s));\r\n}\r\n\r\nfunction replace(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\r\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\r\n const nw = str(a, c, 3); if (!nw.ok) return nw.e;\r\n const start = Math.max(0, Math.round(sv.n) - 1);\r\n const count = Math.max(0, Math.round(nv.n));\r\n return FormulaValue.text(s.s.slice(0, start) + nw.s + s.s.slice(start + count));\r\n}\r\n\r\nfunction concatenate(a: Args, c: Ctx): FormulaValue {\r\n let result = '';\r\n for (const arg of a) {\r\n const v = arg.evaluate(c);\r\n if (v.isError) return v;\r\n result += v.asText();\r\n }\r\n return FormulaValue.text(result);\r\n}\r\n\r\nfunction textJoin(a: Args, c: Ctx): FormulaValue {\r\n const delim = str(a, c, 0); if (!delim.ok) return delim.e;\r\n const ignV = a[1]!.evaluate(c);\r\n if (ignV.isError) return ignV;\r\n const ignoreEmpty = ignV.coerceToBool().booleanValue;\r\n const parts: string[] = [];\r\n\r\n for (let i = 2; i < a.length; i++) {\r\n const v = a[i]!.evaluate(c);\r\n if (v.isError) return v;\r\n if (v.isArray) {\r\n for (const item of v.arrayVal.values()) {\r\n const t = item.asText();\r\n if (!ignoreEmpty || t !== '') parts.push(t);\r\n }\r\n } else {\r\n const t = v.asText();\r\n if (!ignoreEmpty || t !== '') parts.push(t);\r\n }\r\n }\r\n\r\n const result = parts.join(delim.s);\r\n if (result.length > 32767) return FormulaValue.errorValue;\r\n return FormulaValue.text(result);\r\n}\r\n\r\nfunction text_(a: Args, c: Ctx): FormulaValue {\r\n const n = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!n.ok) return n.error;\r\n const f = str(a, c, 1); if (!f.ok) return f.e;\r\n // Map common Excel format codes to JS toLocaleString / toFixed patterns\r\n try {\r\n return FormulaValue.text(formatNumber(n.value, f.s));\r\n } catch {\r\n return FormulaValue.errorValue;\r\n }\r\n}\r\n\r\nfunction formatNumber(value: number, fmt: string): string {\r\n // Minimal Excel format code interpreter\r\n if (fmt === '0') return String(Math.round(value));\r\n if (fmt === '0.00') return value.toFixed(2);\r\n if (fmt === '#,##0') return Math.round(value).toLocaleString('en-US');\r\n if (fmt === '#,##0.00') return value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n if (fmt === '0%') return `${Math.round(value * 100)}%`;\r\n if (fmt === '0.00%') return `${(value * 100).toFixed(2)}%`;\r\n // Date patterns — convert OADate back if it looks like a date format\r\n if (/[yYmMdD]/.test(fmt)) {\r\n try {\r\n const date = fromOADate(value);\r\n return date.toLocaleDateString();\r\n } catch { /* fall through */ }\r\n }\r\n return String(value);\r\n}\r\n\r\nfunction value(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n const n = parseFloat(s.s.replace(/,/g, '').replace(/%$/, (m) => { return m ? String(parseFloat(s.s) / 100) : ''; }));\r\n if (isNaN(n)) return FormulaValue.errorValue;\r\n return FormulaValue.number(n);\r\n}\r\n\r\nfunction find(a: Args, c: Ctx): FormulaValue {\r\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\r\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\r\n let start = 0;\r\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\r\n const idx = haystack.s.indexOf(needle.s, start);\r\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\r\n}\r\n\r\nfunction search(a: Args, c: Ctx): FormulaValue {\r\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\r\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\r\n let start = 0;\r\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\r\n const idx = haystack.s.toLowerCase().indexOf(needle.s.toLowerCase(), start);\r\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\r\n}\r\n\r\nfunction rept(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n const n = num(a, c, 1); if (!n.ok) return n.e;\r\n const count = Math.round(n.n);\r\n if (count < 0) return FormulaValue.errorValue;\r\n return FormulaValue.text(s.s.repeat(count));\r\n}\r\n\r\nfunction exact(a: Args, c: Ctx): FormulaValue {\r\n const s1 = str(a, c, 0); if (!s1.ok) return s1.e;\r\n const s2 = str(a, c, 1); if (!s2.ok) return s2.e;\r\n return FormulaValue.boolean(s1.s === s2.s);\r\n}\r\n\r\nfunction char_(a: Args, c: Ctx): FormulaValue {\r\n const r = num(a, c, 0); if (!r.ok) return r.e;\r\n const code = Math.round(r.n);\r\n if (code < 1 || code > 255) return FormulaValue.errorValue;\r\n return FormulaValue.text(String.fromCharCode(code));\r\n}\r\n\r\nfunction code(a: Args, c: Ctx): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n if (s.s.length === 0) return FormulaValue.errorValue;\r\n return FormulaValue.number(s.s.charCodeAt(0));\r\n}\r\n\r\nfunction t_(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c);\r\n return v.isText ? v : FormulaValue.emptyString;\r\n}\r\n\r\n// TEXTBEFORE(text, delimiter, [instance_num]) — text before the nth delimiter.\r\n// TEXTAFTER(text, delimiter, [instance_num]) — text after the nth delimiter.\r\n// instance_num defaults to 1; a negative value counts occurrences from the end.\r\nfunction textBefore(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'before'); }\r\nfunction textAfter(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'after'); }\r\n\r\nfunction textSplitAt(a: Args, c: Ctx, mode: 'before' | 'after'): FormulaValue {\r\n const s = str(a, c, 0); if (!s.ok) return s.e;\r\n const d = str(a, c, 1); if (!d.ok) return d.e;\r\n let instance = 1;\r\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; instance = Math.trunc(r.n); }\r\n if (instance === 0) return FormulaValue.errorValue;\r\n\r\n const text = s.s;\r\n const delim = d.s;\r\n // Empty delimiter: BEFORE → \"\", AFTER → whole text (mirrors Excel).\r\n if (delim === '') {\r\n return FormulaValue.text(mode === 'before' ? '' : text);\r\n }\r\n\r\n // Collect all occurrence start positions.\r\n const positions: number[] = [];\r\n let from = 0;\r\n for (;;) {\r\n const idx = text.indexOf(delim, from);\r\n if (idx === -1) break;\r\n positions.push(idx);\r\n from = idx + delim.length;\r\n }\r\n if (positions.length === 0) return FormulaValue.errorNA;\r\n\r\n const nth = instance > 0 ? instance - 1 : positions.length + instance;\r\n if (nth < 0 || nth >= positions.length) return FormulaValue.errorNA;\r\n\r\n const pos = positions[nth]!;\r\n return FormulaValue.text(\r\n mode === 'before' ? text.slice(0, pos) : text.slice(pos + delim.length),\r\n );\r\n}\r\n","/**\n * Logical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LogicalFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport type { FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLogical(r: FunctionRegistry): void {\n r.register('IF', if_, 2, 3);\n r.register('AND', and, 1);\n r.register('OR', or, 1);\n r.register('NOT', not, 1, 1);\n r.register('XOR', xor, 1);\n r.register('IFERROR', ifError, 2, 2);\n r.register('IFNA', ifNa, 2, 2);\n r.register('IFS', ifs, 2);\n r.register('SWITCH', switch_, 3);\n r.register('TRUE', trueFn, 0, 0);\n r.register('FALSE', falseFn, 0, 0);\n}\n\nfunction if_(a: Args, c: Ctx): FormulaValue {\n const cond = a[0]!.evaluate(c);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n return b.booleanValue\n ? a[1]!.evaluate(c)\n : a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.false_;\n}\n\nfunction and(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n }\n return hasValue ? FormulaValue.true_ : FormulaValue.errorValue;\n}\n\nfunction or(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n }\n return hasValue ? FormulaValue.false_ : FormulaValue.errorValue;\n}\n\nfunction not(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n return FormulaValue.boolean(!bv.booleanValue);\n}\n\nfunction xor(a: Args, c: Ctx): FormulaValue {\n let trueCount = 0;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) trueCount++;\n }\n return FormulaValue.boolean(trueCount % 2 === 1);\n}\n\nfunction ifError(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifs(a: Args, c: Ctx): FormulaValue {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(c);\n if (cond.isError) return cond;\n const bv = cond.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return a[i + 1]!.evaluate(c);\n }\n return FormulaValue.errorNA;\n}\n\nfunction switch_(a: Args, c: Ctx): FormulaValue {\n const expr = a[0]!.evaluate(c);\n if (expr.isError) return expr;\n for (let i = 1; i + 1 < a.length; i += 2) {\n const cv = a[i]!.evaluate(c);\n if (cv.isError) return cv;\n if (FormulaValue.areEqual(expr, cv)) return a[i + 1]!.evaluate(c);\n }\n // Default value: last arg when even count\n return a.length % 2 === 0 ? a[a.length - 1]!.evaluate(c) : FormulaValue.errorNA;\n}\n\nfunction trueFn(): FormulaValue { return FormulaValue.true_; }\nfunction falseFn(): FormulaValue { return FormulaValue.false_; }\n","/**\n * Date and time Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.DateFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\n// OADate helpers (same logic as core package, duplicated to avoid circular dep)\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\nfunction toOA(date: Date): number {\n return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),\n date.getHours(), date.getMinutes(), date.getSeconds()) - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\nfunction fromOA(oa: number): Date {\n const ms = OA_EPOCH_MS + oa * MS_PER_DAY;\n const d = new Date(ms);\n return new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),\n d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());\n}\n\nexport function registerDate(r: FunctionRegistry): void {\n r.register('NOW', now, 0, 0, true);\n r.register('TODAY', today, 0, 0, true);\n r.register('DATE', date_, 3, 3);\n r.register('YEAR', year, 1, 1);\n r.register('MONTH', month, 1, 1);\n r.register('DAY', day, 1, 1);\n r.register('HOUR', hour, 1, 1);\n r.register('MINUTE', minute, 1, 1);\n r.register('SECOND', second, 1, 1);\n r.register('DATEVALUE', dateValue, 1, 1);\n r.register('DAYS', days, 2, 2);\n r.register('EDATE', edate, 2, 2);\n r.register('EOMONTH', eomonth, 2, 2);\n r.register('WEEKDAY', weekday, 1, 2);\n r.register('WEEKNUM', weeknum, 1, 2);\n r.register('NETWORKDAYS', networkdays, 2, 3);\n r.register('DATEDIF', datedif, 3, 3);\n}\n\nfunction evalDate(a: Args, c: Ctx, idx: number): { ok: true; date: Date } | { ok: false; error: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n if (!r.ok) return r;\n try {\n return { ok: true, date: fromOA(r.value) };\n } catch {\n return { ok: false, error: FormulaValue.errorValue };\n }\n}\n\nfunction now(): FormulaValue { return FormulaValue.number(toOA(new Date())); }\nfunction today(): FormulaValue { const d = new Date(); return FormulaValue.number(toOA(new Date(d.getFullYear(), d.getMonth(), d.getDate()))); }\n\nfunction date_(a: Args, c: Ctx): FormulaValue {\n const y = FormulaHelper.evalDouble(a[0]!, c); if (!y.ok) return y.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const d = FormulaHelper.evalDouble(a[2]!, c); if (!d.ok) return d.error;\n try { return FormulaValue.number(toOA(new Date(Math.round(y.value), Math.round(m.value) - 1, Math.round(d.value)))); }\n catch { return FormulaValue.errorValue; }\n}\n\nfunction year(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getFullYear()) : r.error;\n}\nfunction month(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMonth() + 1) : r.error;\n}\nfunction day(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getDate()) : r.error;\n}\nfunction hour(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getHours()) : r.error;\n}\nfunction minute(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMinutes()) : r.error;\n}\nfunction second(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getSeconds()) : r.error;\n}\n\nfunction dateValue(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalString(a[0]!, c); if (!r.ok) return r.error;\n const d = new Date(r.value);\n if (isNaN(d.getTime())) return FormulaValue.errorValue;\n return FormulaValue.number(toOA(d));\n}\n\nfunction days(a: Args, c: Ctx): FormulaValue {\n const d1 = evalDate(a, c, 0); if (!d1.ok) return d1.error;\n const d2 = evalDate(a, c, 1); if (!d2.ok) return d2.error;\n return FormulaValue.number(Math.round((d1.date.getTime() - d2.date.getTime()) / MS_PER_DAY));\n}\n\nfunction edate(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const result = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value), d.date.getDate());\n return isNaN(result.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(result));\n}\n\nfunction eomonth(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const target = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value) + 1, 0);\n return isNaN(target.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(target));\n}\n\nfunction weekday(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n let type = 1;\n if (a.length > 1) { const r = FormulaHelper.evalDouble(a[1]!, c); if (!r.ok) return r.error; type = Math.round(r.value); }\n const dow = d.date.getDay(); // 0 = Sunday\n switch (type) {\n case 1: return FormulaValue.number(dow === 0 ? 1 : dow + 1); // Sun=1\n case 2: return FormulaValue.number(dow === 0 ? 7 : dow); // Mon=1\n case 3: return FormulaValue.number(dow === 0 ? 6 : dow - 1); // Mon=0\n default: return FormulaValue.errorNum;\n }\n}\n\nfunction weeknum(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const jan1 = new Date(d.date.getFullYear(), 0, 1);\n const days_ = Math.floor((d.date.getTime() - jan1.getTime()) / MS_PER_DAY);\n return FormulaValue.number(Math.ceil((days_ + jan1.getDay() + 1) / 7));\n}\n\nfunction networkdays(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n\n const holidays = new Set<number>();\n if (a.length > 2) {\n const hv = a[2]!.evaluate(c);\n if (hv.isError) return hv;\n const items = hv.isArray ? [...hv.arrayVal.values()] : [hv];\n for (const item of items) {\n if (item.isBlank) continue;\n const r = item.tryAsDouble();\n if (!r.ok) return FormulaValue.errorValue;\n holidays.add(Math.floor(r.value));\n }\n }\n\n const dir = start.date <= end.date ? 1 : -1;\n let count = 0;\n const cur = new Date(start.date);\n\n while (dir > 0 ? cur <= end.date : cur >= end.date) {\n const dow = cur.getDay();\n const oa = Math.floor(toOA(cur));\n if (dow !== 0 && dow !== 6 && !holidays.has(oa)) count++;\n cur.setDate(cur.getDate() + dir);\n }\n\n return FormulaValue.number(count * dir);\n}\n\nfunction datedif(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n const unit = FormulaHelper.evalString(a[2]!, c); if (!unit.ok) return unit.error;\n\n const s = start.date, e = end.date;\n if (s > e) return FormulaValue.errorNum;\n\n switch (unit.value.toUpperCase()) {\n case 'Y':\n return FormulaValue.number(e.getFullYear() - s.getFullYear() -\n (e.getMonth() < s.getMonth() || (e.getMonth() === s.getMonth() && e.getDate() < s.getDate()) ? 1 : 0));\n case 'M':\n return FormulaValue.number((e.getFullYear() - s.getFullYear()) * 12 + e.getMonth() - s.getMonth() -\n (e.getDate() < s.getDate() ? 1 : 0));\n case 'D':\n return FormulaValue.number(Math.round((e.getTime() - s.getTime()) / MS_PER_DAY));\n case 'MD':\n return FormulaValue.number(e.getDate() >= s.getDate()\n ? e.getDate() - s.getDate()\n : new Date(s.getFullYear(), s.getMonth() + 1, 0).getDate() - s.getDate() + e.getDate());\n case 'YM':\n return FormulaValue.number((e.getMonth() - s.getMonth() + 12) % 12 - (e.getDate() < s.getDate() ? 1 : 0));\n case 'YD': {\n const sameYearEnd = new Date(e.getFullYear(), s.getMonth(), s.getDate());\n return FormulaValue.number(Math.round((e.getTime() - sameYearEnd.getTime()) / MS_PER_DAY));\n }\n default: return FormulaValue.errorNum;\n }\n}\n","/**\r\n * Lookup and reference Excel functions.\r\n * Port of TVE.PureDocs.Excel.Formulas.LookupFunctions (C#)\r\n */\r\nimport { parseCellRef, cellRefFromRowCol, columnLetter } from '@devmm/puredocs-excel';\r\nimport { FormulaValue, ArrayValue } from '../formula-value.js';\r\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\r\nimport { CellReferenceNode, RangeReferenceNode } from '../formula-node.js';\r\nimport type { FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerLookup(r: FunctionRegistry): void {\r\n r.register('VLOOKUP', vlookup, 3, 4);\r\n r.register('HLOOKUP', hlookup, 3, 4);\r\n r.register('XLOOKUP', xlookup, 3, 6);\r\n r.register('LOOKUP', lookup, 2, 3);\r\n r.register('INDEX', index_, 2, 3);\r\n r.register('MATCH', match, 2, 3);\r\n r.register('XMATCH', xmatch, 2, 4);\r\n r.register('CHOOSE', choose, 2);\r\n r.register('ADDRESS', address, 2, 5);\r\n r.register('ROW', row, 0, 1);\r\n r.register('COLUMN', column, 0, 1);\r\n r.register('ROWS', rows, 1, 1);\r\n r.register('COLUMNS', columns, 1, 1);\r\n r.register('OFFSET', offset, 3, 5, true);\r\n r.register('INDIRECT', indirect, 1, 2, true);\r\n}\r\n\r\n// ── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\r\n const r = FormulaHelper.evalDouble(a[i]!, c);\r\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\r\n}\r\n\r\n// ── Implementations ──────────────────────────────────────────────────────────\r\n\r\nfunction vlookup(a: Args, c: Ctx): FormulaValue {\r\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\r\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\r\n if (!tableVal.isArray) return FormulaValue.errorRef;\r\n const ci = num(a, c, 2); if (!ci.ok) return ci.e;\r\n const colIdx = Math.round(ci.n) - 1;\r\n\r\n let exactMatch = true;\r\n if (a.length > 3) {\r\n const mv = a[3]!.evaluate(c);\r\n if (mv.isError) return mv;\r\n exactMatch = !mv.coerceToBool().booleanValue;\r\n }\r\n\r\n const tbl = tableVal.arrayVal;\r\n if (colIdx < 0 || colIdx >= tbl.columns) return FormulaValue.errorRef;\r\n\r\n if (exactMatch) {\r\n for (let r = 0; r < tbl.rows; r++) {\r\n if (FormulaValue.areEqual(tbl.get(r, 0), lookupVal)) return tbl.get(r, colIdx);\r\n }\r\n return FormulaValue.errorNA;\r\n }\r\n\r\n // Approximate match — first column must be sorted ascending\r\n let best = -1;\r\n for (let r = 0; r < tbl.rows; r++) {\r\n if (FormulaValue.compare(tbl.get(r, 0), lookupVal) <= 0) best = r; else break;\r\n }\r\n return best >= 0 ? tbl.get(best, colIdx) : FormulaValue.errorNA;\r\n}\r\n\r\nfunction hlookup(a: Args, c: Ctx): FormulaValue {\r\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\r\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\r\n if (!tableVal.isArray) return FormulaValue.errorRef;\r\n const ri = num(a, c, 2); if (!ri.ok) return ri.e;\r\n const rowIdx = Math.round(ri.n) - 1;\r\n\r\n let exactMatch = true;\r\n if (a.length > 3) {\r\n const mv = a[3]!.evaluate(c);\r\n if (mv.isError) return mv;\r\n exactMatch = !mv.coerceToBool().booleanValue;\r\n }\r\n\r\n const tbl = tableVal.arrayVal;\r\n if (rowIdx < 0 || rowIdx >= tbl.rows) return FormulaValue.errorRef;\r\n\r\n if (exactMatch) {\r\n for (let col = 0; col < tbl.columns; col++) {\r\n if (FormulaValue.areEqual(tbl.get(0, col), lookupVal)) return tbl.get(rowIdx, col);\r\n }\r\n return FormulaValue.errorNA;\r\n }\r\n\r\n let best = -1;\r\n for (let col = 0; col < tbl.columns; col++) {\r\n if (FormulaValue.compare(tbl.get(0, col), lookupVal) <= 0) best = col; else break;\r\n }\r\n return best >= 0 ? tbl.get(rowIdx, best) : FormulaValue.errorNA;\r\n}\r\n\r\n/** Builds a case-insensitive regex from an Excel wildcard pattern (*, ?, ~). */\r\nfunction wildcardRegex(pattern: string): RegExp {\r\n let out = '';\r\n for (let i = 0; i < pattern.length; i++) {\r\n const ch = pattern[i]!;\r\n if (ch === '~' && i + 1 < pattern.length) {\r\n const next = pattern[++i]!;\r\n out += next.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n } else if (ch === '*') out += '.*';\r\n else if (ch === '?') out += '.';\r\n else out += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n }\r\n return new RegExp(`^${out}$`, 'i');\r\n}\r\n\r\n/**\r\n * Locates the match index (0-based) in a length-`n` vector, or -1.\r\n * matchMode: 0 exact · -1 exact-or-next-smaller · 1 exact-or-next-larger · 2 wildcard\r\n * searchMode: 1 first→last · -1 last→first · 2 binary asc · -2 binary desc\r\n * Binary modes read the vector via `get` without materialising it, so a lookup\r\n * over a full sorted column stays O(log n) in both time and allocations.\r\n */\r\nfunction findMatch(\r\n n: number,\r\n get: (i: number) => FormulaValue,\r\n lookupVal: FormulaValue,\r\n matchMode: number,\r\n searchMode: number,\r\n): number {\r\n // Binary search (only meaningful for exact / next-smaller / next-larger).\r\n if ((searchMode === 2 || searchMode === -2) && matchMode !== 2) {\r\n const at = searchMode === 2 ? get : (j: number) => get(n - 1 - j);\r\n let lo = 0, hi = n - 1, lastLE = -1, firstGE = -1;\r\n while (lo <= hi) {\r\n const mid = (lo + hi) >>> 1;\r\n const cmp = FormulaValue.compare(at(mid), lookupVal);\r\n if (cmp === 0) return searchMode === 2 ? mid : n - 1 - mid;\r\n if (cmp < 0) { lastLE = mid; lo = mid + 1; }\r\n else { firstGE = mid; hi = mid - 1; }\r\n }\r\n const idx = matchMode === -1 ? lastLE : matchMode === 1 ? firstGE : -1;\r\n return idx < 0 ? -1 : (searchMode === 2 ? idx : n - 1 - idx);\r\n }\r\n\r\n // Linear scan (honouring direction).\r\n const reverse = searchMode === -1;\r\n const order = reverse\r\n ? Array.from({ length: n }, (_, k) => n - 1 - k)\r\n : Array.from({ length: n }, (_, k) => k);\r\n\r\n if (matchMode === 2) {\r\n const re = wildcardRegex(lookupVal.asText());\r\n for (const i of order) if (re.test(get(i).asText())) return i;\r\n return -1;\r\n }\r\n if (matchMode === 0) {\r\n for (const i of order) if (FormulaValue.areEqual(get(i), lookupVal)) return i;\r\n return -1;\r\n }\r\n\r\n // Approximate: track the closest value on the requested side.\r\n let best = -1;\r\n let bestVal: FormulaValue | null = null;\r\n for (const i of order) {\r\n const v = get(i);\r\n const cmp = FormulaValue.compare(v, lookupVal);\r\n if (cmp === 0) return i;\r\n if (matchMode === -1 && cmp < 0) {\r\n if (bestVal === null || FormulaValue.compare(v, bestVal) > 0) { best = i; bestVal = v; }\r\n } else if (matchMode === 1 && cmp > 0) {\r\n if (bestVal === null || FormulaValue.compare(v, bestVal) < 0) { best = i; bestVal = v; }\r\n }\r\n }\r\n return best;\r\n}\r\n\r\nfunction xlookup(a: Args, c: Ctx): FormulaValue {\r\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\r\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\r\n const returnRaw = a[2]!.evaluate(c); if (returnRaw.isError) return returnRaw;\r\n\r\n const matchMode = a.length > 4 ? num(a, c, 4) : { ok: true as const, n: 0 };\r\n if (!matchMode.ok) return matchMode.e;\r\n const searchMode = a.length > 5 ? num(a, c, 5) : { ok: true as const, n: 1 };\r\n if (!searchMode.ok) return searchMode.e;\r\n const mm = Math.trunc(matchMode.n), sm = Math.trunc(searchMode.n);\r\n\r\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\r\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\r\n const vertical = !(la.rows === 1 && la.columns > 1);\r\n const n = vertical ? la.rows : la.columns;\r\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\r\n\r\n const idx = findMatch(n, get, lookupVal, mm, sm);\r\n if (idx < 0) {\r\n return a.length > 3 ? a[3]!.evaluate(c) : FormulaValue.errorNA;\r\n }\r\n\r\n const ret = returnRaw.isArray ? returnRaw.arrayVal : ArrayValue.fromScalar(returnRaw);\r\n if (vertical) {\r\n if (ret.rows !== n) return FormulaValue.errorValue;\r\n if (ret.columns === 1) return ret.get(idx, 0);\r\n const out = new ArrayValue(1, ret.columns);\r\n for (let col = 0; col < ret.columns; col++) out.set(0, col, ret.get(idx, col));\r\n return FormulaValue.array(out);\r\n }\r\n if (ret.columns !== n) return FormulaValue.errorValue;\r\n if (ret.rows === 1) return ret.get(0, idx);\r\n const out = new ArrayValue(ret.rows, 1);\r\n for (let r = 0; r < ret.rows; r++) out.set(r, 0, ret.get(r, idx));\r\n return FormulaValue.array(out);\r\n}\r\n\r\n/**\r\n * XMATCH(lookup_value, lookup_array, [match_mode], [search_mode]) — returns the\r\n * 1-based position of a value in a 1-D vector. Semantics (match/search modes)\r\n * are identical to XLOOKUP, so we reuse `findMatch`: binary modes stay O(log n)\r\n * with no array materialisation, keeping full-column lookups cheap.\r\n */\r\nfunction xmatch(a: Args, c: Ctx): FormulaValue {\r\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\r\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\r\n\r\n const matchMode = a.length > 2 ? num(a, c, 2) : { ok: true as const, n: 0 };\r\n if (!matchMode.ok) return matchMode.e;\r\n const searchMode = a.length > 3 ? num(a, c, 3) : { ok: true as const, n: 1 };\r\n if (!searchMode.ok) return searchMode.e;\r\n\r\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\r\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\r\n const vertical = !(la.rows === 1 && la.columns > 1);\r\n const n = vertical ? la.rows : la.columns;\r\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\r\n\r\n const idx = findMatch(n, get, lookupVal, Math.trunc(matchMode.n), Math.trunc(searchMode.n));\r\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\r\n}\r\n\r\nfunction index_(a: Args, c: Ctx): FormulaValue {\r\n const arrVal = a[0]!.evaluate(c); if (arrVal.isError) return arrVal;\r\n const rv = num(a, c, 1); if (!rv.ok) return rv.e;\r\n const rowIdx = Math.round(rv.n) - 1;\r\n let colIdx = 0;\r\n if (a.length > 2) { const cv = num(a, c, 2); if (!cv.ok) return cv.e; colIdx = Math.round(cv.n) - 1; }\r\n\r\n if (!arrVal.isArray) return rowIdx === 0 && colIdx === 0 ? arrVal : FormulaValue.errorRef;\r\n\r\n const arr = arrVal.arrayVal;\r\n if (rowIdx < 0 || rowIdx >= arr.rows || colIdx < 0 || colIdx >= arr.columns) {\r\n return FormulaValue.errorRef;\r\n }\r\n return arr.get(rowIdx, colIdx);\r\n}\r\n\r\nfunction match(a: Args, c: Ctx): FormulaValue {\r\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\r\n const arrVal = a[1]!.evaluate(c); if (arrVal.isError) return arrVal;\r\n let matchType = 1;\r\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; matchType = Math.round(r.n); }\r\n\r\n if (!arrVal.isArray) {\r\n return FormulaValue.areEqual(arrVal, lookupVal) ? FormulaValue.one : FormulaValue.errorNA;\r\n }\r\n\r\n const arr = arrVal.arrayVal;\r\n const len = arr.length;\r\n\r\n if (matchType === 0) {\r\n for (let i = 0; i < len; i++) {\r\n if (FormulaValue.areEqual(arr.getFlat(i), lookupVal)) return FormulaValue.number(i + 1);\r\n }\r\n return FormulaValue.errorNA;\r\n }\r\n\r\n if (matchType === 1) {\r\n let best = -1;\r\n for (let i = 0; i < len; i++) {\r\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i; else break;\r\n }\r\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\r\n }\r\n\r\n // matchType === -1\r\n let best = -1;\r\n for (let i = 0; i < len; i++) {\r\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) >= 0) best = i; else break;\r\n }\r\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\r\n}\r\n\r\nfunction choose(a: Args, c: Ctx): FormulaValue {\r\n const iv = num(a, c, 0); if (!iv.ok) return iv.e;\r\n const idx = Math.round(iv.n);\r\n if (idx < 1 || idx >= a.length) return FormulaValue.errorValue;\r\n return a[idx]!.evaluate(c);\r\n}\r\n\r\n/** Largest index i (in flat order) with values[i] <= lookupVal, else -1. */\r\nfunction approxMatchFlat(arr: ArrayValue, lookupVal: FormulaValue): number {\r\n let best = -1;\r\n for (let i = 0; i < arr.length; i++) {\r\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i;\r\n else break;\r\n }\r\n return best;\r\n}\r\n\r\nfunction lookup(a: Args, c: Ctx): FormulaValue {\r\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\r\n const vecVal = a[1]!.evaluate(c); if (vecVal.isError) return vecVal;\r\n\r\n // Vector form with explicit result vector.\r\n if (a.length > 2) {\r\n const resVal = a[2]!.evaluate(c); if (resVal.isError) return resVal;\r\n const vecArr = vecVal.isArray ? vecVal.arrayVal : ArrayValue.fromScalar(vecVal);\r\n const idx = approxMatchFlat(vecArr, lookupVal);\r\n if (idx < 0) return FormulaValue.errorNA;\r\n if (resVal.isArray) return resVal.arrayVal.getFlat(idx);\r\n return idx === 0 ? resVal : FormulaValue.errorNA;\r\n }\r\n\r\n // Scalar.\r\n if (!vecVal.isArray) {\r\n return FormulaValue.areEqual(vecVal, lookupVal) ? vecVal : FormulaValue.errorNA;\r\n }\r\n\r\n // Array form: Excel searches the first row when the array is wider than tall,\r\n // otherwise the first column; the result comes from the last row/column.\r\n const arr = vecVal.arrayVal;\r\n if (arr.columns >= arr.rows) {\r\n let best = -1;\r\n for (let col = 0; col < arr.columns; col++) {\r\n if (FormulaValue.compare(arr.get(0, col), lookupVal) <= 0) best = col; else break;\r\n }\r\n return best >= 0 ? arr.get(arr.rows - 1, best) : FormulaValue.errorNA;\r\n }\r\n let best = -1;\r\n for (let r = 0; r < arr.rows; r++) {\r\n if (FormulaValue.compare(arr.get(r, 0), lookupVal) <= 0) best = r; else break;\r\n }\r\n return best >= 0 ? arr.get(best, arr.columns - 1) : FormulaValue.errorNA;\r\n}\r\n\r\nfunction address(a: Args, c: Ctx): FormulaValue {\r\n const rn = num(a, c, 0); if (!rn.ok) return rn.e;\r\n const cn = num(a, c, 1); if (!cn.ok) return cn.e;\r\n const row = Math.round(rn.n);\r\n const col = Math.round(cn.n);\r\n if (row < 1 || col < 1) return FormulaValue.errorValue;\r\n\r\n let absNum = 1;\r\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; absNum = Math.round(r.n); }\r\n if (absNum < 1 || absNum > 4) return FormulaValue.errorValue;\r\n\r\n let a1 = true;\r\n if (a.length > 3) {\r\n const v = a[3]!.evaluate(c);\r\n if (v.isError) return v;\r\n // A1 style is the default; only an explicit FALSE selects R1C1.\r\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\r\n }\r\n\r\n let sheetPrefix = '';\r\n if (a.length > 4) {\r\n const s = FormulaHelper.evalString(a[4]!, c);\r\n if (!s.ok) return s.error;\r\n if (s.value !== '') sheetPrefix = `${s.value}!`;\r\n }\r\n\r\n const rowAbs = absNum === 1 || absNum === 2;\r\n const colAbs = absNum === 1 || absNum === 3;\r\n\r\n let ref: string;\r\n if (a1) {\r\n ref = `${colAbs ? '$' : ''}${columnLetter(col)}${rowAbs ? '$' : ''}${row}`;\r\n } else {\r\n const rPart = rowAbs ? `R${row}` : `R[${row}]`;\r\n const cPart = colAbs ? `C${col}` : `C[${col}]`;\r\n ref = `${rPart}${cPart}`;\r\n }\r\n return FormulaValue.text(`${sheetPrefix}${ref}`);\r\n}\r\n\r\nfunction row(a: Args, c: Ctx): FormulaValue {\r\n if (a.length === 0) return FormulaValue.number(c.formulaRow || 1);\r\n const node = a[0]!;\r\n if (node instanceof CellReferenceNode) {\r\n return FormulaValue.number(parseCellRef(node.reference).row);\r\n }\r\n if (node instanceof RangeReferenceNode) {\r\n return FormulaValue.number(parseCellRef(node.startRef).row);\r\n }\r\n return FormulaValue.errorValue;\r\n}\r\n\r\nfunction column(a: Args, c: Ctx): FormulaValue {\r\n if (a.length === 0) return FormulaValue.number(c.formulaCol || 1);\r\n const node = a[0]!;\r\n if (node instanceof CellReferenceNode) {\r\n return FormulaValue.number(parseCellRef(node.reference).column);\r\n }\r\n if (node instanceof RangeReferenceNode) {\r\n return FormulaValue.number(parseCellRef(node.startRef).column);\r\n }\r\n return FormulaValue.errorValue;\r\n}\r\n\r\nfunction rows(a: Args, c: Ctx): FormulaValue {\r\n if (a[0] instanceof RangeReferenceNode) {\r\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\r\n return FormulaValue.number(b.endRow - b.startRow + 1);\r\n }\r\n const v = a[0]!.evaluate(c);\r\n return v.isArray ? FormulaValue.number(v.arrayVal.rows) : FormulaValue.one;\r\n}\r\n\r\nfunction columns(a: Args, c: Ctx): FormulaValue {\r\n if (a[0] instanceof RangeReferenceNode) {\r\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\r\n return FormulaValue.number(b.endCol - b.startCol + 1);\r\n }\r\n const v = a[0]!.evaluate(c);\r\n return v.isArray ? FormulaValue.number(v.arrayVal.columns) : FormulaValue.one;\r\n}\r\n\r\n// INDIRECT(ref_text, [a1]) — resolves a reference given as text. Volatile: the\r\n// dependency graph cannot see through it, so the recalc engine recomputes it\r\n// every pass.\r\nfunction indirect(a: Args, c: Ctx): FormulaValue {\r\n const s = FormulaHelper.evalString(a[0]!, c);\r\n if (!s.ok) return s.error;\r\n let a1 = true;\r\n if (a.length > 1) {\r\n const v = a[1]!.evaluate(c);\r\n if (v.isError) return v;\r\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\r\n }\r\n\r\n const text = s.value.trim();\r\n if (text === '') return FormulaValue.errorRef;\r\n\r\n // Split off an optional sheet qualifier (\"Sheet1!\" or \"'My Sheet'!\").\r\n let sheet: string | undefined;\r\n let body = text;\r\n const bang = text.lastIndexOf('!');\r\n if (bang >= 0) {\r\n sheet = text.slice(0, bang).replace(/^'|'$/g, '');\r\n body = text.slice(bang + 1);\r\n }\r\n\r\n const colon = body.indexOf(':');\r\n try {\r\n if (colon >= 0) {\r\n const start = toA1(body.slice(0, colon), a1, c);\r\n const end = toA1(body.slice(colon + 1), a1, c);\r\n if (start === null || end === null) return FormulaValue.errorRef;\r\n return sheet !== undefined\r\n ? c.getSheetRangeValues(sheet, start, end)\r\n : c.getRangeValues(start, end);\r\n }\r\n const cell = toA1(body, a1, c);\r\n if (cell === null) return FormulaValue.errorRef;\r\n return sheet !== undefined ? c.getSheetCellValue(sheet, cell) : c.getCellValue(cell);\r\n } catch {\r\n return FormulaValue.errorRef;\r\n }\r\n}\r\n\r\n/** Normalises a single reference (A1 or R1C1) to a plain A1 string, or null. */\r\nfunction toA1(ref: string, a1: boolean, c: Ctx): string | null {\r\n const r = ref.trim();\r\n if (a1) {\r\n try {\r\n const { row, column } = parseCellRef(r);\r\n return cellRefFromRowCol(row, column);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n // R1C1 — absolute R{n}C{n} or relative R[{d}]C[{d}] (relative to formula cell).\r\n const m = /^R(\\[-?\\d+\\]|\\d+)?C(\\[-?\\d+\\]|\\d+)?$/i.exec(r);\r\n if (!m) return null;\r\n const axis = (part: string | undefined, base: number): number | null => {\r\n if (part === undefined) return base; // bare R or C → same row/col\r\n if (part.startsWith('[')) return base + parseInt(part.slice(1, -1), 10); // relative\r\n return parseInt(part, 10); // absolute\r\n };\r\n const row = axis(m[1], c.formulaRow || 1);\r\n const col = axis(m[2], c.formulaCol || 1);\r\n if (row === null || col === null || row < 1 || col < 1) return null;\r\n return cellRefFromRowCol(row, col);\r\n}\r\n\r\nfunction offset(a: Args, c: Ctx): FormulaValue {\r\n const baseNode = a[0]!;\r\n let baseRef: string;\r\n if (baseNode instanceof CellReferenceNode) baseRef = baseNode.reference;\r\n else if (baseNode instanceof RangeReferenceNode) baseRef = baseNode.startRef;\r\n else return FormulaValue.errorValue;\r\n\r\n const base = parseCellRef(baseRef);\r\n\r\n const ro = FormulaHelper.evalDouble(a[1]!, c); if (!ro.ok) return ro.error;\r\n const co = FormulaHelper.evalDouble(a[2]!, c); if (!co.ok) return co.error;\r\n\r\n const newRow = base.row + Math.round(ro.value);\r\n const newCol = base.column + Math.round(co.value);\r\n if (newRow < 1 || newCol < 1) return FormulaValue.errorRef;\r\n\r\n let height = 1, width = 1;\r\n if (a.length > 3) { const h = FormulaHelper.evalDouble(a[3]!, c); if (!h.ok) return h.error; height = Math.round(h.value); }\r\n if (a.length > 4) { const w = FormulaHelper.evalDouble(a[4]!, c); if (!w.ok) return w.error; width = Math.round(w.value); }\r\n\r\n if (height === 1 && width === 1) return c.getCellValue(cellRefFromRowCol(newRow, newCol));\r\n\r\n return c.getRangeValues(\r\n cellRefFromRowCol(newRow, newCol),\r\n cellRefFromRowCol(newRow + height - 1, newCol + width - 1),\r\n );\r\n}\r\n","/**\n * Statistical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.StatisticalFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerStatistical(r: FunctionRegistry): void {\n r.register('MEDIAN', median, 1);\n r.register('MODE', mode, 1);\n r.register('MODE.SNGL', mode, 1);\n r.register('STDEV', stdev, 1);\n r.register('STDEV.S', stdev, 1);\n r.register('STDEVP', stdevp, 1);\n r.register('STDEV.P', stdevp, 1);\n r.register('VAR', var_, 1);\n r.register('VAR.S', var_, 1);\n r.register('VARP', varp, 1);\n r.register('VAR.P', varp, 1);\n r.register('LARGE', large, 2, 2);\n r.register('SMALL', small, 2, 2);\n r.register('RANK', rank, 2, 3);\n r.register('RANK.EQ', rank, 2, 3);\n r.register('PERCENTILE', percentile, 2, 2);\n r.register('PERCENTILE.INC', percentile, 2, 2);\n r.register('MAXIFS', maxIfs, 3);\n r.register('MINIFS', minIfs, 3);\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction variance(nums: number[], population: boolean): number {\n const mean = nums.reduce((s, n) => s + n, 0) / nums.length;\n const sumSq = nums.reduce((s, n) => s + (n - mean) ** 2, 0);\n return sumSq / (population ? nums.length : nums.length - 1);\n}\n\nfunction numsFromArray(v: FormulaValue): number[] {\n if (v.isArray) {\n return [...v.arrayVal.values()]\n .filter(i => i.isNumber)\n .map(i => i.numberValue);\n }\n return v.isNumber ? [v.numberValue] : [];\n}\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction median(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNum;\n const sorted = [...r.values].sort((a, b) => a - b);\n const mid = sorted.length >> 1;\n return FormulaValue.number(\n sorted.length % 2 === 0 ? (sorted[mid - 1]! + sorted[mid]!) / 2 : sorted[mid]!,\n );\n}\n\nfunction mode(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNA;\n const freq = new Map<number, number>();\n let maxCnt = 0;\n for (const n of r.values) {\n const cnt = (freq.get(n) ?? 0) + 1;\n freq.set(n, cnt);\n if (cnt > maxCnt) maxCnt = cnt;\n }\n if (maxCnt === 1) return FormulaValue.errorNA;\n for (const n of r.values) {\n if ((freq.get(n) ?? 0) === maxCnt) return FormulaValue.number(n);\n }\n return FormulaValue.errorNA;\n}\n\nfunction stdev(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, false)));\n}\n\nfunction stdevp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, true)));\n}\n\nfunction var_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, false));\n}\n\nfunction varp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, true));\n}\n\nfunction large(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => b - a);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction small(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction rank(a: Args, c: Ctx): FormulaValue {\n const nv = FormulaHelper.evalDouble(a[0]!, c); if (!nv.ok) return nv.error;\n const arrV = a[1]!.evaluate(c); if (arrV.isError) return arrV;\n let order = 0;\n if (a.length > 2) { const ov = num(a, c, 2); if (!ov.ok) return ov.e; order = Math.round(ov.n); }\n const nums = numsFromArray(arrV).sort((a, b) => order === 0 ? b - a : a - b);\n const idx = nums.indexOf(nv.value);\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction percentile(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = FormulaHelper.evalDouble(a[1]!, c); if (!kv.ok) return kv.error;\n if (kv.value < 0 || kv.value > 1) return FormulaValue.errorNum;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n if (nums.length === 0) return FormulaValue.errorNum;\n const n = (nums.length - 1) * kv.value;\n const lo = Math.floor(n), hi = Math.ceil(n);\n if (lo === hi) return FormulaValue.number(nums[lo]!);\n return FormulaValue.number(nums[lo]! + (nums[hi]! - nums[lo]!) * (n - lo));\n}\n\nfunction maxIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'max');\n}\n\nfunction minIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'min');\n}\n\nfunction ifsAggregate(a: Args, c: Ctx, mode: 'max' | 'min'): FormulaValue {\n if (a.length < 3 || (a.length - 1) % 2 !== 0) return FormulaValue.errorValue;\n const mainRange = a[0]!.evaluate(c); if (mainRange.isError) return mainRange;\n if (!mainRange.isArray) return FormulaValue.errorValue;\n\n const arr = mainRange.arrayVal;\n const len = arr.length;\n const mask = new Uint8Array(len).fill(1);\n\n for (let p = 1; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c); if (cr.isError) return cr;\n const criteria = a[p + 1]!.evaluate(c).asText();\n const crArr = cr.isArray ? cr.arrayVal : null;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const cv = crArr ? crArr.getFlat(i) : cr;\n if (!FormulaHelper.matchesCriteria(cv, criteria)) mask[i] = 0;\n }\n }\n\n let result = mode === 'max' ? -Infinity : Infinity;\n let found = false;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const r = arr.getFlat(i).tryAsDouble();\n if (!r.ok) continue;\n if (mode === 'max' ? r.value > result : r.value < result) { result = r.value; found = true; }\n }\n return found ? FormulaValue.number(result) : FormulaValue.zero;\n}\n","/**\n * Information Excel functions (IS*, TYPE, N, ERROR.TYPE, etc.).\n * Port of TVE.PureDocs.Excel.Formulas.InfoFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerInfo(r: FunctionRegistry): void {\n r.register('ISBLANK', isBlank, 1, 1);\n r.register('ISNUMBER', isNumber, 1, 1);\n r.register('ISTEXT', isText, 1, 1);\n r.register('ISERROR', isError, 1, 1);\n r.register('ISERR', isErr, 1, 1);\n r.register('ISLOGICAL', isLogical, 1, 1);\n r.register('ISNA', isNa, 1, 1);\n r.register('ISNONTEXT', isNonText, 1, 1);\n r.register('NA', na, 0, 0);\n r.register('TYPE', type_, 1, 1);\n r.register('N', n_, 1, 1);\n r.register('ISODD', isOdd, 1, 1);\n r.register('ISEVEN', isEven, 1, 1);\n r.register('ERROR.TYPE', errorType, 1, 1);\n}\n\nfunction isBlank(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBlank); }\nfunction isNumber(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isNumber); }\nfunction isText(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isText && v.textValue.length > 0);\n}\nfunction isError(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isError); }\nfunction isErr(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode !== FormulaError.NA);\n}\nfunction isLogical(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBoolean); }\nfunction isNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode === FormulaError.NA);\n}\nfunction isNonText(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(!a[0]!.evaluate(c).isText); }\nfunction na(): FormulaValue { return FormulaValue.errorNA; }\n\nfunction type_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n const t = v.isNumber || v.isBlank ? 1\n : v.isText ? 2\n : v.isBoolean ? 4\n : v.isError ? 16\n : v.isArray ? 64 : 1;\n return FormulaValue.number(t);\n}\n\nfunction n_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isNumber) return v;\n if (v.isBoolean) return FormulaValue.number(v.booleanValue ? 1 : 0);\n return FormulaValue.zero;\n}\n\nfunction isOdd(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.abs(Math.trunc(r.value)) % 2 === 1);\n}\n\nfunction isEven(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.trunc(r.value) % 2 === 0);\n}\n\nfunction errorType(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isError) return FormulaValue.errorNA;\n const map: Partial<Record<FormulaError, number>> = {\n [FormulaError.Null]: 1,\n [FormulaError.Div0]: 2,\n [FormulaError.Value]: 3,\n [FormulaError.Ref]: 4,\n [FormulaError.Name]: 5,\n [FormulaError.Num]: 6,\n [FormulaError.NA]: 7,\n };\n return FormulaValue.number(map[v.errorCode] ?? 7);\n}\n","/**\r\n * Financial Excel functions: PMT, FV, PV, NPV, IRR, RATE, NPER, XNPV, XIRR,\r\n * IPMT, PPMT.\r\n *\r\n * Sign conventions follow Excel: money you receive is positive, money you pay\r\n * is negative. `type` is 0 for end-of-period payments (default) or 1 for\r\n * beginning-of-period.\r\n */\r\nimport { FormulaValue } from '../formula-value.js';\r\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\r\nimport type { FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerFinance(r: FunctionRegistry): void {\r\n r.register('PMT', pmt, 3, 5);\r\n r.register('FV', fv, 3, 5);\r\n r.register('PV', pv, 3, 5);\r\n r.register('NPV', npv, 2);\r\n r.register('IRR', irr, 1, 2);\r\n r.register('RATE', rate, 3, 6);\r\n r.register('NPER', nper, 3, 5);\r\n r.register('XNPV', xnpv, 3, 3);\r\n r.register('XIRR', xirr, 2, 3);\r\n r.register('IPMT', ipmt, 4, 6);\r\n r.register('PPMT', ppmt, 4, 6);\r\n}\r\n\r\n// ── Shared time-value-of-money kernels (used by PMT/FV/IPMT/PPMT) ─────────────\r\n\r\n/** Level payment for an annuity. Mirrors Excel PMT. */\r\nfunction pmtValue(r: number, n: number, pv: number, fv: number, type: number): number {\r\n if (r === 0) return -(pv + fv) / n;\r\n const pow = Math.pow(1 + r, n);\r\n let payment = (-fv - pv * pow) * r / (pow - 1);\r\n if (type === 1) payment /= (1 + r);\r\n return payment;\r\n}\r\n\r\n/** Future value after `n` periods. Mirrors Excel FV. */\r\nfunction fvValue(r: number, n: number, pmt: number, pv: number, type: number): number {\r\n if (r === 0) return -(pv + pmt * n);\r\n const pow = Math.pow(1 + r, n);\r\n return -(pv * pow + pmt * (1 + r * type) * (pow - 1) / r);\r\n}\r\n\r\n/** Reads argument `idx` as a number, defaulting when the argument is absent. */\r\nfunction arg(a: Args, c: Ctx, idx: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\r\n if (idx >= a.length) return { ok: true, n: dflt };\r\n const r = FormulaHelper.evalDouble(a[idx]!, c);\r\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\r\n}\r\n\r\nfunction pmt(a: Args, c: Ctx): FormulaValue {\r\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\r\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\r\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\r\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\r\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\r\n\r\n const r = rate.n, n = nper.n, present = pvv.n, future = fvv.n, t = type.n;\r\n if (n === 0) return FormulaValue.errorNum;\r\n return FormulaValue.number(pmtValue(r, n, present, future, t));\r\n}\r\n\r\nfunction fv(a: Args, c: Ctx): FormulaValue {\r\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\r\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\r\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\r\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\r\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\r\n\r\n const r = rate.n, n = nper.n, payment = pmtv.n, present = pvv.n, t = type.n;\r\n return FormulaValue.number(fvValue(r, n, payment, present, t));\r\n}\r\n\r\nfunction pv(a: Args, c: Ctx): FormulaValue {\r\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\r\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\r\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\r\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\r\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\r\n\r\n const r = rate.n, n = nper.n, payment = pmtv.n, future = fvv.n, t = type.n;\r\n if (r === 0) return FormulaValue.number(-(future + payment * n));\r\n\r\n const pow = Math.pow(1 + r, n);\r\n return FormulaValue.number(-(future + payment * (1 + r * t) * (pow - 1) / r) / pow);\r\n}\r\n\r\nfunction npv(a: Args, c: Ctx): FormulaValue {\r\n const rate = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!rate.ok) return rate.error;\r\n if (rate.value === -1) return FormulaValue.errorDiv0;\r\n\r\n const flows = FormulaHelper.collectNumbers(a.slice(1), c);\r\n if (!flows.ok) return flows.error;\r\n\r\n let total = 0;\r\n for (let i = 0; i < flows.values.length; i++) {\r\n total += flows.values[i]! / Math.pow(1 + rate.value, i + 1);\r\n }\r\n return FormulaValue.number(total);\r\n}\r\n\r\nfunction irr(a: Args, c: Ctx): FormulaValue {\r\n const flowsRes = FormulaHelper.collectNumbers([a[0]!], c);\r\n if (!flowsRes.ok) return flowsRes.error;\r\n const flows = flowsRes.values;\r\n if (flows.length < 2) return FormulaValue.errorNum;\r\n\r\n let guess = 0.1;\r\n if (a.length > 1) {\r\n const g = FormulaHelper.evalDouble(a[1]!, c);\r\n if (!g.ok) return g.error;\r\n guess = g.value;\r\n }\r\n\r\n const npvAt = (rate: number): number => {\r\n let sum = 0;\r\n for (let i = 0; i < flows.length; i++) sum += flows[i]! / Math.pow(1 + rate, i);\r\n return sum;\r\n };\r\n\r\n // Newton-Raphson with a numeric derivative; bounded iterations.\r\n let rate = guess;\r\n for (let iter = 0; iter < 100; iter++) {\r\n const f = npvAt(rate);\r\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\r\n const h = 1e-6;\r\n const deriv = (npvAt(rate + h) - f) / h;\r\n if (deriv === 0) break;\r\n const next = rate - f / deriv;\r\n if (!isFinite(next) || next <= -1) break;\r\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\r\n rate = next;\r\n }\r\n if (Math.abs(npvAt(rate)) < 1e-6) return FormulaValue.number(rate);\r\n return FormulaValue.errorNum;\r\n}\r\n\r\n/**\r\n * Time-value-of-money residual: the present value of a stream that should\r\n * equal zero at the true rate. Shared by RATE (root-finding) so its Newton\r\n * iteration and the closed forms above stay consistent.\r\n * pv·(1+r)^n + pmt·(1+r·type)·((1+r)^n − 1)/r + fv\r\n */\r\nfunction tvm(r: number, n: number, pmt: number, pv: number, fv: number, type: number): number {\r\n if (r === 0) return pv + pmt * n + fv;\r\n const pow = Math.pow(1 + r, n);\r\n return pv * pow + pmt * (1 + r * type) * (pow - 1) / r + fv;\r\n}\r\n\r\nfunction rate(a: Args, c: Ctx): FormulaValue {\r\n const nper = arg(a, c, 0, 0); if (!nper.ok) return nper.e;\r\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\r\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\r\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\r\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\r\n const gs = arg(a, c, 5, 0.1); if (!gs.ok) return gs.e;\r\n\r\n const n = nper.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\r\n if (n === 0) return FormulaValue.errorNum;\r\n\r\n // Newton-Raphson with a numeric derivative; Excel's own default guess is 10%.\r\n let r = gs.n;\r\n for (let iter = 0; iter < 100; iter++) {\r\n const f = tvm(r, n, pmt, pv, fv, t);\r\n if (Math.abs(f) < 1e-8) return FormulaValue.number(r);\r\n const h = 1e-6;\r\n const deriv = (tvm(r + h, n, pmt, pv, fv, t) - f) / h;\r\n if (deriv === 0) break;\r\n const next = r - f / deriv;\r\n if (!isFinite(next) || next <= -1) break;\r\n if (Math.abs(next - r) < 1e-10) { r = next; break; }\r\n r = next;\r\n }\r\n if (Math.abs(tvm(r, n, pmt, pv, fv, t)) < 1e-6) return FormulaValue.number(r);\r\n return FormulaValue.errorNum;\r\n}\r\n\r\nfunction nper(a: Args, c: Ctx): FormulaValue {\r\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\r\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\r\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\r\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\r\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\r\n\r\n const r = rate.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\r\n\r\n if (r === 0) {\r\n if (pmt === 0) return FormulaValue.errorNum;\r\n return FormulaValue.number(-(pv + fv) / pmt);\r\n }\r\n // Closed form: n = ln((pmt·(1+r·t) − fv·r)/(pmt·(1+r·t) + pv·r)) / ln(1+r)\r\n const adj = pmt * (1 + r * t);\r\n const num = adj - fv * r;\r\n const den = adj + pv * r;\r\n if (den === 0 || num / den <= 0) return FormulaValue.errorNum;\r\n const result = Math.log(num / den) / Math.log(1 + r);\r\n if (!isFinite(result)) return FormulaValue.errorNum;\r\n return FormulaValue.number(result);\r\n}\r\n\r\n/**\r\n * IPMT / PPMT — split the level annuity payment for a single period `per` into\r\n * its interest and principal parts. IPMT is the balance at the start of the\r\n * period times the rate; PPMT is the remainder of the payment. Both are O(1)\r\n * closed forms (no per-period loop), reusing the shared PMT/FV kernels.\r\n */\r\nfunction interestForPeriod(r: number, per: number, n: number, pv: number, fv: number, t: number): number {\r\n const pay = pmtValue(r, n, pv, fv, t);\r\n // Outstanding balance at the start of period `per` = FV after (per-1) periods.\r\n // For beginning-of-period annuities the first period accrues no interest, and\r\n // subsequent periods discount the accrued interest by one period.\r\n if (t === 1) {\r\n if (per === 1) return 0;\r\n return fvValue(r, per - 2, pay, pv, 1) * r / (1 + r);\r\n }\r\n return fvValue(r, per - 1, pay, pv, 0) * r;\r\n}\r\n\r\nfunction ipmt(a: Args, c: Ctx): FormulaValue {\r\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\r\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\r\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\r\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\r\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\r\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\r\n\r\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\r\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\r\n return FormulaValue.number(interestForPeriod(r, per, n, pv, fv, t));\r\n}\r\n\r\nfunction ppmt(a: Args, c: Ctx): FormulaValue {\r\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\r\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\r\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\r\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\r\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\r\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\r\n\r\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\r\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\r\n const pay = pmtValue(r, n, pv, fv, t);\r\n return FormulaValue.number(pay - interestForPeriod(r, per, n, pv, fv, t));\r\n}\r\n\r\n/**\r\n * Reads a node as a flat list of numbers in row-major order, keeping positional\r\n * alignment (blanks count as 0, unlike collectNumbers which drops them). Used to\r\n * pair cash flows with their dates for XNPV/XIRR.\r\n */\r\nfunction flatNumbers(\r\n node: FormulaNode,\r\n c: Ctx,\r\n): { ok: true; values: number[] } | { ok: false; e: FormulaValue } {\r\n const v = node.evaluate(c);\r\n if (v.isError) return { ok: false, e: v };\r\n const out: number[] = [];\r\n const push = (item: FormulaValue): FormulaValue | null => {\r\n if (item.isError) return item;\r\n const d = item.tryAsDouble();\r\n if (!d.ok) return FormulaValue.errorValue;\r\n out.push(d.value);\r\n return null;\r\n };\r\n if (v.isArray) {\r\n for (const item of v.arrayVal.values()) {\r\n const err = push(item);\r\n if (err) return { ok: false, e: err };\r\n }\r\n } else {\r\n const err = push(v);\r\n if (err) return { ok: false, e: err };\r\n }\r\n return { ok: true, values: out };\r\n}\r\n\r\n/** Discounted value of dated cash flows: Σ vᵢ / (1+rate)^((dateᵢ − date₀)/365). */\r\nfunction xnpvAt(rate: number, values: number[], days: number[]): number {\r\n let sum = 0;\r\n for (let i = 0; i < values.length; i++) {\r\n sum += values[i]! / Math.pow(1 + rate, days[i]! / 365);\r\n }\r\n return sum;\r\n}\r\n\r\nfunction xnpv(a: Args, c: Ctx): FormulaValue {\r\n const rateRes = FormulaHelper.evalDouble(a[0]!, c);\r\n if (!rateRes.ok) return rateRes.error;\r\n const rate = rateRes.value;\r\n if (rate <= -1) return FormulaValue.errorNum;\r\n\r\n const valsRes = flatNumbers(a[1]!, c); if (!valsRes.ok) return valsRes.e;\r\n const datesRes = flatNumbers(a[2]!, c); if (!datesRes.ok) return datesRes.e;\r\n const values = valsRes.values;\r\n const dates = datesRes.values;\r\n if (values.length === 0 || values.length !== dates.length) return FormulaValue.errorNum;\r\n\r\n const base = Math.trunc(dates[0]!);\r\n const days = dates.map(d => Math.trunc(d) - base);\r\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\r\n\r\n return FormulaValue.number(xnpvAt(rate, values, days));\r\n}\r\n\r\nfunction xirr(a: Args, c: Ctx): FormulaValue {\r\n const valsRes = flatNumbers(a[0]!, c); if (!valsRes.ok) return valsRes.e;\r\n const datesRes = flatNumbers(a[1]!, c); if (!datesRes.ok) return datesRes.e;\r\n const values = valsRes.values;\r\n const dates = datesRes.values;\r\n if (values.length < 2 || values.length !== dates.length) return FormulaValue.errorNum;\r\n\r\n let guess = 0.1;\r\n if (a.length > 2) {\r\n const g = FormulaHelper.evalDouble(a[2]!, c);\r\n if (!g.ok) return g.error;\r\n guess = g.value;\r\n }\r\n\r\n const base = Math.trunc(dates[0]!);\r\n const days = dates.map(d => Math.trunc(d) - base);\r\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\r\n\r\n // Analytic derivative: f'(r) = Σ −(dᵢ/365)·vᵢ / (1+r)^(dᵢ/365 + 1).\r\n const derivAt = (rate: number): number => {\r\n let sum = 0;\r\n for (let i = 0; i < values.length; i++) {\r\n const e = days[i]! / 365;\r\n sum += -e * values[i]! / Math.pow(1 + rate, e + 1);\r\n }\r\n return sum;\r\n };\r\n\r\n let rate = guess;\r\n for (let iter = 0; iter < 100; iter++) {\r\n const f = xnpvAt(rate, values, days);\r\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\r\n const deriv = derivAt(rate);\r\n if (deriv === 0) break;\r\n const next = rate - f / deriv;\r\n if (!isFinite(next) || next <= -1) break;\r\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\r\n rate = next;\r\n }\r\n if (Math.abs(xnpvAt(rate, values, days)) < 1e-6) return FormulaValue.number(rate);\r\n return FormulaValue.errorNum;\r\n}\r\n","/**\r\n * Meta / language functions: LET (and later LAMBDA and its helpers).\r\n *\r\n * These are not ordinary value functions — they manipulate names and scopes,\r\n * so they inspect their argument AST nodes directly rather than only their\r\n * evaluated values.\r\n */\r\nimport { FormulaValue, ArrayValue, TailCall, type LambdaLike } from '../formula-value.js';\r\n\r\n/** Safety cap on trampoline iterations (guards a non-terminating tail loop). */\r\nconst MAX_TAIL_ITERATIONS = 10_000_000;\r\nimport { type FunctionRegistry } from '../function-registry.js';\r\nimport { NamedRangeNode, type FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerMeta(r: FunctionRegistry): void {\r\n r.register('LET', let_, 3);\r\n r.register('LAMBDA', lambda_, 1);\r\n r.register('MAP', map_, 2);\r\n r.register('REDUCE', reduce_, 3, 3);\r\n r.register('SCAN', scan_, 3, 3);\r\n r.register('BYROW', byRow, 2, 2);\r\n r.register('BYCOL', byCol, 2, 2);\r\n}\r\n\r\nconst asArray = (v: FormulaValue): ArrayValue =>\r\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\r\n\r\n/**\r\n * LET(name1, value1, [name2, value2, ...], calculation)\r\n *\r\n * Binds each name to its value in a fresh lexical scope, then evaluates the\r\n * final calculation. Later bindings may reference earlier ones. Names are\r\n * ordinary identifiers, which the parser represents as NamedRangeNode.\r\n */\r\nfunction let_(a: Args, c: Ctx): FormulaValue {\r\n // Need an odd count ≥ 3: pairs of (name, value) followed by one calculation.\r\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\r\n\r\n const bindings = new Map<string, FormulaValue>();\r\n c.pushScope(bindings);\r\n try {\r\n for (let i = 0; i < a.length - 1; i += 2) {\r\n const nameNode = a[i]!;\r\n if (!(nameNode instanceof NamedRangeNode)) return FormulaValue.errorValue;\r\n const value = a[i + 1]!.evaluate(c); // may reference names bound earlier\r\n if (value.isError) return value;\r\n bindings.set(nameNode.name.toUpperCase(), value);\r\n }\r\n return a[a.length - 1]!.evaluate(c);\r\n } finally {\r\n c.popScope();\r\n }\r\n}\r\n\r\n/**\r\n * LAMBDA(param1, ..., paramN, calculation)\r\n *\r\n * Produces a callable value. When invoked, each parameter is bound to its\r\n * argument in a fresh scope on the defining context and the calculation is\r\n * evaluated. Usable inline — LAMBDA(x,x+1)(5) — or via a defined name.\r\n */\r\nfunction lambda_(a: Args, c: Ctx): FormulaValue {\r\n const paramNodes = a.slice(0, -1);\r\n const body = a[a.length - 1]!;\r\n const params: string[] = [];\r\n for (const p of paramNodes) {\r\n if (!(p instanceof NamedRangeNode)) return FormulaValue.errorValue;\r\n params.push(p.name.toUpperCase());\r\n }\r\n const ctx = c; // capture defining context\r\n\r\n const lambda: LambdaLike = {\r\n arity: params.length,\r\n\r\n // One tail-aware evaluation of the body: binds params, then evaluates in\r\n // tail mode so a self/other tail call surfaces as a TailCall.\r\n step(args: FormulaValue[]): FormulaValue | TailCall {\r\n const bindings = new Map<string, FormulaValue>();\r\n params.forEach((p, i) => bindings.set(p, args[i] ?? FormulaValue.blank));\r\n ctx.pushScope(bindings);\r\n try {\r\n return body.evaluateTail(ctx);\r\n } finally {\r\n ctx.popScope();\r\n }\r\n },\r\n\r\n // Run to completion. Tail calls iterate here (O(1) stack); only non-tail\r\n // recursion re-enters call() and is bounded by the recursion guard.\r\n call(args: FormulaValue[]): FormulaValue {\r\n const guard = ctx.recursionGuard;\r\n if (guard) {\r\n if (guard.depth >= guard.max) return FormulaValue.errorNum; // too deep → #NUM!\r\n guard.depth++;\r\n }\r\n try {\r\n let current: LambdaLike = lambda;\r\n let currentArgs = args;\r\n for (let iter = 0; ; iter++) {\r\n if (iter > MAX_TAIL_ITERATIONS) return FormulaValue.errorNum;\r\n const r = current.step ? current.step(currentArgs) : current.call(currentArgs);\r\n if (r instanceof TailCall) {\r\n current = r.lambda;\r\n currentArgs = r.args;\r\n continue;\r\n }\r\n return r;\r\n }\r\n } finally {\r\n if (guard) guard.depth--;\r\n }\r\n },\r\n };\r\n\r\n return FormulaValue.lambda(lambda);\r\n}\r\n\r\n/** Resolves the trailing lambda argument. */\r\nfunction lambdaArg(node: FormulaNode, c: Ctx): { ok: true; fn: LambdaLike } | { ok: false; e: FormulaValue } {\r\n const v = node.evaluate(c);\r\n if (v.isError) return { ok: false, e: v };\r\n if (!v.isLambda) return { ok: false, e: FormulaValue.errorValue };\r\n return { ok: true, fn: v.lambdaVal };\r\n}\r\n\r\n// MAP(array1, [array2, ...], lambda) — element-wise map over one or more arrays.\r\nfunction map_(a: Args, c: Ctx): FormulaValue {\r\n const fn = lambdaArg(a[a.length - 1]!, c); if (!fn.ok) return fn.e;\r\n const arrays = a.slice(0, -1).map(n => asArray(n.evaluate(c)));\r\n if (arrays.length === 0) return FormulaValue.errorValue;\r\n const rows = arrays[0]!.rows, cols = arrays[0]!.columns;\r\n const out = new ArrayValue(rows, cols);\r\n for (let r = 0; r < rows; r++) {\r\n for (let col = 0; col < cols; col++) {\r\n out.set(r, col, fn.fn.call(arrays.map(ar => ar.get(r, col))));\r\n }\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\n// REDUCE(initial, array, lambda(acc, value)) — fold to a single value.\r\nfunction reduce_(a: Args, c: Ctx): FormulaValue {\r\n let acc = a[0]!.evaluate(c);\r\n if (acc.isError) return acc;\r\n const arr = asArray(a[1]!.evaluate(c));\r\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\r\n for (const v of arr.values()) {\r\n acc = fn.fn.call([acc, v]);\r\n if (acc.isError) return acc;\r\n }\r\n return acc;\r\n}\r\n\r\n// SCAN(initial, array, lambda(acc, value)) — running fold; returns an array.\r\nfunction scan_(a: Args, c: Ctx): FormulaValue {\r\n let acc = a[0]!.evaluate(c);\r\n if (acc.isError) return acc;\r\n const arr = asArray(a[1]!.evaluate(c));\r\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\r\n const out = new ArrayValue(arr.rows, arr.columns);\r\n for (let r = 0; r < arr.rows; r++) {\r\n for (let col = 0; col < arr.columns; col++) {\r\n acc = fn.fn.call([acc, arr.get(r, col)]);\r\n out.set(r, col, acc);\r\n }\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\n// BYROW(array, lambda(row)) — apply lambda to each row → column vector.\r\nfunction byRow(a: Args, c: Ctx): FormulaValue {\r\n const arr = asArray(a[0]!.evaluate(c));\r\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\r\n const out = new ArrayValue(arr.rows, 1);\r\n for (let r = 0; r < arr.rows; r++) {\r\n const row = new ArrayValue(1, arr.columns);\r\n for (let col = 0; col < arr.columns; col++) row.set(0, col, arr.get(r, col));\r\n out.set(r, 0, fn.fn.call([FormulaValue.array(row)]));\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\n// BYCOL(array, lambda(col)) — apply lambda to each column → row vector.\r\nfunction byCol(a: Args, c: Ctx): FormulaValue {\r\n const arr = asArray(a[0]!.evaluate(c));\r\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\r\n const out = new ArrayValue(1, arr.columns);\r\n for (let col = 0; col < arr.columns; col++) {\r\n const column = new ArrayValue(arr.rows, 1);\r\n for (let r = 0; r < arr.rows; r++) column.set(r, 0, arr.get(r, col));\r\n out.set(0, col, fn.fn.call([FormulaValue.array(column)]));\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n","/**\r\n * SUBTOTAL and AGGREGATE — aggregates with visibility/nesting awareness.\r\n *\r\n * Both can skip rows hidden in the sheet and ignore nested SUBTOTAL/AGGREGATE\r\n * cells inside their ranges. That requires reference-level information (which\r\n * cell each value comes from, whether its row is hidden, what formula it holds),\r\n * so these functions inspect their argument nodes rather than only values, and\r\n * read the worksheet's optional isRowHidden/getCellFormula hooks.\r\n */\r\nimport { cellRefFromRowCol } from '@devmm/puredocs-excel';\r\nimport { FormulaValue } from '../formula-value.js';\r\nimport { type FunctionRegistry } from '../function-registry.js';\r\nimport { RangeReferenceNode, type FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerAggregate(r: FunctionRegistry): void {\r\n r.register('SUBTOTAL', subtotal, 2);\r\n r.register('AGGREGATE', aggregate, 3);\r\n}\r\n\r\ninterface CollectOptions {\r\n excludeHidden: boolean;\r\n /** Regex of formula names to treat as \"nested\" and skip, or null. */\r\n nestedPattern: RegExp | null;\r\n /** Skip cells whose evaluated value is an error (AGGREGATE option 6/7). */\r\n ignoreErrors: boolean;\r\n}\r\n\r\n/**\r\n * Collects the included values from the reference/value arguments starting at\r\n * `startIdx`, honouring hidden-row and nested-formula exclusions for cells that\r\n * come from same-sheet ranges. Returns the flat list of values, or an error.\r\n */\r\nfunction collectValues(\r\n a: Args,\r\n c: Ctx,\r\n startIdx: number,\r\n opts: CollectOptions,\r\n): { ok: true; values: FormulaValue[] } | { ok: false; error: FormulaValue } {\r\n const out: FormulaValue[] = [];\r\n const ws = c.worksheet;\r\n\r\n for (let i = startIdx; i < a.length; i++) {\r\n const node = a[i]!;\r\n if (node instanceof RangeReferenceNode) {\r\n const b = c.getRangeBounds(node.startRef, node.endRef);\r\n for (let row = b.startRow; row <= b.endRow; row++) {\r\n if (opts.excludeHidden && ws.isRowHidden?.(row)) continue;\r\n for (let col = b.startCol; col <= b.endCol; col++) {\r\n const ref = cellRefFromRowCol(row, col);\r\n if (opts.nestedPattern) {\r\n const f = ws.getCellFormula?.(ref);\r\n if (f && opts.nestedPattern.test(f)) continue; // skip nested SUBTOTAL/AGGREGATE\r\n }\r\n const v = c.getCellValue(ref);\r\n if (v.isError) {\r\n if (opts.ignoreErrors) continue;\r\n return { ok: false, error: v };\r\n }\r\n out.push(v);\r\n }\r\n }\r\n } else {\r\n const v = node.evaluate(c);\r\n if (v.isError) {\r\n if (opts.ignoreErrors) continue;\r\n return { ok: false, error: v };\r\n }\r\n if (v.isArray) {\r\n for (const item of v.arrayVal.values()) {\r\n if (item.isError) { if (opts.ignoreErrors) continue; return { ok: false, error: item }; }\r\n out.push(item);\r\n }\r\n } else {\r\n out.push(v);\r\n }\r\n }\r\n }\r\n return { ok: true, values: out };\r\n}\r\n\r\n/** Applies aggregate selector 1-11 (SUBTOTAL) / 1-19 (AGGREGATE) to values. */\r\nfunction applyAggregate(fn: number, values: FormulaValue[], extra?: number): FormulaValue {\r\n const nums: number[] = [];\r\n let countA = 0;\r\n for (const v of values) {\r\n if (!v.isBlank) countA++;\r\n const r = v.tryAsDouble();\r\n if (r.ok && !v.isText && !v.isBlank) nums.push(r.value);\r\n }\r\n\r\n const sum = () => nums.reduce((s, n) => s + n, 0);\r\n const avg = () => (nums.length ? sum() / nums.length : NaN);\r\n const variance = (sample: boolean): number => {\r\n const n = nums.length;\r\n if (sample ? n < 2 : n < 1) return NaN;\r\n const m = avg();\r\n const ss = nums.reduce((s, x) => s + (x - m) ** 2, 0);\r\n return ss / (sample ? n - 1 : n);\r\n };\r\n const sorted = () => [...nums].sort((x, y) => x - y);\r\n\r\n switch (fn) {\r\n case 1: return isNaN(avg()) ? FormulaValue.errorDiv0 : FormulaValue.number(avg());\r\n case 2: return FormulaValue.number(nums.length); // COUNT\r\n case 3: return FormulaValue.number(countA); // COUNTA\r\n case 4: return nums.length ? FormulaValue.number(Math.max(...nums)) : FormulaValue.zero;\r\n case 5: return nums.length ? FormulaValue.number(Math.min(...nums)) : FormulaValue.zero;\r\n case 6: return FormulaValue.number(nums.reduce((p, n) => p * n, 1)); // PRODUCT\r\n case 7: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.S\r\n case 8: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.P\r\n case 9: return FormulaValue.number(sum()); // SUM\r\n case 10: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.S\r\n case 11: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.P\r\n // AGGREGATE-only selectors:\r\n case 12: { const s = sorted(); const m = s.length; if (!m) return FormulaValue.errorNum;\r\n const mid = Math.floor(m / 2); return FormulaValue.number(m % 2 ? s[mid]! : (s[mid - 1]! + s[mid]!) / 2); } // MEDIAN\r\n case 14: { const s = sorted(); const k = Math.round(extra ?? 0); // LARGE\r\n return k >= 1 && k <= s.length ? FormulaValue.number(s[s.length - k]!) : FormulaValue.errorNum; }\r\n case 15: { const s = sorted(); const k = Math.round(extra ?? 0); // SMALL\r\n return k >= 1 && k <= s.length ? FormulaValue.number(s[k - 1]!) : FormulaValue.errorNum; }\r\n default: return FormulaValue.errorValue;\r\n }\r\n}\r\n\r\nfunction subtotal(a: Args, c: Ctx): FormulaValue {\r\n const fnVal = a[0]!.evaluate(c);\r\n if (fnVal.isError) return fnVal;\r\n const raw = fnVal.tryAsDouble();\r\n if (!raw.ok) return FormulaValue.errorValue;\r\n const code = Math.round(raw.value);\r\n const excludeHidden = code >= 101 && code <= 111;\r\n const fn = excludeHidden ? code - 100 : code;\r\n if (fn < 1 || fn > 11) return FormulaValue.errorValue;\r\n\r\n const collected = collectValues(a, c, 1, {\r\n excludeHidden,\r\n nestedPattern: /^\\s*SUBTOTAL\\s*\\(/i,\r\n ignoreErrors: false,\r\n });\r\n if (!collected.ok) return collected.error;\r\n return applyAggregate(fn, collected.values);\r\n}\r\n\r\nfunction aggregate(a: Args, c: Ctx): FormulaValue {\r\n const fnVal = a[0]!.evaluate(c);\r\n if (fnVal.isError) return fnVal;\r\n const optVal = a[1]!.evaluate(c);\r\n if (optVal.isError) return optVal;\r\n const fnR = fnVal.tryAsDouble();\r\n const optR = optVal.tryAsDouble();\r\n if (!fnR.ok || !optR.ok) return FormulaValue.errorValue;\r\n\r\n const fn = Math.round(fnR.value);\r\n const option = Math.round(optR.value);\r\n if (fn < 1 || fn > 19) return FormulaValue.errorValue;\r\n\r\n // option: 0/1 ignore nested SUBTOTAL/AGGREGATE; 2/3 also ignore errors;\r\n // 4 nothing; 5 ignore hidden rows; 6 ignore errors; 7 ignore hidden + errors.\r\n const excludeHidden = option === 1 || option === 3 || option === 5 || option === 7;\r\n const ignoreErrors = option === 2 || option === 3 || option === 6 || option === 7;\r\n const ignoreNested = option <= 3 || option === 5 || option === 7;\r\n\r\n // LARGE(14)/SMALL(15) take a k argument as the last value argument.\r\n let extra: number | undefined;\r\n let endIdx = a.length;\r\n if (fn === 14 || fn === 15) {\r\n const kVal = a[a.length - 1]!.evaluate(c);\r\n const kR = kVal.tryAsDouble();\r\n if (!kR.ok) return FormulaValue.errorValue;\r\n extra = kR.value;\r\n endIdx = a.length - 1;\r\n }\r\n\r\n const collected = collectValues(a.slice(0, endIdx), c, 2, {\r\n excludeHidden,\r\n nestedPattern: ignoreNested ? /^\\s*(SUBTOTAL|AGGREGATE)\\s*\\(/i : null,\r\n ignoreErrors,\r\n });\r\n if (!collected.ok) return collected.error;\r\n return applyAggregate(fn, collected.values, extra);\r\n}\r\n","/**\r\n * Dynamic-array functions (Excel 365): TRANSPOSE, SEQUENCE, UNIQUE, SORT,\r\n * FILTER, MMULT, TEXTSPLIT, VSTACK, HSTACK, TOCOL, TOROW.\r\n *\r\n * Each returns a FormulaValue array; the recalc engine spills it across a block\r\n * of cells. In a bare evaluateFormula call (no recalc engine) the array is\r\n * returned as-is and callers may read its top-left with implicit intersection.\r\n */\r\nimport { FormulaValue, ArrayValue, FormulaError } from '../formula-value.js';\r\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\r\nimport type { FormulaNode } from '../formula-node.js';\r\nimport type { FormulaContext } from '../formula-context.js';\r\n\r\ntype Args = FormulaNode[];\r\ntype Ctx = FormulaContext;\r\n\r\nexport function registerArray(r: FunctionRegistry): void {\r\n r.register('TRANSPOSE', transpose, 1, 1);\r\n r.register('SEQUENCE', sequence, 1, 4);\r\n r.register('UNIQUE', unique, 1, 3);\r\n r.register('SORT', sort, 1, 4);\r\n r.register('SORTBY', sortBy, 2);\r\n r.register('FILTER', filter, 2, 3);\r\n r.register('MMULT', mmult, 2, 2);\r\n r.register('TEXTSPLIT', textSplit, 2, 6);\r\n r.register('VSTACK', vstack, 1);\r\n r.register('HSTACK', hstack, 1);\r\n r.register('TOCOL', toCol, 1, 3);\r\n r.register('TOROW', toRow, 1, 3);\r\n}\r\n\r\n/** Excel grid limits — guard against runaway allocations from bad formulas. */\r\nconst MAX_ROWS = 1048576;\r\nconst MAX_COLS = 16384;\r\n\r\nconst asArray = (v: FormulaValue): ArrayValue =>\r\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\r\n\r\nfunction fromRows(rows: FormulaValue[][]): FormulaValue {\r\n const nr = rows.length;\r\n const nc = nr > 0 ? rows[0]!.length : 0;\r\n const arr = new ArrayValue(nr, nc);\r\n for (let r = 0; r < nr; r++) for (let c = 0; c < nc; c++) arr.set(r, c, rows[r]![c]!);\r\n return FormulaValue.array(arr);\r\n}\r\n\r\nfunction toRows(arr: ArrayValue): FormulaValue[][] {\r\n const rows: FormulaValue[][] = [];\r\n for (let r = 0; r < arr.rows; r++) {\r\n const row: FormulaValue[] = [];\r\n for (let c = 0; c < arr.columns; c++) row.push(arr.get(r, c));\r\n rows.push(row);\r\n }\r\n return rows;\r\n}\r\n\r\nconst num = (a: Args, c: Ctx, i: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } => {\r\n if (i >= a.length) return { ok: true, n: dflt };\r\n const r = FormulaHelper.evalDouble(a[i]!, c);\r\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\r\n};\r\n\r\nfunction transpose(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c);\r\n if (v.isError) return v;\r\n return FormulaValue.array(asArray(v).transpose());\r\n}\r\n\r\nfunction sequence(a: Args, c: Ctx): FormulaValue {\r\n const rows = num(a, c, 0, 1); if (!rows.ok) return rows.e;\r\n const cols = num(a, c, 1, 1); if (!cols.ok) return cols.e;\r\n const start = num(a, c, 2, 1); if (!start.ok) return start.e;\r\n const step = num(a, c, 3, 1); if (!step.ok) return step.e;\r\n const R = Math.trunc(rows.n), C = Math.trunc(cols.n);\r\n if (R < 1 || C < 1) return FormulaValue.errorValue;\r\n const arr = new ArrayValue(R, C);\r\n for (let r = 0; r < R; r++) {\r\n for (let col = 0; col < C; col++) {\r\n arr.set(r, col, FormulaValue.number(start.n + (r * C + col) * step.n));\r\n }\r\n }\r\n return FormulaValue.array(arr);\r\n}\r\n\r\n/**\r\n * Canonical dedup key for one cell. Two cells that UNIQUE must treat as the same\r\n * yield the same string; distinct classes yield distinct strings. A kind prefix\r\n * prevents cross-type collisions (number 1 vs text \"1\" vs boolean TRUE).\r\n *\r\n * Deliberate deviations from FormulaValue.areEqual (which is a *comparison*\r\n * helper, not a dedup rule, and is not transitive):\r\n * • numbers use exact equality, not the 1e-10 fuzz — matches Excel UNIQUE and\r\n * restores transitivity (a fuzz-based key cannot have a canonical form);\r\n * • blank is its own class, never merged with 0 / \"\" / FALSE (Excel keeps an\r\n * empty cell and a 0 as distinct rows);\r\n * • errors dedupe by error code, so #N/A ≡ #N/A (areEqual returns false for\r\n * every error pair, which would leave error rows never deduplicated).\r\n */\r\nfunction cellKey(v: FormulaValue): string {\r\n switch (v.kind) {\r\n case 'number': return 'n' + (v.numberValue === 0 ? '0' : String(v.numberValue));\r\n case 'text': return 't' + v.textValue.toUpperCase(); // case-insensitive\r\n case 'boolean': return v.booleanValue ? 'b1' : 'b0';\r\n case 'blank': return 'B';\r\n case 'error': return 'e' + v.errorCode;\r\n default: return 'x'; // array/lambda never occur as a scalar cell\r\n }\r\n}\r\n\r\n/**\r\n * UNIQUE(array, [by_col], [exactly_once]).\r\n *\r\n * Single pass over the rows into a Map keyed by a canonical row key (length-\r\n * prefixed per cell so [\"a\",\"b\"] ≠ [\"ab\",\"\"]). O(n·k) time / O(u·k) memory\r\n * (u = distinct rows), replacing the previous O(n²·k) pairwise scan. Output\r\n * order follows first appearance; `exactly_once` filters on the per-key count\r\n * accumulated in the same pass — no second O(n²) counting sweep.\r\n */\r\nfunction unique(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c); if (v.isError) return v;\r\n const byCol = a.length > 1 ? a[1]!.evaluate(c).coerceToBool().booleanValue : false;\r\n const exactlyOnce = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\r\n\r\n const base = byCol ? asArray(v).transpose() : asArray(v);\r\n const map = new Map<string, { cells: FormulaValue[]; count: number }>();\r\n const order: string[] = [];\r\n for (let r = 0; r < base.rows; r++) {\r\n const cells: FormulaValue[] = new Array(base.columns);\r\n let key = '';\r\n for (let col = 0; col < base.columns; col++) {\r\n const cell = base.get(r, col);\r\n cells[col] = cell;\r\n const k = cellKey(cell);\r\n key += k.length + ':' + k;\r\n }\r\n const hit = map.get(key);\r\n if (hit) hit.count++;\r\n else { map.set(key, { cells, count: 1 }); order.push(key); }\r\n }\r\n\r\n const result: FormulaValue[][] = [];\r\n for (const key of order) {\r\n const e = map.get(key)!;\r\n if (exactlyOnce && e.count > 1) continue;\r\n result.push(e.cells);\r\n }\r\n if (result.length === 0) return FormulaValue.error(FormulaError.Calc);\r\n const out = fromRows(result);\r\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\r\n}\r\n\r\nfunction sort(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c); if (v.isError) return v;\r\n const sortIndex = num(a, c, 1, 1); if (!sortIndex.ok) return sortIndex.e;\r\n const sortOrder = num(a, c, 2, 1); if (!sortOrder.ok) return sortOrder.e;\r\n const byCol = a.length > 3 ? a[3]!.evaluate(c).coerceToBool().booleanValue : false;\r\n\r\n const base = byCol ? asArray(v).transpose() : asArray(v);\r\n const rows = toRows(base);\r\n const idx = Math.trunc(sortIndex.n) - 1;\r\n const dir = sortOrder.n < 0 ? -1 : 1;\r\n if (rows.length > 0 && (idx < 0 || idx >= rows[0]!.length)) return FormulaValue.errorValue;\r\n\r\n const sorted = rows\r\n .map((r, i) => ({ r, i }))\r\n .sort((x, y) => {\r\n const cmp = FormulaValue.compare(x.r[idx]!, y.r[idx]!) * dir;\r\n return cmp !== 0 ? cmp : x.i - y.i; // stable\r\n })\r\n .map(o => o.r);\r\n\r\n const out = fromRows(sorted);\r\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\r\n}\r\n\r\n/**\r\n * SORTBY(array, by_array1, [sort_order1], [by_array2, sort_order2], ...)\r\n *\r\n * Sorts `array` by one or more parallel key vectors without reordering `array`\r\n * itself in place: we sort a permutation of indices (O(n log n), stable) and\r\n * materialise the result once. Keys are read into flat vectors up front — only\r\n * the (small) key columns are copied, never the potentially large data array,\r\n * which keeps peak memory proportional to the keys plus a single output copy.\r\n */\r\nfunction sortBy(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c); if (v.isError) return v;\r\n const data = asArray(v);\r\n\r\n // Parse the trailing (by_array, [sort_order]) groups. sort_order is optional\r\n // per group; we treat a scalar-numeric argument following a key as its order.\r\n const keys: { vals: FormulaValue[]; dir: number }[] = [];\r\n let i = 1;\r\n while (i < a.length) {\r\n const byVal = a[i]!.evaluate(c); if (byVal.isError) return byVal;\r\n i++;\r\n let dir = 1;\r\n if (i < a.length) {\r\n const maybeOrder = a[i]!.evaluate(c);\r\n if (maybeOrder.isError) return maybeOrder;\r\n if (!maybeOrder.isArray && maybeOrder.isNumeric) {\r\n const d = maybeOrder.tryAsDouble();\r\n if (d.ok) { dir = d.value < 0 ? -1 : 1; i++; }\r\n }\r\n }\r\n keys.push({ vals: [...asArray(byVal).values()], dir });\r\n }\r\n if (keys.length === 0) return FormulaValue.errorValue;\r\n\r\n // Axis: keys aligned to rows sort rows; keys aligned to columns sort columns.\r\n const n = keys[0]!.vals.length;\r\n if (keys.some(k => k.vals.length !== n)) return FormulaValue.errorValue;\r\n const byRow = n === data.rows;\r\n const byColumn = !byRow && n === data.columns;\r\n if (!byRow && !byColumn) return FormulaValue.errorValue;\r\n\r\n const perm = Array.from({ length: n }, (_, k) => k);\r\n perm.sort((x, y) => {\r\n for (const key of keys) {\r\n const cmp = FormulaValue.compare(key.vals[x]!, key.vals[y]!) * key.dir;\r\n if (cmp !== 0) return cmp;\r\n }\r\n return x - y; // stable\r\n });\r\n\r\n const out = new ArrayValue(data.rows, data.columns);\r\n if (byRow) {\r\n for (let r = 0; r < data.rows; r++) {\r\n const src = perm[r]!;\r\n for (let col = 0; col < data.columns; col++) out.set(r, col, data.get(src, col));\r\n }\r\n } else {\r\n for (let col = 0; col < data.columns; col++) {\r\n const src = perm[col]!;\r\n for (let r = 0; r < data.rows; r++) out.set(r, col, data.get(r, src));\r\n }\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\nfunction filter(a: Args, c: Ctx): FormulaValue {\r\n const v = a[0]!.evaluate(c); if (v.isError) return v;\r\n const inc = a[1]!.evaluate(c); if (inc.isError) return inc;\r\n const arr = asArray(v);\r\n const incArr = asArray(inc);\r\n\r\n // include is a column mask (per row) or a row mask (per column).\r\n const perRow = incArr.rows === arr.rows && incArr.columns === 1;\r\n const perCol = incArr.columns === arr.columns && incArr.rows === 1;\r\n if (!perRow && !perCol) return FormulaValue.errorValue;\r\n\r\n const keptRows: FormulaValue[][] = [];\r\n if (perRow) {\r\n for (let r = 0; r < arr.rows; r++) {\r\n if (!incArr.get(r, 0).coerceToBool().booleanValue) continue;\r\n const row: FormulaValue[] = [];\r\n for (let col = 0; col < arr.columns; col++) row.push(arr.get(r, col));\r\n keptRows.push(row);\r\n }\r\n } else {\r\n // Keep columns; build rows from kept columns.\r\n const keepCols: number[] = [];\r\n for (let col = 0; col < arr.columns; col++) {\r\n if (incArr.get(0, col).coerceToBool().booleanValue) keepCols.push(col);\r\n }\r\n for (let r = 0; r < arr.rows; r++) {\r\n keptRows.push(keepCols.map(col => arr.get(r, col)));\r\n }\r\n if (keepCols.length === 0) keptRows.length = 0;\r\n }\r\n\r\n if (keptRows.length === 0 || (keptRows[0] && keptRows[0].length === 0)) {\r\n return a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.error(FormulaError.Calc);\r\n }\r\n return fromRows(keptRows);\r\n}\r\n\r\nfunction mmult(a: Args, c: Ctx): FormulaValue {\r\n const av = a[0]!.evaluate(c); if (av.isError) return av;\r\n const bv = a[1]!.evaluate(c); if (bv.isError) return bv;\r\n const A = asArray(av), B = asArray(bv);\r\n if (A.columns !== B.rows) return FormulaValue.errorValue;\r\n\r\n const out = new ArrayValue(A.rows, B.columns);\r\n for (let i = 0; i < A.rows; i++) {\r\n for (let j = 0; j < B.columns; j++) {\r\n let sum = 0;\r\n for (let k = 0; k < A.columns; k++) {\r\n const x = A.get(i, k).tryAsDouble();\r\n const y = B.get(k, j).tryAsDouble();\r\n if (!x.ok || !y.ok) return FormulaValue.errorValue;\r\n sum += x.value * y.value;\r\n }\r\n out.set(i, j, FormulaValue.number(sum));\r\n }\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\nfunction textSplit(a: Args, c: Ctx): FormulaValue {\r\n const t = FormulaHelper.evalString(a[0]!, c); if (!t.ok) return t.error;\r\n const colD = FormulaHelper.evalString(a[1]!, c); if (!colD.ok) return colD.error;\r\n let rowD = '';\r\n if (a.length > 2) {\r\n const rd = a[2]!.evaluate(c);\r\n if (rd.isError) return rd;\r\n if (!rd.isBlank) { const r = FormulaHelper.evalString(a[2]!, c); if (!r.ok) return r.error; rowD = r.value; }\r\n }\r\n\r\n const split = (s: string, d: string): string[] => (d === '' ? [s] : s.split(d));\r\n const lines = rowD ? split(t.value, rowD) : [t.value];\r\n const grid = lines.map(line => split(line, colD.value));\r\n const width = grid.reduce((m, r) => Math.max(m, r.length), 0);\r\n\r\n const rows: FormulaValue[][] = grid.map(r => {\r\n const row: FormulaValue[] = [];\r\n for (let i = 0; i < width; i++) row.push(FormulaValue.text(r[i] ?? ''));\r\n return row;\r\n });\r\n return fromRows(rows);\r\n}\r\n\r\n/**\r\n * VSTACK(array1, [array2], ...) — stack arrays vertically. The result width is\r\n * the widest input; shorter rows are padded with #N/A (Excel behaviour). Two\r\n * passes: size first, then copy element-by-element into a single output buffer\r\n * via `get`/`set` — inputs are never re-materialised, so peak memory is one\r\n * output array regardless of how large the inputs are.\r\n */\r\nfunction vstack(a: Args, c: Ctx): FormulaValue {\r\n // Errors are embedded as cell values (Excel behaviour), not propagated — a\r\n // downstream TOCOL(..,2) can then drop them.\r\n const parts: ArrayValue[] = [];\r\n let totalRows = 0, maxCols = 0;\r\n for (const node of a) {\r\n const arr = asArray(node.evaluate(c));\r\n parts.push(arr);\r\n totalRows += arr.rows;\r\n if (arr.columns > maxCols) maxCols = arr.columns;\r\n }\r\n if (totalRows > MAX_ROWS || maxCols > MAX_COLS) return FormulaValue.errorNum;\r\n\r\n const out = new ArrayValue(totalRows, maxCols);\r\n let rowOff = 0;\r\n for (const arr of parts) {\r\n for (let r = 0; r < arr.rows; r++) {\r\n for (let col = 0; col < maxCols; col++) {\r\n out.set(rowOff + r, col, col < arr.columns ? arr.get(r, col) : FormulaValue.errorNA);\r\n }\r\n }\r\n rowOff += arr.rows;\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\n/**\r\n * HSTACK(array1, [array2], ...) — stack arrays horizontally. Result height is\r\n * the tallest input; shorter columns are padded with #N/A.\r\n */\r\nfunction hstack(a: Args, c: Ctx): FormulaValue {\r\n const parts: ArrayValue[] = [];\r\n let totalCols = 0, maxRows = 0;\r\n for (const node of a) {\r\n const arr = asArray(node.evaluate(c));\r\n parts.push(arr);\r\n totalCols += arr.columns;\r\n if (arr.rows > maxRows) maxRows = arr.rows;\r\n }\r\n if (maxRows > MAX_ROWS || totalCols > MAX_COLS) return FormulaValue.errorNum;\r\n\r\n const out = new ArrayValue(maxRows, totalCols);\r\n let colOff = 0;\r\n for (const arr of parts) {\r\n for (let col = 0; col < arr.columns; col++) {\r\n for (let r = 0; r < maxRows; r++) {\r\n out.set(r, colOff + col, r < arr.rows ? arr.get(r, col) : FormulaValue.errorNA);\r\n }\r\n }\r\n colOff += arr.columns;\r\n }\r\n return FormulaValue.array(out);\r\n}\r\n\r\n/** Shared flatten for TOCOL/TOROW: walks the array in scan order, applying the\r\n * `ignore` filter, and returns the surviving values in order. Streams through\r\n * `get` without building an intermediate index array. */\r\nfunction flatten(a: Args, c: Ctx): { ok: true; values: FormulaValue[] } | { ok: false; e: FormulaValue } {\r\n const arr = asArray(a[0]!.evaluate(c));\r\n const ig = num(a, c, 1, 0); if (!ig.ok) return { ok: false, e: ig.e };\r\n const ignore = Math.trunc(ig.n); // bit 1 = skip blanks, bit 2 = skip errors\r\n const byCol = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\r\n\r\n const skip = (x: FormulaValue) =>\r\n (((ignore & 1) !== 0) && x.isBlank) || (((ignore & 2) !== 0) && x.isError);\r\n\r\n const values: FormulaValue[] = [];\r\n if (byCol) {\r\n for (let col = 0; col < arr.columns; col++)\r\n for (let r = 0; r < arr.rows; r++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\r\n } else {\r\n for (let r = 0; r < arr.rows; r++)\r\n for (let col = 0; col < arr.columns; col++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\r\n }\r\n return { ok: true, values };\r\n}\r\n\r\n/** TOCOL(array, [ignore], [scan_by_column]) — flatten to a single column. */\r\nfunction toCol(a: Args, c: Ctx): FormulaValue {\r\n const f = flatten(a, c); if (!f.ok) return f.e;\r\n if (f.values.length === 0) return FormulaValue.errorNA;\r\n const out = new ArrayValue(f.values.length, 1);\r\n for (let i = 0; i < f.values.length; i++) out.set(i, 0, f.values[i]!);\r\n return FormulaValue.array(out);\r\n}\r\n\r\n/** TOROW(array, [ignore], [scan_by_column]) — flatten to a single row. */\r\nfunction toRow(a: Args, c: Ctx): FormulaValue {\r\n const f = flatten(a, c); if (!f.ok) return f.e;\r\n if (f.values.length === 0) return FormulaValue.errorNA;\r\n const out = new ArrayValue(1, f.values.length);\r\n for (let i = 0; i < f.values.length; i++) out.set(0, i, f.values[i]!);\r\n return FormulaValue.array(out);\r\n}\r\n","/**\r\n * Central registry of all supported Excel functions.\r\n * Port of TVE.PureDocs.Excel.Formulas.FunctionRegistry (C#)\r\n */\r\nimport { FormulaValue } from './formula-value.js';\r\nimport type { FormulaNode } from './formula-node.js';\r\nimport type { FormulaContext } from './formula-context.js';\r\nimport { registerMath } from './functions/math-functions.js';\r\nimport { registerText } from './functions/text-functions.js';\r\nimport { registerLogical } from './functions/logical-functions.js';\r\nimport { registerDate } from './functions/date-functions.js';\r\nimport { registerLookup } from './functions/lookup-functions.js';\r\nimport { registerStatistical } from './functions/statistical-functions.js';\r\nimport { registerInfo } from './functions/info-functions.js';\r\nimport { registerFinance } from './functions/finance-functions.js';\r\nimport { registerMeta } from './functions/meta-functions.js';\r\nimport { registerAggregate } from './functions/aggregate-functions.js';\r\nimport { registerArray } from './functions/array-functions.js';\r\n\r\nexport type FormulaFunction = (args: FormulaNode[], ctx: FormulaContext) => FormulaValue;\r\n\r\nexport interface FunctionDef {\r\n readonly name: string;\r\n readonly minArgs: number;\r\n readonly maxArgs: number; // -1 = unlimited\r\n readonly isVolatile: boolean;\r\n readonly handler: FormulaFunction;\r\n}\r\n\r\nexport class FunctionRegistry {\r\n static #default: FunctionRegistry | undefined;\r\n\r\n /** Lazily-created default registry with all built-in functions registered. */\r\n static get default(): FunctionRegistry {\r\n if (!FunctionRegistry.#default) {\r\n FunctionRegistry.#default = new FunctionRegistry();\r\n FunctionRegistry.#default.#registerBuiltIns();\r\n }\r\n return FunctionRegistry.#default;\r\n }\r\n\r\n readonly #functions = new Map<string, FunctionDef>();\r\n\r\n /** Registers a function. Name is normalised to UPPERCASE. */\r\n register(\r\n name: string,\r\n handler: FormulaFunction,\r\n minArgs = 0,\r\n maxArgs = -1,\r\n isVolatile = false,\r\n ): void {\r\n this.#functions.set(name.toUpperCase(), {\r\n name: name.toUpperCase(), minArgs, maxArgs, isVolatile, handler,\r\n });\r\n }\r\n\r\n /** Executes a function by name with argument validation. */\r\n execute(name: string, args: FormulaNode[], ctx: FormulaContext): FormulaValue {\r\n const def = this.#functions.get(name.toUpperCase());\r\n if (!def) return FormulaValue.errorName;\r\n\r\n if (args.length < def.minArgs) return FormulaValue.errorValue;\r\n if (def.maxArgs >= 0 && args.length > def.maxArgs) return FormulaValue.errorValue;\r\n\r\n try {\r\n return def.handler(args, ctx);\r\n } catch {\r\n return FormulaValue.errorValue;\r\n }\r\n }\r\n\r\n /** Returns true if the named function is volatile (NOW, RAND, etc.). */\r\n isVolatile(name: string): boolean {\r\n return this.#functions.get(name.toUpperCase())?.isVolatile ?? false;\r\n }\r\n\r\n /** Returns true if the function is registered. */\r\n has(name: string): boolean {\r\n return this.#functions.has(name.toUpperCase());\r\n }\r\n\r\n #registerBuiltIns(): void {\r\n // Static imports keep registration synchronous and deterministic.\r\n // The circular import (registry ↔ function modules) is safe because the\r\n // register* bindings are only invoked here at call time, never during\r\n // module evaluation.\r\n registerMath(this);\r\n registerText(this);\r\n registerLogical(this);\r\n registerDate(this);\r\n registerLookup(this);\r\n registerStatistical(this);\r\n registerInfo(this);\r\n registerFinance(this);\r\n registerMeta(this);\r\n registerAggregate(this);\r\n registerArray(this);\r\n }\r\n}\r\n\r\n// ── FormulaHelper — shared utilities used by function implementations ─────────\r\n\r\nexport namespace FormulaHelper {\r\n /** Evaluates a node and coerces to number, propagating errors. */\r\n export function evalDouble(\r\n node: FormulaNode,\r\n ctx: FormulaContext,\r\n ): { ok: true; value: number } | { ok: false; error: FormulaValue } {\r\n const v = node.evaluate(ctx);\r\n if (v.isError) return { ok: false, error: v };\r\n const r = v.tryAsDouble();\r\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\r\n return { ok: true, value: r.value };\r\n }\r\n\r\n /** Evaluates a node and coerces to string, propagating errors. */\r\n export function evalString(\r\n node: FormulaNode,\r\n ctx: FormulaContext,\r\n ): { ok: true; value: string } | { ok: false; error: FormulaValue } {\r\n const v = node.evaluate(ctx);\r\n if (v.isError) return { ok: false, error: v };\r\n return { ok: true, value: v.asText() };\r\n }\r\n\r\n /**\r\n * Collects numbers from all args (expanding arrays, skipping blanks/text).\r\n * Returns false + error value if any arg is an error.\r\n */\r\n export function collectNumbers(\r\n args: FormulaNode[],\r\n ctx: FormulaContext,\r\n ): { ok: true; values: number[] } | { ok: false; error: FormulaValue } {\r\n const nums: number[] = [];\r\n for (const arg of args) {\r\n const v = arg.evaluate(ctx);\r\n if (v.isError) return { ok: false, error: v };\r\n if (v.isArray) {\r\n for (const item of v.arrayVal.values()) {\r\n if (item.isBlank || item.isText) continue;\r\n if (item.isError) return { ok: false, error: item };\r\n const r = item.tryAsDouble();\r\n if (r.ok) nums.push(r.value);\r\n }\r\n } else if (!v.isBlank && !v.isText) {\r\n const r = v.tryAsDouble();\r\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\r\n nums.push(r.value);\r\n }\r\n }\r\n return { ok: true, values: nums };\r\n }\r\n\r\n /** Flattens all args into FormulaValue array (expanding arrays). */\r\n export function flattenArgs(\r\n args: FormulaNode[],\r\n ctx: FormulaContext,\r\n ): FormulaValue[] {\r\n const result: FormulaValue[] = [];\r\n for (const arg of args) {\r\n const v = arg.evaluate(ctx);\r\n if (v.isArray) {\r\n for (const item of v.arrayVal.values()) result.push(item);\r\n } else {\r\n result.push(v);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Matches a criteria string (e.g. \">5\", \"=hello\", \"*partial*\") against a value. */\r\n export function matchesCriteria(value: FormulaValue, criteria: string): boolean {\r\n criteria = criteria.trim();\r\n\r\n // Comparison operator prefix\r\n const opMatch = /^(>=|<=|<>|>|<|=)(.*)$/.exec(criteria);\r\n if (opMatch) {\r\n const op = opMatch[1]!;\r\n const rhs = opMatch[2]!;\r\n const rhsVal = parseFloat(rhs);\r\n const rhsNum = isNaN(rhsVal) ? null : rhsVal;\r\n\r\n const cmp = rhsNum !== null\r\n ? FormulaValue.compare(value, FormulaValue.number(rhsNum))\r\n : FormulaValue.compare(value, FormulaValue.text(rhs));\r\n\r\n switch (op) {\r\n case '>': return cmp > 0;\r\n case '>=': return cmp >= 0;\r\n case '<': return cmp < 0;\r\n case '<=': return cmp <= 0;\r\n case '<>': return !FormulaValue.areEqual(value, rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs));\r\n case '=': return FormulaValue.areEqual(value, rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs));\r\n }\r\n }\r\n\r\n // Wildcard string matching\r\n if (criteria.includes('*') || criteria.includes('?')) {\r\n const pattern = wildcardToRegex(criteria);\r\n return pattern.test(value.asText());\r\n }\r\n\r\n // Exact match (case-insensitive for text)\r\n const num = parseFloat(criteria);\r\n if (!isNaN(num)) {\r\n return FormulaValue.areEqual(value, FormulaValue.number(num));\r\n }\r\n return value.asText().toUpperCase() === criteria.toUpperCase();\r\n }\r\n\r\n function wildcardToRegex(pattern: string): RegExp {\r\n const escaped = pattern\r\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\r\n .replace(/\\*/g, '.*')\r\n .replace(/\\?/g, '.');\r\n return new RegExp(`^${escaped}$`, 'i');\r\n }\r\n}\r\n","/**\r\n * Evaluation context — resolves cell/range values, dispatches functions.\r\n * Port of TVE.PureDocs.Excel.Formulas.FormulaContext (C#)\r\n */\r\nimport { parseCellRef, cellRefFromRowCol } from '@devmm/puredocs-excel';\r\nimport { FormulaValue, ArrayValue } from './formula-value.js';\r\nimport { FunctionRegistry } from './function-registry.js';\r\nimport type { FormulaNode } from './formula-node.js';\r\n\r\n// Forward declaration to avoid circular import\r\nexport interface WorksheetLike {\r\n getCellValue(reference: string): unknown;\r\n name: string;\r\n /** Optional: whether a 1-based row is hidden (used by SUBTOTAL/AGGREGATE). */\r\n isRowHidden?(row: number): boolean;\r\n /** Optional: formula text of a cell (used by SUBTOTAL to skip nested calls). */\r\n getCellFormula?(reference: string): string | null;\r\n /** Optional: spill range (e.g. \"A1:A3\") of a dynamic-array anchor, for A1#. */\r\n getSpillRange?(reference: string): string | null;\r\n}\r\n\r\nexport interface WorkbookLike {\r\n worksheets: readonly WorksheetLike[];\r\n getWorksheet(name: string): WorksheetLike;\r\n /**\r\n * Optional resolver for defined names (named ranges). Returns the refers-to\r\n * expression (without leading '='), following Excel scoping: a name scoped to\r\n * `sheetName` wins over the workbook-global name. When this method is absent\r\n * (or returns undefined), named-range references evaluate to #NAME?.\r\n *\r\n * @devmm/puredocs-excel's Workbook implements this.\r\n */\r\n getDefinedName?(name: string, sheetName?: string): string | undefined;\r\n}\r\n\r\nexport class FormulaContext {\r\n readonly #sheet: WorksheetLike;\r\n readonly #functions: FunctionRegistry;\r\n readonly #evaluating: Set<string>;\r\n\r\n /** Row of the formula cell (for @ implicit intersection). */\r\n formulaRow: number;\r\n /** Column of the formula cell (for @ implicit intersection). */\r\n formulaCol: number;\r\n\r\n /** Optional workbook reference for cross-sheet references. */\r\n workbook?: WorkbookLike;\r\n\r\n /**\r\n * Optional named-range resolver, installed by the evaluator when the workbook\r\n * exposes getDefinedName. Given a name, returns its evaluated value. Left\r\n * undefined when no resolver is available, in which case named ranges are\r\n * #NAME? (unchanged legacy behaviour).\r\n */\r\n nameResolver?: (name: string) => FormulaValue;\r\n\r\n /**\r\n * Shared recursion budget for LAMBDA calls, threaded across all contexts in a\r\n * single evaluation. Guards non-tail recursion (which grows the JS stack);\r\n * tail recursion is trampolined and does not count against it.\r\n */\r\n recursionGuard?: { depth: number; max: number };\r\n\r\n /**\r\n * Lexical scope stack for LET/LAMBDA local names. Each frame maps an\r\n * upper-cased local name to its value. Names resolve innermost-first and take\r\n * precedence over workbook defined names.\r\n */\r\n readonly #scopes: Array<Map<string, FormulaValue>> = [];\r\n\r\n /** Pushes a new binding frame (used by LET/LAMBDA). */\r\n pushScope(bindings: Map<string, FormulaValue>): void {\r\n this.#scopes.push(bindings);\r\n }\r\n\r\n /** Pops the innermost binding frame. */\r\n popScope(): void {\r\n this.#scopes.pop();\r\n }\r\n\r\n #lookupScope(name: string): FormulaValue | undefined {\r\n if (this.#scopes.length === 0) return undefined;\r\n const key = name.toUpperCase();\r\n for (let i = this.#scopes.length - 1; i >= 0; i--) {\r\n const v = this.#scopes[i]!.get(key);\r\n if (v !== undefined) return v;\r\n }\r\n return undefined;\r\n }\r\n\r\n constructor(\r\n sheet: WorksheetLike,\r\n formulaRow = 0,\r\n formulaCol = 0,\r\n evaluating?: Set<string>,\r\n registry?: FunctionRegistry,\r\n ) {\r\n this.#sheet = sheet;\r\n this.formulaRow = formulaRow;\r\n this.formulaCol = formulaCol;\r\n this.#evaluating = evaluating ?? new Set<string>();\r\n this.#functions = registry ?? FunctionRegistry.default;\r\n }\r\n\r\n get worksheet(): WorksheetLike { return this.#sheet; }\r\n\r\n // ── Cell/Range resolution ─────────────────────────────────────────────────\r\n\r\n getCellValue(cellReference: string): FormulaValue {\r\n const norm = cellReference.replace(/\\$/g, '').toUpperCase();\r\n\r\n // Circular reference detection\r\n if (this.#evaluating.has(norm)) return FormulaValue.errorRef;\r\n this.#evaluating.add(norm);\r\n\r\n try {\r\n const raw = this.#sheet.getCellValue(cellReference);\r\n return FormulaValue.fromObjectSync(raw);\r\n } finally {\r\n this.#evaluating.delete(norm);\r\n }\r\n }\r\n\r\n getRangeValues(startRef: string, endRef: string): FormulaValue {\r\n const s = parseCellRef(startRef);\r\n const e = parseCellRef(endRef);\r\n const rows = e.row - s.row + 1;\r\n const cols = e.column - s.column + 1;\r\n const arr = new ArrayValue(rows, cols);\r\n\r\n for (let r = 0; r < rows; r++) {\r\n for (let c = 0; c < cols; c++) {\r\n const ref = cellRefFromRowCol(s.row + r, s.column + c);\r\n arr.set(r, c, this.getCellValue(ref));\r\n }\r\n }\r\n return FormulaValue.array(arr);\r\n }\r\n\r\n getSheetCellValue(sheetName: string, cellReference: string): FormulaValue {\r\n if (!this.workbook) return FormulaValue.errorRef;\r\n try {\r\n const sheet = this.workbook.getWorksheet(sheetName);\r\n const ctx = new FormulaContext(sheet, this.formulaRow, this.formulaCol, this.#evaluating, this.#functions);\r\n ctx.workbook = this.workbook;\r\n return ctx.getCellValue(cellReference);\r\n } catch {\r\n return FormulaValue.errorRef;\r\n }\r\n }\r\n\r\n getSheetRangeValues(sheetName: string, startRef: string, endRef: string): FormulaValue {\r\n if (!this.workbook) return FormulaValue.errorRef;\r\n try {\r\n const sheet = this.workbook.getWorksheet(sheetName);\r\n const ctx = new FormulaContext(sheet, this.formulaRow, this.formulaCol, this.#evaluating, this.#functions);\r\n ctx.workbook = this.workbook;\r\n return ctx.getRangeValues(startRef, endRef);\r\n } catch {\r\n return FormulaValue.errorRef;\r\n }\r\n }\r\n\r\n resolveNamedRange(name: string): FormulaValue {\r\n // LET/LAMBDA locals shadow everything else.\r\n const scoped = this.#lookupScope(name);\r\n if (scoped !== undefined) return scoped;\r\n // Otherwise delegate to the evaluator-installed nameResolver, which looks\r\n // the name up on the workbook and evaluates its refers-to expression.\r\n // Absent a resolver, a named reference is #NAME? (legacy behaviour).\r\n return this.nameResolver ? this.nameResolver(name) : FormulaValue.errorName;\r\n }\r\n\r\n /**\r\n * Resolves a spill-range reference (A1#) to the array spilling from the anchor\r\n * cell. Requires the worksheet to expose getSpillRange; otherwise #REF!.\r\n */\r\n resolveSpillRange(anchorRef: string): FormulaValue {\r\n const spillRef = this.#sheet.getSpillRange?.(anchorRef);\r\n if (!spillRef) return FormulaValue.errorRef;\r\n const colon = spillRef.indexOf(':');\r\n if (colon < 0) return this.getCellValue(spillRef);\r\n return this.getRangeValues(spillRef.slice(0, colon), spillRef.slice(colon + 1));\r\n }\r\n\r\n getRangeBounds(startRef: string, endRef: string): { startRow: number; startCol: number; endRow: number; endCol: number } {\r\n const s = parseCellRef(startRef);\r\n const e = parseCellRef(endRef);\r\n return { startRow: s.row, startCol: s.column, endRow: e.row, endCol: e.column };\r\n }\r\n\r\n // ── Function dispatch ─────────────────────────────────────────────────────\r\n\r\n /** True if a built-in function with this name is registered. */\r\n hasFunction(name: string): boolean {\r\n return this.#functions.has(name);\r\n }\r\n\r\n evaluateFunction(name: string, args: FormulaNode[]): FormulaValue {\r\n // A call to an unregistered name may be a call to a named LAMBDA.\r\n if (!this.#functions.has(name)) {\r\n const named = this.resolveNamedRange(name);\r\n if (named.isLambda) {\r\n return named.lambdaVal.call(args.map(a => a.evaluate(this)));\r\n }\r\n }\r\n return this.#functions.execute(name, args, this);\r\n }\r\n}\r\n","/**\n * Least-Recently-Used cache using JavaScript Map insertion-order semantics.\n * Port of TVE.PureDocs.Excel.Formulas.LruCache<TKey, TValue> (C#)\n *\n * JS Map maintains insertion order, so LRU eviction is simply:\n * delete oldest key = map.keys().next().value\n * move to end = delete + re-insert\n *\n * This is simpler and faster than the C# LinkedList + Dictionary approach.\n */\nexport class LruCache<K, V> {\n readonly #map: Map<K, V>;\n #capacity: number;\n\n #hits = 0;\n #misses = 0;\n #evictions = 0;\n\n constructor(capacity: number) {\n if (capacity <= 0) throw new RangeError('LruCache capacity must be > 0.');\n this.#capacity = capacity;\n this.#map = new Map();\n }\n\n get capacity(): number { return this.#capacity; }\n get size(): number { return this.#map.size; }\n get hits(): number { return this.#hits; }\n get misses(): number { return this.#misses; }\n get evictions():number { return this.#evictions; }\n get hitRate(): number {\n const total = this.#hits + this.#misses;\n return total === 0 ? 0 : this.#hits / total;\n }\n\n /**\n * Returns the value for key, or undefined if not present.\n * Moves the accessed key to the \"most recently used\" end.\n */\n get(key: K): V | undefined {\n const value = this.#map.get(key);\n if (value === undefined) {\n this.#misses++;\n return undefined;\n }\n // Move to end (most recently used)\n this.#map.delete(key);\n this.#map.set(key, value);\n this.#hits++;\n return value;\n }\n\n /**\n * Inserts or updates a key-value pair.\n * Evicts the least-recently-used entry if over capacity.\n */\n set(key: K, value: V): void {\n if (this.#map.has(key)) {\n // Update: remove and re-insert to move to end\n this.#map.delete(key);\n } else if (this.#map.size >= this.#capacity) {\n // Evict oldest (first key in Map)\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n this.#map.set(key, value);\n }\n\n /** Removes a key from the cache. Returns true if it existed. */\n delete(key: K): boolean {\n return this.#map.delete(key);\n }\n\n /** Returns true if the key is present (does NOT update LRU order). */\n has(key: K): boolean {\n return this.#map.has(key);\n }\n\n /** Removes all entries and resets statistics. */\n clear(): void {\n this.#map.clear();\n this.#hits = this.#misses = this.#evictions = 0;\n }\n\n /** Resizes the cache, evicting oldest entries if necessary. */\n resize(newCapacity: number): void {\n if (newCapacity <= 0) throw new RangeError('Capacity must be > 0.');\n this.#capacity = newCapacity;\n while (this.#map.size > newCapacity) {\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n }\n}\n","/**\n * Main entry point for formula evaluation.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaEvaluator (C#)\n *\n * Includes LRU cache for parsed ASTs to avoid re-parsing identical formulas.\n */\nimport { FormulaLexer } from './formula-lexer.js';\nimport { FormulaParser } from './formula-parser.js';\nimport { FormulaContext, type WorksheetLike, type WorkbookLike } from './formula-context.js';\nimport { FormulaValue } from './formula-value.js';\nimport { LruCache } from './lru-cache.js';\nimport type { FormulaNode } from './formula-node.js';\n\nconst DEFAULT_CACHE_CAPACITY = 10_000;\n\n// Global AST cache shared across all evaluations (formula text → AST)\nconst astCache = new LruCache<string, FormulaNode>(DEFAULT_CACHE_CAPACITY);\n\n/**\n * Parses a formula string to an AST, with LRU caching.\n */\nexport function parseFormula(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const cached = astCache.get(stripped);\n if (cached !== undefined) return cached;\n\n const lexer = new FormulaLexer(stripped);\n const tokens = lexer.tokenize();\n const ast = new FormulaParser(tokens).parse();\n\n astCache.set(stripped, ast);\n return ast;\n}\n\n/** Default cap on non-tail LAMBDA recursion depth (JS stack safety). */\nconst DEFAULT_LAMBDA_DEPTH = 1024;\n\ninterface BuildContextOptions {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n /** Shared cell-evaluation guard (circular cell reference detection). */\n evaluating?: Set<string>;\n /** Shared named-range-resolution guard (circular name detection). */\n resolvingNames?: Set<string>;\n /** Shared cache of resolved names within one top-level evaluation. */\n resolvedNames?: Map<string, FormulaValue>;\n /** Shared recursion budget for LAMBDA calls. */\n recursionGuard?: { depth: number; max: number };\n}\n\n/**\n * Builds a FormulaContext, wiring the named-range resolver when the workbook\n * exposes getDefinedName. The evaluation and name-resolution guard sets, the\n * resolved-name cache, and the recursion guard are threaded into child contexts.\n */\nfunction buildContext(sheet: WorksheetLike, opts: BuildContextOptions): FormulaContext {\n const evaluating = opts.evaluating ?? new Set<string>();\n const ctx = new FormulaContext(\n sheet,\n opts.formulaRow ?? 0,\n opts.formulaCol ?? 0,\n evaluating,\n );\n ctx.recursionGuard = opts.recursionGuard ?? { depth: 0, max: DEFAULT_LAMBDA_DEPTH };\n\n const wb = opts.workbook;\n if (wb) {\n ctx.workbook = wb;\n if (typeof wb.getDefinedName === 'function') {\n const resolving = opts.resolvingNames ?? new Set<string>();\n const resolved = opts.resolvedNames ?? new Map<string, FormulaValue>();\n const guard = ctx.recursionGuard;\n ctx.nameResolver = (name: string) =>\n resolveName(name, sheet, wb, evaluating, resolving, resolved, guard);\n }\n }\n return ctx;\n}\n\n/**\n * Resolves a named range by looking up its refers-to expression on the workbook\n * (scoped to the referencing sheet) and evaluating it. Results are cached per\n * top-level evaluation so recursive named lambdas don't re-parse each call, and\n * name→name cycles are guarded.\n */\nfunction resolveName(\n name: string,\n sheet: WorksheetLike,\n workbook: WorkbookLike,\n evaluating: Set<string>,\n resolving: Set<string>,\n resolved: Map<string, FormulaValue>,\n recursionGuard: { depth: number; max: number },\n): FormulaValue {\n const key = `${sheet.name}\u0000${name.toUpperCase()}`;\n const cached = resolved.get(key);\n if (cached !== undefined) return cached;\n\n if (resolving.has(key)) return FormulaValue.errorRef; // circular name definition\n const refersTo = workbook.getDefinedName!(name, sheet.name);\n if (refersTo == null || refersTo === '') return FormulaValue.errorName;\n\n resolving.add(key);\n try {\n const ast = parseFormula(refersTo);\n const ctx = buildContext(sheet, {\n workbook, evaluating, resolvingNames: resolving, resolvedNames: resolved, recursionGuard,\n });\n const value = ast.evaluate(ctx);\n // Cache only pure lambdas — they are stable closures. Other values may read\n // cells and are cheap to recompute; caching them risks subtle staleness.\n if (value.isLambda) resolved.set(key, value);\n return value;\n } catch {\n return FormulaValue.errorName;\n } finally {\n resolving.delete(key);\n }\n}\n\n/**\n * Evaluates a formula string against a worksheet.\n * Mirrors FormulaEvaluator.Evaluate() in C#.\n */\nexport function evaluateFormula(\n formula: string,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n },\n): FormulaValue {\n if (!formula) return FormulaValue.blank;\n\n try {\n const ast = parseFormula(formula);\n const ctx = buildContext(sheet, {\n workbook: options?.workbook,\n formulaRow: options?.formulaRow,\n formulaCol: options?.formulaCol,\n });\n return ast.evaluate(ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n// ── Cache management ──────────────────────────────────────────────────────────\n\nexport function clearAstCache(): void {\n astCache.clear();\n}\n\nexport function getAstCacheStats(): { size: number; hits: number; misses: number; hitRate: number } {\n return {\n size: astCache.size,\n hits: astCache.hits,\n misses: astCache.misses,\n hitRate: astCache.hitRate,\n };\n}\n\nexport function setAstCacheCapacity(capacity: number): void {\n astCache.resize(capacity);\n}\n","/**\r\n * Static precedent extraction from a parsed formula AST.\r\n *\r\n * Walks the AST and collects the cell/range references a formula reads\r\n * (its precedents), plus whether the formula is volatile (contains a volatile\r\n * function such as NOW/RAND/OFFSET/INDIRECT). The dependency graph is built\r\n * from these precedents; volatile formulas are always recalculated because\r\n * their real precedents cannot be known statically (e.g. INDIRECT/OFFSET\r\n * compute a reference at run time).\r\n */\r\nimport { parseCellRef } from '@devmm/puredocs-excel';\r\nimport { FunctionRegistry } from './function-registry.js';\r\nimport { parseFormula } from './formula-evaluator.js';\r\nimport {\r\n FormulaNode,\r\n CellReferenceNode,\r\n RangeReferenceNode,\r\n SheetCellReferenceNode,\r\n SheetRangeReferenceNode,\r\n NamedRangeNode,\r\n SpillReferenceNode,\r\n FunctionCallNode,\r\n BinaryOpNode,\r\n UnaryOpNode,\r\n ImplicitIntersectionNode,\r\n} from './formula-node.js';\r\n\r\n/** A rectangular precedent region on a specific sheet (1-based, inclusive). */\r\nexport interface PrecedentRef {\r\n /** Upper-cased sheet name. */\r\n readonly sheet: string;\r\n readonly startRow: number;\r\n readonly startCol: number;\r\n readonly endRow: number;\r\n readonly endCol: number;\r\n}\r\n\r\nexport interface ExtractResult {\r\n readonly refs: PrecedentRef[];\r\n readonly volatile: boolean;\r\n}\r\n\r\n/** Resolves a defined name to its refers-to expression, for name expansion. */\r\nexport type NameResolver = (name: string, sheet: string) => string | undefined;\r\n\r\n/**\r\n * Extracts the precedents and volatility of a formula AST.\r\n *\r\n * @param ast The parsed formula.\r\n * @param formulaSheet Upper-cased name of the sheet the formula lives on;\r\n * unqualified references resolve against it.\r\n * @param registry Function registry used to test volatility.\r\n * @param resolveName Optional resolver so NamedRangeNode precedents expand to\r\n * the references inside their refers-to expression.\r\n */\r\nexport function extractReferences(\r\n ast: FormulaNode,\r\n formulaSheet: string,\r\n registry: FunctionRegistry = FunctionRegistry.default,\r\n resolveName?: NameResolver,\r\n): ExtractResult {\r\n const refs: PrecedentRef[] = [];\r\n let volatile = false;\r\n const seenNames = new Set<string>();\r\n\r\n const cell = (sheet: string, ref: string): PrecedentRef => {\r\n const { row, column } = parseCellRef(ref);\r\n return { sheet: sheet.toUpperCase(), startRow: row, startCol: column, endRow: row, endCol: column };\r\n };\r\n const range = (sheet: string, startRef: string, endRef: string): PrecedentRef => {\r\n const s = parseCellRef(startRef);\r\n const e = parseCellRef(endRef);\r\n return {\r\n sheet: sheet.toUpperCase(),\r\n startRow: Math.min(s.row, e.row),\r\n startCol: Math.min(s.column, e.column),\r\n endRow: Math.max(s.row, e.row),\r\n endCol: Math.max(s.column, e.column),\r\n };\r\n };\r\n\r\n const walk = (node: FormulaNode): void => {\r\n if (node instanceof CellReferenceNode) {\r\n refs.push(cell(formulaSheet, node.reference));\r\n } else if (node instanceof RangeReferenceNode) {\r\n refs.push(range(formulaSheet, node.startRef, node.endRef));\r\n } else if (node instanceof SheetCellReferenceNode) {\r\n refs.push(cell(node.sheetName, node.cellReference));\r\n } else if (node instanceof SheetRangeReferenceNode) {\r\n refs.push(range(node.sheetName, node.startRef, node.endRef));\r\n } else if (node instanceof NamedRangeNode) {\r\n expandName(node.name);\r\n } else if (node instanceof SpillReferenceNode) {\r\n // A1# co-changes with its anchor; depending on the anchor cell suffices\r\n // to retrigger this formula whenever the spilling formula recomputes.\r\n refs.push(cell(formulaSheet, node.anchorRef));\r\n } else if (node instanceof FunctionCallNode) {\r\n if (registry.isVolatile(node.functionName)) volatile = true;\r\n for (const arg of node.args) walk(arg);\r\n } else if (node instanceof BinaryOpNode) {\r\n walk(node.left);\r\n walk(node.right);\r\n } else if (node instanceof UnaryOpNode) {\r\n walk(node.operand);\r\n } else if (node instanceof ImplicitIntersectionNode) {\r\n walk(node.inner);\r\n }\r\n // Literal nodes have no precedents.\r\n };\r\n\r\n const expandName = (name: string): void => {\r\n if (!resolveName) return;\r\n const key = name.toUpperCase();\r\n if (seenNames.has(key)) return; // guard against name → name cycles\r\n seenNames.add(key);\r\n const refersTo = resolveName(name, formulaSheet);\r\n if (!refersTo) return;\r\n try {\r\n walk(parseFormula(refersTo));\r\n } catch {\r\n /* ignore unparseable refers-to */\r\n }\r\n };\r\n\r\n walk(ast);\r\n return { refs, volatile };\r\n}\r\n\r\n/** True if the 1-based cell (sheet,row,col) falls inside a precedent region. */\r\nexport function refContains(ref: PrecedentRef, sheet: string, row: number, col: number): boolean {\r\n return (\r\n ref.sheet === sheet &&\r\n row >= ref.startRow && row <= ref.endRow &&\r\n col >= ref.startCol && col <= ref.endCol\r\n );\r\n}\r\n","/**\r\n * Workbook-level recalculation engine: dependency graph + topological recalc.\r\n *\r\n * The formula evaluator (evaluateFormula) is a pure function — it computes one\r\n * formula and reads precedent values from the model, but it does not track which\r\n * cells depend on which, nor write results back. This engine is the missing\r\n * stateful layer:\r\n *\r\n * 1. Register formulas with setCellFormula(); their precedents are extracted\r\n * from the AST (see recalc-references.ts).\r\n * 2. When an input cell changes, only the dependent formulas are recomputed,\r\n * in dependency (topological) order, and written back to the model.\r\n * 3. Volatile formulas (NOW/RAND/OFFSET/INDIRECT/…) are always recomputed,\r\n * since their true precedents cannot be known statically.\r\n * 4. Circular references are detected at the graph level and marked #REF!.\r\n *\r\n * The engine talks to storage through the small RecalcModel interface, so it is\r\n * independent of the core Workbook class (though it adapts to one trivially).\r\n */\r\nimport { parseCellRef, cellRefFromRowCol } from '@devmm/puredocs-excel';\r\nimport { FormulaValue, FormulaError } from './formula-value.js';\r\nimport { FunctionRegistry } from './function-registry.js';\r\nimport { evaluateFormula, parseFormula } from './formula-evaluator.js';\r\nimport type { WorksheetLike, WorkbookLike } from './formula-context.js';\r\nimport { extractReferences, refContains, type PrecedentRef } from './recalc-references.js';\r\n\r\n// ── Core Workbook adapter ──────────────────────────────────────────────────────\r\n\r\ninterface CoreCellLike {\r\n setComputedValue(value: unknown): unknown;\r\n setFormula(formula: string): unknown;\r\n setArrayRef(spillRef: string | null): unknown;\r\n clear(): void;\r\n}\r\ninterface CoreSheetLike {\r\n getCellValue(ref: string): unknown;\r\n getCell(ref: string): CoreCellLike;\r\n getCellFormula?(ref: string): string | null;\r\n getSpillRange?(ref: string): string | null;\r\n isRowHidden?(row: number): boolean;\r\n}\r\ninterface CoreWorkbookLike {\r\n getWorksheet(name: string): CoreSheetLike;\r\n getDefinedName(name: string, sheet?: string): string | undefined;\r\n}\r\n\r\n/**\r\n * Adapts a @devmm/puredocs-excel Workbook to a RecalcModel so the engine can\r\n * read cell values and write computed results back into the document (via\r\n * Cell.setComputedValue, which preserves the formula). Named ranges defined on\r\n * the workbook are resolved automatically.\r\n */\r\nexport function createWorkbookRecalcModel(workbook: CoreWorkbookLike): RecalcModel {\r\n return {\r\n getCellValue: (sheet, ref) => workbook.getWorksheet(sheet).getCellValue(ref),\r\n setCellValue: (sheet, ref, value) => { workbook.getWorksheet(sheet).getCell(ref).setComputedValue(value); },\r\n setCellFormula: (sheet, ref, formula) => { workbook.getWorksheet(sheet).getCell(ref).setFormula(formula); },\r\n clearCell: (sheet, ref) => { workbook.getWorksheet(sheet).getCell(ref).clear(); },\r\n setCellArrayRef: (sheet, ref, spillRef) => { workbook.getWorksheet(sheet).getCell(ref).setArrayRef(spillRef); },\r\n getCellFormula: (sheet, ref) => workbook.getWorksheet(sheet).getCellFormula?.(ref) ?? null,\r\n getSpillRange: (sheet, ref) => workbook.getWorksheet(sheet).getSpillRange?.(ref) ?? null,\r\n isRowHidden: (sheet, row) => workbook.getWorksheet(sheet).isRowHidden?.(row) ?? false,\r\n getDefinedName: (name, sheet) => workbook.getDefinedName(name, sheet),\r\n };\r\n}\r\n\r\n/** Minimal storage abstraction the engine reads inputs from and writes results to. */\r\nexport interface RecalcModel {\r\n /** Current value of a cell (raw input value, or last computed value). */\r\n getCellValue(sheet: string, ref: string): unknown;\r\n /** Store a computed formula result. Must NOT clear the cell's formula. */\r\n setCellValue(sheet: string, ref: string, value: unknown): void;\r\n /**\r\n * Optional: persist a formula string on a cell so it serialises with the\r\n * document. When present, the engine calls it from setCellFormula so the\r\n * model stays the source of truth for the formula text.\r\n */\r\n setCellFormula?(sheet: string, ref: string, formula: string): void;\r\n /** Optional: clear a cell (value + formula) — used by clearCellFormula. */\r\n clearCell?(sheet: string, ref: string): void;\r\n /** Optional: mark/unmark a cell as a dynamic-array anchor with its spill range. */\r\n setCellArrayRef?(sheet: string, ref: string, spillRef: string | null): void;\r\n /** Optional: formula text of a cell (lets SUBTOTAL skip nested calls). */\r\n getCellFormula?(sheet: string, ref: string): string | null;\r\n /** Optional: spill range of a dynamic-array anchor (enables A1#). */\r\n getSpillRange?(sheet: string, ref: string): string | null;\r\n /** Optional: whether a 1-based row is hidden (SUBTOTAL/AGGREGATE). */\r\n isRowHidden?(sheet: string, row: number): boolean;\r\n /** Optional defined-name resolver (enables named ranges in formulas). */\r\n getDefinedName?(name: string, sheet?: string): string | undefined;\r\n}\r\n\r\n/** One recomputed cell, in evaluation order. */\r\nexport interface RecalcResult {\r\n readonly sheet: string;\r\n readonly ref: string;\r\n /** The written JS value (null/number/string/boolean). For a dynamic array,\r\n * this is the anchor's top-left value. */\r\n readonly value: unknown;\r\n /** True when the cell is part of a circular reference. */\r\n readonly circular?: boolean;\r\n /** For a dynamic-array anchor: the spilled block size (rows × cols). */\r\n readonly spill?: { rows: number; cols: number };\r\n}\r\n\r\ninterface FormulaEntry {\r\n sheet: string; // upper-cased key (for graph/containment)\r\n sheetName: string; // original casing (for model I/O)\r\n ref: string; // normalised (no '$', upper-cased)\r\n row: number;\r\n col: number;\r\n formula: string; // without leading '='\r\n refs: PrecedentRef[];\r\n volatile: boolean;\r\n}\r\n\r\n/** A cell coordinate with its upper-cased sheet key. */\r\ninterface CellRC { sheet: string; row: number; col: number }\r\n\r\nconst normSheet = (s: string): string => s.toUpperCase();\r\nconst normRef = (r: string): string => r.replace(/\\$/g, '').toUpperCase();\r\nconst keyOf = (sheet: string, ref: string): string => `${normSheet(sheet)}!${normRef(ref)}`;\r\n\r\n/** Splits a \"SHEET!REF\" key back into its parts (sheet upper-cased). */\r\nfunction parseKey(key: string): { sheet: string; ref: string; row: number; col: number } {\r\n const bang = key.indexOf('!');\r\n const sheet = key.slice(0, bang);\r\n const ref = key.slice(bang + 1);\r\n const { row, column } = parseCellRef(ref);\r\n return { sheet, ref, row, col: column };\r\n}\r\n\r\nexport class RecalcEngine {\r\n readonly #model: RecalcModel;\r\n readonly #registry: FunctionRegistry;\r\n readonly #formulas = new Map<string, FormulaEntry>();\r\n /** upper-cased sheet key → original casing, for case-correct model I/O. */\r\n readonly #sheetNames = new Map<string, string>();\r\n /** anchor cellKey → set of spilled (non-anchor) cellKeys it currently owns. */\r\n readonly #spills = new Map<string, Set<string>>();\r\n /** spilled cellKey → the anchor cellKey that owns it. */\r\n readonly #spillOwner = new Map<string, string>();\r\n\r\n constructor(model: RecalcModel, registry: FunctionRegistry = FunctionRegistry.default) {\r\n this.#model = model;\r\n this.#registry = registry;\r\n }\r\n\r\n #rememberSheet(name: string): void {\r\n this.#sheetNames.set(normSheet(name), name);\r\n }\r\n\r\n // ── Registration ─────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Registers (or replaces) a formula for a cell and recalculates that cell and\r\n * everything downstream of it. Returns the recomputed cells in the order they\r\n * were evaluated. The leading '=' of the formula is optional.\r\n */\r\n setCellFormula(sheet: string, ref: string, formula: string): RecalcResult[] {\r\n if (!formula) throw new Error('Formula cannot be empty.');\r\n const text = formula.startsWith('=') ? formula.slice(1) : formula;\r\n const s = normSheet(sheet);\r\n const r = normRef(ref);\r\n const { row, column } = parseCellRef(r);\r\n\r\n const ast = parseFormula(text);\r\n const { refs, volatile } = extractReferences(\r\n ast,\r\n s,\r\n this.#registry,\r\n this.#model.getDefinedName ? (n, sh) => this.#model.getDefinedName!(n, sh) : undefined,\r\n );\r\n\r\n this.#rememberSheet(sheet);\r\n this.#formulas.set(keyOf(s, r), {\r\n sheet: s, sheetName: sheet, ref: r, row, col: column, formula: text, refs, volatile,\r\n });\r\n\r\n // Persist the formula text on the model (source of truth for serialisation)\r\n // before evaluating; the computed value is written back during recalc.\r\n this.#model.setCellFormula?.(sheet, r, text);\r\n\r\n // Recompute this cell and its dependents.\r\n return this.#recalcFrom([{ sheet: s, row, col: column }], keyOf(s, r));\r\n }\r\n\r\n /**\r\n * Removes a formula from a cell and recalculates its dependents (which may now\r\n * read a plain input value instead). Returns the recomputed dependent cells.\r\n */\r\n clearCellFormula(sheet: string, ref: string): RecalcResult[] {\r\n const s = normSheet(sheet);\r\n const r = normRef(ref);\r\n const existed = this.#formulas.delete(keyOf(s, r));\r\n if (!existed) return [];\r\n this.#model.clearCell?.(sheet, r);\r\n const { row, column } = parseCellRef(r);\r\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\r\n }\r\n\r\n /**\r\n * Writes a raw input value to a cell and recalculates every formula that\r\n * depends on it. Use this for non-formula edits so dependents stay current.\r\n */\r\n setCellValue(sheet: string, ref: string, value: unknown): RecalcResult[] {\r\n this.#rememberSheet(sheet);\r\n const s = normSheet(sheet);\r\n const r = normRef(ref);\r\n this.#model.setCellValue(sheet, r, value);\r\n const { row, column } = parseCellRef(r);\r\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\r\n }\r\n\r\n /**\r\n * Signals that a cell changed by some external means (the model was already\r\n * updated) and recalculates its dependents.\r\n */\r\n onCellChanged(sheet: string, ref: string): RecalcResult[] {\r\n this.#rememberSheet(sheet);\r\n const s = normSheet(sheet);\r\n const r = normRef(ref);\r\n const { row, column } = parseCellRef(r);\r\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\r\n }\r\n\r\n /** Recalculates every registered formula in dependency order. */\r\n recalcAll(): RecalcResult[] {\r\n return this.#evaluatePass([...this.#formulas.values()]).results;\r\n }\r\n\r\n /** The precedents recorded for a formula cell (mainly for tests/inspection). */\r\n getPrecedents(sheet: string, ref: string): readonly PrecedentRef[] {\r\n return this.#formulas.get(keyOf(sheet, ref))?.refs ?? [];\r\n }\r\n\r\n // ── Internals ────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Recomputes formulas affected by the given changed cells, to a fixpoint.\r\n *\r\n * A single topological pass is not enough once dynamic arrays exist: a\r\n * formula that spills changes cells the graph could not know about until the\r\n * array was computed, and those cells may have their own dependents. So we\r\n * evaluate a pass, collect every cell whose value actually changed (formula\r\n * outputs plus spilled/cleared cells), then recompute the dependents of those\r\n * cells, repeating until nothing new is affected (bounded for safety).\r\n */\r\n #recalcFrom(\r\n seeds: CellRC[],\r\n includeKey?: string,\r\n ): RecalcResult[] {\r\n const results: RecalcResult[] = [];\r\n const evaluated = new Set<string>();\r\n\r\n // First wave: dependents of the seed cells, plus volatiles, plus a\r\n // freshly-set formula cell.\r\n let pending = this.#dependentClosure(seeds, evaluated);\r\n for (const e of this.#formulas.values()) {\r\n if (e.volatile) pending.set(keyOf(e.sheet, e.ref), e);\r\n }\r\n if (includeKey) {\r\n const self = this.#formulas.get(includeKey);\r\n if (self) pending.set(includeKey, self);\r\n }\r\n\r\n let guard = 0;\r\n const maxIterations = this.#formulas.size + 8;\r\n while (pending.size > 0 && guard++ <= maxIterations) {\r\n const { results: passResults, changed } = this.#evaluatePass([...pending.values()]);\r\n results.push(...passResults);\r\n for (const k of pending.keys()) evaluated.add(k);\r\n pending = this.#dependentClosure(changed, evaluated);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /** Formula entries (not yet evaluated) whose precedents include one of the cells. */\r\n #dependentClosure(cells: CellRC[], evaluated: Set<string>): Map<string, FormulaEntry> {\r\n const out = new Map<string, FormulaEntry>();\r\n const queue: CellRC[] = [...cells];\r\n while (queue.length > 0) {\r\n const cell = queue.shift()!;\r\n for (const dep of this.#directDependents(cell)) {\r\n const k = keyOf(dep.sheet, dep.ref);\r\n if (out.has(k) || evaluated.has(k)) continue;\r\n out.set(k, dep);\r\n queue.push({ sheet: dep.sheet, row: dep.row, col: dep.col });\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n /** Formula entries whose precedents include the given cell. */\r\n #directDependents(cell: CellRC): FormulaEntry[] {\r\n const out: FormulaEntry[] = [];\r\n for (const e of this.#formulas.values()) {\r\n if (e.refs.some(ref => refContains(ref, cell.sheet, cell.row, cell.col))) out.push(e);\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Topologically sorts the given entries and evaluates them, writing results\r\n * (scalars or spilled arrays) back to the model. Returns the results and the\r\n * flat list of cells whose value changed. Entries left in a cycle are #REF!.\r\n */\r\n #evaluatePass(entries: FormulaEntry[]): { results: RecalcResult[]; changed: CellRC[] } {\r\n const inSet = new Map<string, FormulaEntry>();\r\n for (const e of entries) inSet.set(keyOf(e.sheet, e.ref), e);\r\n\r\n // Build edges precedent → dependent (only among entries in this pass).\r\n const indegree = new Map<string, number>();\r\n const dependents = new Map<string, string[]>();\r\n for (const k of inSet.keys()) { indegree.set(k, 0); dependents.set(k, []); }\r\n\r\n for (const e of entries) {\r\n const depKey = keyOf(e.sheet, e.ref);\r\n for (const [pk, pe] of inSet) {\r\n if (pk === depKey) continue;\r\n if (e.refs.some(ref => refContains(ref, pe.sheet, pe.row, pe.col))) {\r\n dependents.get(pk)!.push(depKey);\r\n indegree.set(depKey, indegree.get(depKey)! + 1);\r\n }\r\n }\r\n }\r\n\r\n // Kahn topological sort.\r\n const ready: string[] = [];\r\n for (const [k, d] of indegree) if (d === 0) ready.push(k);\r\n const order: string[] = [];\r\n while (ready.length > 0) {\r\n const k = ready.shift()!;\r\n order.push(k);\r\n for (const d of dependents.get(k)!) {\r\n indegree.set(d, indegree.get(d)! - 1);\r\n if (indegree.get(d) === 0) ready.push(d);\r\n }\r\n }\r\n\r\n const results: RecalcResult[] = [];\r\n const changed: CellRC[] = [];\r\n const emitted = new Set(order);\r\n\r\n for (const k of order) {\r\n const e = inSet.get(k)!;\r\n const { result, changed: c } = this.#writeResult(e);\r\n results.push(result);\r\n changed.push(...c);\r\n }\r\n\r\n // Anything not emitted is in a circular reference.\r\n for (const [k, e] of inSet) {\r\n if (emitted.has(k)) continue;\r\n this.#clearSpill(keyOf(e.sheet, e.ref), changed);\r\n const value = FormulaValue.errorRef.toObject();\r\n this.#model.setCellValue(e.sheetName, e.ref, value);\r\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\r\n results.push({ sheet: e.sheetName, ref: e.ref, value, circular: true });\r\n }\r\n\r\n return { results, changed };\r\n }\r\n\r\n /**\r\n * Evaluates one formula and writes its result. Scalars go to the anchor cell.\r\n * Arrays spill across a block anchored at the formula cell: on a collision\r\n * with existing content the anchor becomes #SPILL! and nothing spills; when\r\n * an array shrinks, previously-spilled cells it no longer covers are cleared.\r\n */\r\n #writeResult(e: FormulaEntry): { result: RecalcResult; changed: CellRC[] } {\r\n const anchorKey = keyOf(e.sheet, e.ref);\r\n const fv = this.#evaluateFormulaValue(e);\r\n const changed: CellRC[] = [];\r\n const prevSpill = this.#spills.get(anchorKey) ?? new Set<string>();\r\n\r\n if (!fv.isArray) {\r\n this.#clearSpill(anchorKey, changed);\r\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\r\n const value = fv.toObject();\r\n this.#model.setCellValue(e.sheetName, e.ref, value);\r\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\r\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\r\n }\r\n\r\n const arr = fv.arrayVal;\r\n const rows = arr.rows, cols = arr.columns;\r\n\r\n // Collision check for every non-anchor cell in the target block.\r\n let collides = false;\r\n for (let dr = 0; dr < rows && !collides; dr++) {\r\n for (let dc = 0; dc < cols && !collides; dc++) {\r\n if (dr === 0 && dc === 0) continue;\r\n const r = e.row + dr, c = e.col + dc;\r\n const cellKey = keyOf(e.sheet, cellRefFromRowCol(r, c));\r\n if (this.#isOccupied(cellKey, e.sheetName, cellRefFromRowCol(r, c), anchorKey, prevSpill)) {\r\n collides = true;\r\n }\r\n }\r\n }\r\n\r\n if (collides) {\r\n this.#clearSpill(anchorKey, changed);\r\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\r\n const value = FormulaValue.error(FormulaError.Spill).toObject(); // '#SPILL!'\r\n this.#model.setCellValue(e.sheetName, e.ref, value);\r\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\r\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\r\n }\r\n\r\n // Write the block; track newly-owned spill cells.\r\n const newSpill = new Set<string>();\r\n for (let dr = 0; dr < rows; dr++) {\r\n for (let dc = 0; dc < cols; dc++) {\r\n const r = e.row + dr, c = e.col + dc;\r\n const ref = cellRefFromRowCol(r, c);\r\n this.#model.setCellValue(e.sheetName, ref, arr.get(dr, dc).toObject());\r\n changed.push({ sheet: e.sheet, row: r, col: c });\r\n if (dr !== 0 || dc !== 0) {\r\n const cellKey = keyOf(e.sheet, ref);\r\n newSpill.add(cellKey);\r\n this.#spillOwner.set(cellKey, anchorKey);\r\n }\r\n }\r\n }\r\n\r\n // Clear previously-spilled cells no longer covered.\r\n for (const oldKey of prevSpill) {\r\n if (newSpill.has(oldKey)) continue;\r\n const cell = parseKey(oldKey);\r\n this.#model.setCellValue(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null);\r\n this.#spillOwner.delete(oldKey);\r\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\r\n }\r\n\r\n this.#spills.set(anchorKey, newSpill);\r\n // Mark the anchor as a dynamic-array formula spanning the written block.\r\n const spillRef = `${e.ref}:${cellRefFromRowCol(e.row + rows - 1, e.col + cols - 1)}`;\r\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, spillRef);\r\n return {\r\n result: { sheet: e.sheetName, ref: e.ref, value: arr.get(0, 0).toObject(), spill: { rows, cols } },\r\n changed,\r\n };\r\n }\r\n\r\n /** Whether a target cell already holds content that blocks a spill. */\r\n #isOccupied(\r\n cellKey: string,\r\n sheetName: string,\r\n ref: string,\r\n anchorKey: string,\r\n prevSpill: Set<string>,\r\n ): boolean {\r\n // Another formula living in the target block blocks the spill.\r\n if (this.#formulas.has(cellKey) && cellKey !== anchorKey) return true;\r\n // Owned by a different anchor's spill → collision.\r\n const owner = this.#spillOwner.get(cellKey);\r\n if (owner && owner !== anchorKey) return true;\r\n // Our own previous spill cell → free to reuse.\r\n if (prevSpill.has(cellKey)) return false;\r\n // A literal value already there → collision.\r\n const v = this.#model.getCellValue(sheetName, ref);\r\n return v !== null && v !== undefined && v !== '';\r\n }\r\n\r\n /** Clears an anchor's spilled cells (not the anchor itself) and forgets them. */\r\n #clearSpill(anchorKey: string, changed: CellRC[]): void {\r\n const spill = this.#spills.get(anchorKey);\r\n if (!spill) return;\r\n for (const cellKey of spill) {\r\n const cell = parseKey(cellKey);\r\n this.#model.setCellValue(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null);\r\n this.#spillOwner.delete(cellKey);\r\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\r\n }\r\n this.#spills.delete(anchorKey);\r\n }\r\n\r\n #evaluateFormulaValue(e: FormulaEntry): FormulaValue {\r\n const wb = this.#buildWorkbookLike();\r\n const ws = this.#sheetLike(e.sheetName);\r\n return evaluateFormula(e.formula, ws, {\r\n workbook: wb,\r\n formulaRow: e.row,\r\n formulaCol: e.col,\r\n });\r\n }\r\n\r\n #sheetLike(sheetName: string): WorksheetLike {\r\n return {\r\n name: sheetName,\r\n getCellValue: (ref: string) => this.#model.getCellValue(sheetName, ref),\r\n isRowHidden: this.#model.isRowHidden\r\n ? (row: number) => this.#model.isRowHidden!(sheetName, row)\r\n : undefined,\r\n getCellFormula: this.#model.getCellFormula\r\n ? (ref: string) => this.#model.getCellFormula!(sheetName, ref)\r\n : undefined,\r\n getSpillRange: this.#model.getSpillRange\r\n ? (ref: string) => this.#model.getSpillRange!(sheetName, ref)\r\n : undefined,\r\n };\r\n }\r\n\r\n #buildWorkbookLike(): WorkbookLike {\r\n const self = this;\r\n return {\r\n get worksheets(): readonly WorksheetLike[] {\r\n return [...self.#sheetNames.values()].map(n => self.#sheetLike(n));\r\n },\r\n getWorksheet: (name: string) => self.#sheetLike(name),\r\n getDefinedName: this.#model.getDefinedName\r\n ? (name: string, sheet?: string) => this.#model.getDefinedName!(name, sheet)\r\n : undefined,\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/formula-value.ts","../src/formula-token.ts","../src/formula-lexer.ts","../src/formula-node.ts","../src/formula-parser.ts","../src/functions/math-functions.ts","../src/functions/text-functions.ts","../src/functions/logical-functions.ts","../src/functions/date-functions.ts","../src/functions/lookup-functions.ts","../src/functions/statistical-functions.ts","../src/functions/info-functions.ts","../src/functions/finance-functions.ts","../src/functions/meta-functions.ts","../src/functions/aggregate-functions.ts","../src/functions/array-functions.ts","../src/function-registry.ts","../src/formula-context.ts","../src/lru-cache.ts","../src/formula-evaluator.ts","../src/recalc-references.ts","../src/dependency-index.ts","../src/recalc-engine.ts"],"names":["FormulaError","num","value","rows","columns","row","offset","TokenType","upper","BinaryOperator","UnaryOperator","left","right","ln","arg","_pos","len","count","code","mode","mid","out","best","column","sumSq","a","pv","fv","pmt","rate","nper","sum","days","cellRefFromRowCol","countA","variance","asArray","byCol","byRow","FormulaHelper","_functions","parseCellRef","resolveName","cellKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Discriminated union for formula values.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaValue (C# readonly struct)\n *\n * C# used a value-type struct with LayoutKind.Auto for zero-GC scalar values.\n * TypeScript/JS uses a class with static factory methods and cached singletons.\n * The tradeoff: objects vs structs — acceptable for JS runtimes.\n */\nimport { toOADate } from '@devmm/puredocs-excel';\n\nexport const enum FormulaError {\n None = 0,\n Null = 1,\n Div0 = 2,\n Value = 3,\n Ref = 4,\n Name = 5,\n Num = 6,\n NA = 7,\n Calc = 8,\n Spill = 9,\n}\n\nexport type FormulaValueKind = 'blank' | 'number' | 'text' | 'boolean' | 'error' | 'array' | 'lambda';\n\n/**\n * A callable value produced by LAMBDA. Kept as an opaque interface so\n * formula-value.ts stays decoupled from the AST/context modules.\n */\nexport interface LambdaLike {\n /** Number of declared parameters. */\n readonly arity: number;\n /** Invokes the lambda with the given argument values (runs to completion). */\n call(args: FormulaValue[]): FormulaValue;\n /**\n * Runs the lambda body ONCE in tail-aware mode. Returns either the final value\n * or a TailCall describing the next tail call, so a trampoline can iterate\n * without growing the JS stack. Optional; call() is the fallback.\n */\n step?(args: FormulaValue[]): FormulaValue | TailCall;\n}\n\n/**\n * A pending tail call produced by evaluating a node in tail position. The\n * trampoline in a lambda's call() loops on these instead of recursing.\n */\nexport class TailCall {\n constructor(readonly lambda: LambdaLike, readonly args: FormulaValue[]) {}\n}\n\nexport class FormulaValue {\n readonly kind: FormulaValueKind;\n /** Numeric payload (also used for boolean: 1=true, 0=false). */\n readonly #num: number;\n /** String, ArrayValue, or LambdaLike payload. */\n readonly #obj: string | ArrayValue | LambdaLike | undefined;\n readonly errorCode: FormulaError;\n\n private constructor(\n kind: FormulaValueKind,\n num = 0,\n obj?: string | ArrayValue | LambdaLike,\n errorCode: FormulaError = FormulaError.None,\n ) {\n this.kind = kind;\n this.#num = num;\n this.#obj = obj;\n this.errorCode = errorCode;\n }\n\n // ── Cached singletons ────────────────────────────────────────────────────\n\n static readonly blank = new FormulaValue('blank');\n static readonly zero = new FormulaValue('number', 0);\n static readonly one = new FormulaValue('number', 1);\n static readonly true_ = new FormulaValue('boolean', 1);\n static readonly false_ = new FormulaValue('boolean', 0);\n static readonly emptyString = new FormulaValue('text', 0, '');\n static readonly errorDiv0 = new FormulaValue('error', 0, undefined, FormulaError.Div0);\n static readonly errorValue = new FormulaValue('error', 0, undefined, FormulaError.Value);\n static readonly errorRef = new FormulaValue('error', 0, undefined, FormulaError.Ref);\n static readonly errorName = new FormulaValue('error', 0, undefined, FormulaError.Name);\n static readonly errorNA = new FormulaValue('error', 0, undefined, FormulaError.NA);\n static readonly errorNum = new FormulaValue('error', 0, undefined, FormulaError.Num);\n static readonly errorNull = new FormulaValue('error', 0, undefined, FormulaError.Null);\n\n // ── Static factories ─────────────────────────────────────────────────────\n\n static number(v: number): FormulaValue {\n if (v === 0) return FormulaValue.zero;\n if (v === 1) return FormulaValue.one;\n return new FormulaValue('number', v);\n }\n\n static text(v: string): FormulaValue {\n if (v === '') return FormulaValue.emptyString;\n return new FormulaValue('text', 0, v);\n }\n\n static boolean(v: boolean): FormulaValue {\n return v ? FormulaValue.true_ : FormulaValue.false_;\n }\n\n static error(e: FormulaError): FormulaValue {\n switch (e) {\n case FormulaError.Div0: return FormulaValue.errorDiv0;\n case FormulaError.Value: return FormulaValue.errorValue;\n case FormulaError.Ref: return FormulaValue.errorRef;\n case FormulaError.Name: return FormulaValue.errorName;\n case FormulaError.NA: return FormulaValue.errorNA;\n case FormulaError.Num: return FormulaValue.errorNum;\n case FormulaError.Null: return FormulaValue.errorNull;\n default: return new FormulaValue('error', 0, undefined, e);\n }\n }\n\n static array(a: ArrayValue): FormulaValue {\n return new FormulaValue('array', 0, a);\n }\n\n static lambda(fn: LambdaLike): FormulaValue {\n return new FormulaValue('lambda', 0, fn);\n }\n\n // ── Type checks ──────────────────────────────────────────────────────────\n\n get isBlank(): boolean { return this.kind === 'blank'; }\n get isNumber(): boolean { return this.kind === 'number'; }\n get isText(): boolean { return this.kind === 'text'; }\n get isBoolean(): boolean { return this.kind === 'boolean'; }\n get isError(): boolean { return this.kind === 'error'; }\n get isArray(): boolean { return this.kind === 'array'; }\n get isLambda(): boolean { return this.kind === 'lambda'; }\n get isNumeric(): boolean { return this.kind === 'number' || this.kind === 'boolean' || this.kind === 'blank'; }\n\n // ── Value accessors ──────────────────────────────────────────────────────\n\n get numberValue(): number { return this.#num; }\n get textValue(): string { return (this.#obj as string) ?? ''; }\n get booleanValue(): boolean { return this.#num !== 0; }\n get arrayVal(): ArrayValue { return (this.#obj as ArrayValue) ?? ArrayValue.empty; }\n get lambdaVal(): LambdaLike { return this.#obj as LambdaLike; }\n\n // ── Coercion (Excel semantics, no exceptions) ─────────────────────────────\n\n coerceToNumber(): FormulaValue {\n switch (this.kind) {\n case 'number': return this;\n case 'blank': return FormulaValue.zero;\n case 'boolean': return FormulaValue.number(this.#num);\n case 'error': return this;\n case 'text': {\n const n = parseFloat(this.textValue);\n return isNaN(n) ? FormulaValue.errorValue : FormulaValue.number(n);\n }\n default: return FormulaValue.errorValue;\n }\n }\n\n tryAsDouble(): { ok: true; value: number } | { ok: false } {\n switch (this.kind) {\n case 'number': return { ok: true, value: this.#num };\n case 'blank': return { ok: true, value: 0 };\n case 'boolean': return { ok: true, value: this.#num };\n case 'text': {\n const n = parseFloat(this.textValue);\n return isNaN(n) ? { ok: false } : { ok: true, value: n };\n }\n default: return { ok: false };\n }\n }\n\n coerceToBool(): FormulaValue {\n switch (this.kind) {\n case 'boolean': return this;\n case 'number': return FormulaValue.boolean(this.#num !== 0);\n case 'blank': return FormulaValue.false_;\n case 'error': return this;\n case 'text': {\n const u = this.textValue.toUpperCase();\n if (u === 'TRUE') return FormulaValue.true_;\n if (u === 'FALSE') return FormulaValue.false_;\n return FormulaValue.errorValue;\n }\n default: return FormulaValue.errorValue;\n }\n }\n\n asText(): string {\n switch (this.kind) {\n case 'text': return this.textValue;\n case 'number': return String(this.#num);\n case 'boolean': return this.#num !== 0 ? 'TRUE' : 'FALSE';\n case 'blank': return '';\n case 'error': return FormulaValue.errorToString(this.errorCode);\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\n default: return '';\n }\n }\n\n // ── Comparison (Excel semantics) ─────────────────────────────────────────\n\n static areEqual(a: FormulaValue, b: FormulaValue): boolean {\n if (a.isBlank && b.isBlank) return true;\n if (a.isBlank) {\n if (b.isNumber) return Math.abs(b.numberValue) < 1e-10;\n if (b.isText) return b.textValue === '';\n if (b.isBoolean) return !b.booleanValue;\n return false;\n }\n if (b.isBlank) return FormulaValue.areEqual(b, a);\n if (a.kind !== b.kind) return false;\n switch (a.kind) {\n case 'number': return Math.abs(a.#num - b.#num) < 1e-10;\n case 'boolean': return a.#num === b.#num;\n case 'text': return a.textValue.toUpperCase() === b.textValue.toUpperCase();\n default: return false;\n }\n }\n\n /** Excel-compatible sort order: Number/Blank < Text < Boolean. */\n static compare(a: FormulaValue, b: FormulaValue): number {\n const order = (v: FormulaValue) => v.kind === 'boolean' ? 2 : v.isText ? 1 : 0;\n const oa = order(a), ob = order(b);\n if (oa !== ob) return oa - ob;\n switch (oa) {\n case 0: return (a.isBlank ? 0 : a.numberValue) - (b.isBlank ? 0 : b.numberValue);\n case 1: return a.textValue.toUpperCase() < b.textValue.toUpperCase() ? -1 : a.textValue.toUpperCase() > b.textValue.toUpperCase() ? 1 : 0;\n case 2: return a.#num - b.#num;\n default: return 0;\n }\n }\n\n // ── Error helpers ─────────────────────────────────────────────────────────\n\n static errorToString(e: FormulaError): string {\n const map: Record<FormulaError, string> = {\n [FormulaError.None]: '',\n [FormulaError.Null]: '#NULL!',\n [FormulaError.Div0]: '#DIV/0!',\n [FormulaError.Value]: '#VALUE!',\n [FormulaError.Ref]: '#REF!',\n [FormulaError.Name]: '#NAME?',\n [FormulaError.Num]: '#NUM!',\n [FormulaError.NA]: '#N/A',\n [FormulaError.Calc]: '#CALC!',\n [FormulaError.Spill]: '#SPILL!',\n };\n return map[e] ?? '#ERROR!';\n }\n\n static errorFromString(s: string): FormulaError {\n const map: Record<string, FormulaError> = {\n '#NULL!': FormulaError.Null,\n '#DIV/0!': FormulaError.Div0,\n '#VALUE!': FormulaError.Value,\n '#REF!': FormulaError.Ref,\n '#NAME?': FormulaError.Name,\n '#NUM!': FormulaError.Num,\n '#N/A': FormulaError.NA,\n '#CALC!': FormulaError.Calc,\n '#SPILL!': FormulaError.Spill,\n };\n return map[s] ?? FormulaError.Value;\n }\n\n // ── JS interop ────────────────────────────────────────────────────────────\n\n static fromObjectSync(value: unknown): FormulaValue {\n if (value === null || value === undefined) return FormulaValue.blank;\n if (typeof value === 'number') return isNaN(value) ? FormulaValue.errorValue : FormulaValue.number(value);\n if (typeof value === 'boolean') return FormulaValue.boolean(value);\n if (typeof value === 'string') return value === '' ? FormulaValue.blank : FormulaValue.text(value);\n if (value instanceof Date) {\n return FormulaValue.number(toOADate(value));\n }\n return FormulaValue.text(String(value));\n }\n\n toObject(): unknown {\n switch (this.kind) {\n case 'number': return this.#num;\n case 'text': return this.textValue;\n case 'boolean': return this.booleanValue;\n case 'blank': return null;\n case 'error': return FormulaValue.errorToString(this.errorCode);\n case 'array': return this.arrayVal.toObjectArray();\n case 'lambda': return FormulaValue.errorToString(FormulaError.Calc);\n default: return null;\n }\n }\n\n toString(): string { return this.asText(); }\n}\n\n// ── ArrayValue ────────────────────────────────────────────────────────────────\n\n/**\n * 2D array value for formula results and range data.\n * Port of TVE.PureDocs.Excel.Formulas.ArrayValue (C#)\n */\nexport class ArrayValue {\n static readonly empty = new ArrayValue(0, 0);\n\n readonly #data: FormulaValue[];\n readonly rows: number;\n readonly columns: number;\n\n constructor(rows: number, columns: number) {\n this.rows = rows;\n this.columns = columns;\n this.#data = new Array<FormulaValue>(rows * columns).fill(FormulaValue.blank);\n }\n\n get length(): number { return this.#data.length; }\n\n get(row: number, col: number): FormulaValue {\n if (row < 0 || row >= this.rows || col < 0 || col >= this.columns) {\n return FormulaValue.errorRef;\n }\n return this.#data[row * this.columns + col]!;\n }\n\n set(row: number, col: number, value: FormulaValue): void {\n if (row >= 0 && row < this.rows && col >= 0 && col < this.columns) {\n this.#data[row * this.columns + col] = value;\n }\n }\n\n getFlat(index: number): FormulaValue {\n return index >= 0 && index < this.#data.length\n ? this.#data[index]!\n : FormulaValue.errorRef;\n }\n\n setFlat(index: number, value: FormulaValue): void {\n if (index >= 0 && index < this.#data.length) {\n this.#data[index] = value;\n }\n }\n\n /** Iterate all values in row-major order. */\n values(): Iterable<FormulaValue> { return this.#data; }\n\n toObjectArray(): unknown[] {\n return this.#data.map(v => v.toObject());\n }\n\n /** Create from a flat array (single column). */\n static fromFlat(values: FormulaValue[]): ArrayValue {\n const arr = new ArrayValue(values.length, 1);\n values.forEach((v, i) => arr.setFlat(i, v));\n return arr;\n }\n\n /** Create a 1×1 array wrapping a scalar value (for broadcasting). */\n static fromScalar(value: FormulaValue): ArrayValue {\n const arr = new ArrayValue(1, 1);\n arr.setFlat(0, value);\n return arr;\n }\n\n /** Element-wise broadcasting operation (mirrors ArrayValue.Broadcast in C#). */\n static broadcast(\n a: ArrayValue,\n b: ArrayValue,\n op: (av: FormulaValue, bv: FormulaValue) => FormulaValue,\n ): ArrayValue {\n const rows = Math.max(a.rows, b.rows);\n const cols = Math.max(a.columns, b.columns);\n\n // Validate compatibility\n if ((a.rows !== 1 && b.rows !== 1 && a.rows !== b.rows) ||\n (a.columns !== 1 && b.columns !== 1 && a.columns !== b.columns)) {\n const err = new ArrayValue(rows, cols);\n for (let i = 0; i < err.length; i++) err.setFlat(i, FormulaValue.errorValue);\n return err;\n }\n\n const result = new ArrayValue(rows, cols);\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const av = a.get(r < a.rows ? r : 0, c < a.columns ? c : 0);\n const bv = b.get(r < b.rows ? r : 0, c < b.columns ? c : 0);\n result.set(r, c, op(av, bv));\n }\n }\n return result;\n }\n\n /** Implicit intersection: reduce array to scalar based on formula position. */\n implicitIntersect(formulaRow: number, formulaCol: number, rangeStartRow: number, rangeStartCol: number): FormulaValue {\n if (this.rows === 1 && this.columns === 1) return this.get(0, 0);\n if (this.columns === 1) {\n const offset = formulaRow - rangeStartRow;\n return offset >= 0 && offset < this.rows ? this.get(offset, 0) : FormulaValue.errorValue;\n }\n if (this.rows === 1) {\n const offset = formulaCol - rangeStartCol;\n return offset >= 0 && offset < this.columns ? this.get(0, offset) : FormulaValue.errorValue;\n }\n const ro = formulaRow - rangeStartRow;\n const co = formulaCol - rangeStartCol;\n return ro >= 0 && ro < this.rows && co >= 0 && co < this.columns\n ? this.get(ro, co)\n : FormulaValue.errorValue;\n }\n\n transpose(): ArrayValue {\n const result = new ArrayValue(this.columns, this.rows);\n for (let r = 0; r < this.rows; r++) {\n for (let c = 0; c < this.columns; c++) {\n result.set(c, r, this.get(r, c));\n }\n }\n return result;\n }\n}\n","/**\n * Tokens produced by the formula lexer.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaToken + FormulaTokenType (C#)\n */\n\nexport const enum TokenType {\n Number,\n String,\n Boolean,\n CellReference,\n Colon,\n Function,\n LeftParen,\n RightParen,\n Comma,\n Plus,\n Minus,\n Multiply,\n Divide,\n Power,\n Percent,\n Ampersand,\n Equal,\n NotEqual,\n LessThan,\n LessThanOrEqual,\n GreaterThan,\n GreaterThanOrEqual,\n SheetReference,\n NamedRange,\n SpillReference,\n Exclamation,\n AtSign,\n ErrorLiteral,\n EOF,\n}\n\nexport interface Token {\n readonly type: TokenType;\n readonly value: string;\n readonly position: number;\n}\n\nexport function makeToken(type: TokenType, value: string, position: number): Token {\n return { type, value, position };\n}\n","/**\n * Tokenises an Excel formula string into a sequence of tokens.\n * Full port of TVE.PureDocs.Excel.Formulas.FormulaLexer (C#)\n *\n * Supports:\n * - String literals (\"hello\")\n * - Error literals (#N/A, #REF!, #VALUE!, etc.)\n * - Quoted sheet references ('My Sheet'!A1)\n * - Unquoted sheet references (Sheet1!A1)\n * - _xlfn. prefix stripping\n * - Cell references ($A$1, A1, AA123)\n * - Named ranges\n * - @ implicit intersection operator\n * - All standard operators\n */\nimport { Token, TokenType, makeToken } from './formula-token.js';\n\nexport class FormulaException extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'FormulaException';\n }\n}\n\nconst KNOWN_ERRORS = new Set([\n '#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A', '#CALC!', '#SPILL!',\n]);\n\nexport class FormulaLexer {\n readonly #formula: string;\n #pos = 0;\n\n constructor(formula: string) {\n if (!formula) throw new FormulaException('Formula cannot be empty.');\n this.#formula = formula;\n }\n\n tokenize(): Token[] {\n this.#pos = 0;\n const tokens: Token[] = [];\n\n while (this.#pos < this.#formula.length) {\n this.#skipWhitespace();\n if (this.#pos >= this.#formula.length) break;\n\n const token = this.#readNextToken();\n if (token) tokens.push(token);\n }\n\n tokens.push(makeToken(TokenType.EOF, '', this.#pos));\n return tokens;\n }\n\n // ── Private tokenisers ─────────────────────────────────────────────────────\n\n #readNextToken(): Token | null {\n const c = this.#formula[this.#pos]!;\n\n if (c === '\"') return this.#readString();\n if (c === '#') return this.#readErrorLiteral();\n if (c === \"'\") return this.#readQuotedSheetRef();\n\n if (c === '.' && this.#pos + 1 < this.#formula.length && /\\d/.test(this.#formula[this.#pos + 1]!)) {\n return this.#readNumber();\n }\n if (/\\d/.test(c)) return this.#readNumber();\n if (/[a-zA-Z_$]/.test(c)) return this.#readIdentifier();\n\n return this.#readOperator();\n }\n\n #readString(): Token {\n const start = this.#pos++;\n let value = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos];\n if (ch === '\"') {\n this.#pos++;\n if (this.#formula[this.#pos] === '\"') { value += '\"'; this.#pos++; }\n else return makeToken(TokenType.String, value, start);\n } else {\n value += ch;\n this.#pos++;\n }\n }\n throw new FormulaException(`Unterminated string at position ${start}.`);\n }\n\n #readErrorLiteral(): Token {\n const start = this.#pos;\n let raw = '#';\n this.#pos++;\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9/]/.test(ch) || ch === '!' || ch === '?') {\n raw += ch;\n this.#pos++;\n if (ch === '!' || ch === '?') break;\n } else break;\n }\n\n const upper = raw.toUpperCase();\n if (!KNOWN_ERRORS.has(upper)) {\n throw new FormulaException(`Unknown error literal \"${raw}\" at position ${start}.`);\n }\n return makeToken(TokenType.ErrorLiteral, upper, start);\n }\n\n #readQuotedSheetRef(): Token {\n const start = this.#pos++;\n let sheetName = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (ch === \"'\") {\n this.#pos++;\n if (this.#formula[this.#pos] === \"'\") { sheetName += \"'\"; this.#pos++; }\n else {\n if (this.#formula[this.#pos] !== '!') {\n throw new FormulaException(`Expected '!' after quoted sheet name at position ${start}.`);\n }\n this.#pos++; // skip !\n const cellRef = this.#readCellRefChars();\n return makeToken(TokenType.SheetReference, `${sheetName}!${cellRef}`, start);\n }\n } else {\n sheetName += ch;\n this.#pos++;\n }\n }\n throw new FormulaException(`Unterminated quoted sheet name at position ${start}.`);\n }\n\n #readNumber(): Token {\n const start = this.#pos;\n let raw = '';\n let hasDot = false;\n let hasE = false;\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/\\d/.test(ch)) { raw += ch; this.#pos++; }\n else if (ch === '.' && !hasDot && !hasE) { hasDot = true; raw += ch; this.#pos++; }\n else if ((ch === 'e' || ch === 'E') && !hasE && raw.length > 0) {\n hasE = true; raw += ch; this.#pos++;\n if (this.#formula[this.#pos] === '+' || this.#formula[this.#pos] === '-') {\n raw += this.#formula[this.#pos++];\n }\n } else break;\n }\n\n return makeToken(TokenType.Number, raw, start);\n }\n\n #readIdentifier(): Token {\n const start = this.#pos;\n let raw = '';\n\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9_$.]/.test(ch)) { raw += ch; this.#pos++; }\n else break;\n }\n\n // Strip _xlfn. prefix\n let upper = raw.toUpperCase();\n if (upper.startsWith('_XLFN.')) { raw = raw.slice(6); upper = upper.slice(6); }\n\n if (upper === 'TRUE') return makeToken(TokenType.Boolean, 'TRUE', start);\n if (upper === 'FALSE') return makeToken(TokenType.Boolean, 'FALSE', start);\n\n // Sheet reference: Identifier!CellRef\n if (this.#formula[this.#pos] === '!') {\n this.#pos++; // skip !\n const cellRef = this.#readCellRefChars();\n return makeToken(TokenType.SheetReference, `${raw}!${cellRef}`, start);\n }\n\n // Function: Identifier followed by (\n this.#skipWhitespace();\n if (this.#formula[this.#pos] === '(') {\n return makeToken(TokenType.Function, upper, start);\n }\n\n // Cell reference or named range\n const stripped = raw.replace(/\\$/g, '');\n if (isCellRef(stripped)) {\n // Spill-range operator: A1# refers to the array that spills from A1.\n if (this.#formula[this.#pos] === '#') {\n this.#pos++; // consume '#'\n return makeToken(TokenType.SpillReference, stripped, start);\n }\n return makeToken(TokenType.CellReference, stripped, start);\n }\n return makeToken(TokenType.NamedRange, raw, start);\n }\n\n #readCellRefChars(): string {\n let ref = '';\n while (this.#pos < this.#formula.length) {\n const ch = this.#formula[this.#pos]!;\n if (/[a-zA-Z0-9$]/.test(ch)) { ref += ch; this.#pos++; }\n else break;\n }\n return ref.replace(/\\$/g, '');\n }\n\n #readOperator(): Token {\n const start = this.#pos;\n const ch = this.#formula[this.#pos++]!;\n\n switch (ch) {\n case '(': return makeToken(TokenType.LeftParen, '(', start);\n case ')': return makeToken(TokenType.RightParen, ')', start);\n case ',': return makeToken(TokenType.Comma, ',', start);\n case ':': return makeToken(TokenType.Colon, ':', start);\n case '+': return makeToken(TokenType.Plus, '+', start);\n case '-': return makeToken(TokenType.Minus, '-', start);\n case '*': return makeToken(TokenType.Multiply, '*', start);\n case '/': return makeToken(TokenType.Divide, '/', start);\n case '^': return makeToken(TokenType.Power, '^', start);\n case '%': return makeToken(TokenType.Percent, '%', start);\n case '&': return makeToken(TokenType.Ampersand, '&', start);\n case '=': return makeToken(TokenType.Equal, '=', start);\n case '@': return makeToken(TokenType.AtSign, '@', start);\n case '!': return makeToken(TokenType.Exclamation,'!', start);\n case '<':\n if (this.#formula[this.#pos] === '>') { this.#pos++; return makeToken(TokenType.NotEqual, '<>', start); }\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.LessThanOrEqual, '<=', start); }\n return makeToken(TokenType.LessThan, '<', start);\n case '>':\n if (this.#formula[this.#pos] === '=') { this.#pos++; return makeToken(TokenType.GreaterThanOrEqual, '>=', start); }\n return makeToken(TokenType.GreaterThan, '>', start);\n default:\n throw new FormulaException(`Unexpected character '${ch}' at position ${start}.`);\n }\n }\n\n #skipWhitespace(): void {\n while (this.#pos < this.#formula.length && /\\s/.test(this.#formula[this.#pos]!)) {\n this.#pos++;\n }\n }\n}\n\nfunction isCellRef(s: string): boolean {\n if (s.length < 2) return false;\n let i = 0;\n while (i < s.length && /[a-zA-Z]/.test(s[i]!)) i++;\n if (i === 0 || i >= s.length) return false;\n while (i < s.length && /\\d/.test(s[i]!)) i++;\n return i === s.length;\n}\n","/**\n * AST node types for formula expressions.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaNode (C#)\n */\nimport { FormulaValue, FormulaError, ArrayValue, TailCall } from './formula-value.js';\nimport type { FormulaContext } from './formula-context.js';\n\n// ── Base ───────────────────────────────────────────────────────────────────\n\nexport abstract class FormulaNode {\n abstract evaluate(ctx: FormulaContext): FormulaValue;\n\n /**\n * Evaluates this node in tail position. Returns a TailCall when the node's\n * value is a call to a lambda in tail position (so the caller's trampoline can\n * iterate without growing the stack); otherwise the final value. The default\n * is a plain evaluate — only control-flow and call nodes override it.\n */\n evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n return this.evaluate(ctx);\n }\n}\n\n// ── Literals ───────────────────────────────────────────────────────────────\n\nexport class NumberNode extends FormulaNode {\n constructor(readonly value: number) { super(); }\n evaluate(): FormulaValue { return FormulaValue.number(this.value); }\n}\n\nexport class StringNode extends FormulaNode {\n constructor(readonly value: string) { super(); }\n evaluate(): FormulaValue { return FormulaValue.text(this.value); }\n}\n\nexport class BooleanNode extends FormulaNode {\n constructor(readonly value: boolean) { super(); }\n evaluate(): FormulaValue { return FormulaValue.boolean(this.value); }\n}\n\nexport class ErrorNode extends FormulaNode {\n constructor(readonly errorValue: FormulaValue) { super(); }\n evaluate(): FormulaValue { return this.errorValue; }\n}\n\n/** Represents an empty/omitted argument in a function call (e.g. IF(A1,,0)). */\nexport class BlankNode extends FormulaNode {\n evaluate(): FormulaValue { return FormulaValue.blank; }\n}\n\n// ── References ────────────────────────────────────────────────────────────\n\nexport class CellReferenceNode extends FormulaNode {\n constructor(readonly reference: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getCellValue(this.reference);\n }\n}\n\nexport class RangeReferenceNode extends FormulaNode {\n constructor(readonly startRef: string, readonly endRef: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getRangeValues(this.startRef, this.endRef);\n }\n}\n\nexport class SheetCellReferenceNode extends FormulaNode {\n constructor(readonly sheetName: string, readonly cellReference: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getSheetCellValue(this.sheetName, this.cellReference);\n }\n}\n\nexport class SheetRangeReferenceNode extends FormulaNode {\n constructor(\n readonly sheetName: string,\n readonly startRef: string,\n readonly endRef: string,\n ) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.getSheetRangeValues(this.sheetName, this.startRef, this.endRef);\n }\n}\n\nexport class NamedRangeNode extends FormulaNode {\n constructor(readonly name: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.resolveNamedRange(this.name);\n }\n}\n\n/** Spill-range reference (A1#): the array that spills from an anchor cell. */\nexport class SpillReferenceNode extends FormulaNode {\n constructor(readonly anchorRef: string) { super(); }\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.resolveSpillRange(this.anchorRef);\n }\n}\n\n// ── Operators ─────────────────────────────────────────────────────────────\n\nexport const enum BinaryOperator {\n Add, Subtract, Multiply, Divide, Power,\n Concatenate,\n Equal, NotEqual, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual,\n}\n\nexport const enum UnaryOperator {\n Negate, Plus, Percent,\n}\n\nexport class BinaryOpNode extends FormulaNode {\n constructor(\n readonly left: FormulaNode,\n readonly op: BinaryOperator,\n readonly right: FormulaNode,\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const l = this.left.evaluate(ctx);\n const r = this.right.evaluate(ctx);\n\n // Array broadcasting\n if (l.isArray || r.isArray) {\n const la = l.isArray ? l.arrayVal : ArrayValue.fromScalar(l);\n const ra = r.isArray ? r.arrayVal : ArrayValue.fromScalar(r);\n return FormulaValue.array(\n ArrayValue.broadcast(la, ra, (a, b) => this.#evalScalar(a, b)),\n );\n }\n\n return this.#evalScalar(l, r);\n }\n\n #evalScalar(l: FormulaValue, r: FormulaValue): FormulaValue {\n const op = this.op;\n\n // Comparisons\n if (op === BinaryOperator.Equal) return FormulaValue.boolean(FormulaValue.areEqual(l, r));\n if (op === BinaryOperator.NotEqual) return FormulaValue.boolean(!FormulaValue.areEqual(l, r));\n if (op === BinaryOperator.LessThan) return FormulaValue.boolean(FormulaValue.compare(l, r) < 0);\n if (op === BinaryOperator.LessThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) <= 0);\n if (op === BinaryOperator.GreaterThan) return FormulaValue.boolean(FormulaValue.compare(l, r) > 0);\n if (op === BinaryOperator.GreaterThanOrEqual) return FormulaValue.boolean(FormulaValue.compare(l, r) >= 0);\n\n // Concatenation\n if (op === BinaryOperator.Concatenate) {\n if (l.isError) return l;\n if (r.isError) return r;\n return FormulaValue.text(l.asText() + r.asText());\n }\n\n // Arithmetic — coerce to numbers\n const ln = l.coerceToNumber();\n if (ln.isError) return ln;\n const rn = r.coerceToNumber();\n if (rn.isError) return rn;\n\n const lv = ln.numberValue;\n const rv = rn.numberValue;\n\n switch (op) {\n case BinaryOperator.Add: return FormulaValue.number(lv + rv);\n case BinaryOperator.Subtract: return FormulaValue.number(lv - rv);\n case BinaryOperator.Multiply: return FormulaValue.number(lv * rv);\n case BinaryOperator.Divide:\n if (rv === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(lv / rv);\n case BinaryOperator.Power:\n return FormulaValue.number(Math.pow(lv, rv));\n default:\n return FormulaValue.errorValue;\n }\n }\n}\n\nexport class UnaryOpNode extends FormulaNode {\n constructor(readonly op: UnaryOperator, readonly operand: FormulaNode) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const val = this.operand.evaluate(ctx);\n\n if (this.op === UnaryOperator.Plus) {\n return val.coerceToNumber();\n }\n if (this.op === UnaryOperator.Negate) {\n const n = val.coerceToNumber();\n if (n.isError) return n;\n return FormulaValue.number(-n.numberValue);\n }\n if (this.op === UnaryOperator.Percent) {\n const n = val.coerceToNumber();\n if (n.isError) return n;\n return FormulaValue.number(n.numberValue / 100);\n }\n return FormulaValue.errorValue;\n }\n}\n\n/** @ implicit intersection operator (Excel 365). */\nexport class ImplicitIntersectionNode extends FormulaNode {\n constructor(readonly inner: FormulaNode) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const val = this.inner.evaluate(ctx);\n if (!val.isArray) return val;\n return val.arrayVal.implicitIntersect(ctx.formulaRow, ctx.formulaCol, 0, 0);\n }\n}\n\n// ── Function call ─────────────────────────────────────────────────────────\n\nexport class FunctionCallNode extends FormulaNode {\n constructor(\n readonly functionName: string,\n readonly args: FormulaNode[],\n ) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n return ctx.evaluateFunction(this.functionName, this.args);\n }\n\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n const name = this.functionName;\n const a = this.args;\n\n // Control-flow functions are tail-transparent: tail position flows into the\n // branch they select. Branch selection mirrors the handlers exactly.\n switch (name) {\n case 'IF': {\n const cond = a[0]!.evaluate(ctx);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n if (b.booleanValue) return a[1]!.evaluateTail(ctx);\n return a.length > 2 ? a[2]!.evaluateTail(ctx) : FormulaValue.false_;\n }\n case 'IFS': {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(ctx);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n if (b.booleanValue) return a[i + 1]!.evaluateTail(ctx);\n }\n return FormulaValue.errorNA;\n }\n case 'IFERROR': {\n const v = a[0]!.evaluate(ctx);\n return v.isError ? a[1]!.evaluateTail(ctx) : v;\n }\n case 'IFNA': {\n const v = a[0]!.evaluate(ctx);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluateTail(ctx) : v;\n }\n case 'LET': {\n if (a.length < 3 || a.length % 2 === 0) break;\n const bindings = new Map<string, FormulaValue>();\n ctx.pushScope(bindings);\n try {\n for (let i = 0; i < a.length - 1; i += 2) {\n const nn = a[i]!;\n if (!(nn instanceof NamedRangeNode)) return FormulaValue.errorValue;\n const val = a[i + 1]!.evaluate(ctx);\n if (val.isError) return val;\n bindings.set(nn.name.toUpperCase(), val);\n }\n // Args of any tail call are evaluated eagerly here (scope still in place).\n return a[a.length - 1]!.evaluateTail(ctx);\n } finally {\n ctx.popScope();\n }\n }\n }\n\n // A call to an unregistered name that resolves to a lambda is a tail call.\n if (!ctx.hasFunction(name)) {\n const named = ctx.resolveNamedRange(name);\n if (named.isLambda) {\n return new TailCall(named.lambdaVal, a.map(arg => arg.evaluate(ctx)));\n }\n }\n return this.evaluate(ctx);\n }\n}\n\n/**\n * Calls the value produced by an expression (e.g. an inline LAMBDA:\n * `LAMBDA(x,x+1)(5)`). The callee must evaluate to a lambda, else #VALUE!.\n */\nexport class CallNode extends FormulaNode {\n constructor(readonly callee: FormulaNode, readonly args: FormulaNode[]) { super(); }\n\n evaluate(ctx: FormulaContext): FormulaValue {\n const fn = this.callee.evaluate(ctx);\n if (fn.isError) return fn;\n if (!fn.isLambda) return FormulaValue.errorValue;\n return fn.lambdaVal.call(this.args.map(a => a.evaluate(ctx)));\n }\n\n override evaluateTail(ctx: FormulaContext): FormulaValue | TailCall {\n const fn = this.callee.evaluate(ctx);\n if (fn.isError) return fn;\n if (!fn.isLambda) return FormulaValue.errorValue;\n return new TailCall(fn.lambdaVal, this.args.map(a => a.evaluate(ctx)));\n }\n}\n","/**\n * Recursive descent parser converting formula tokens into an AST.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaParser (C#)\n *\n * Operator precedence (low → high):\n * Comparison: =, <>, <, <=, >, >=\n * Concatenation: &\n * Addition/Subtraction: +, -\n * Multiplication/Division: *, /\n * Unary: +, -, @ (prefix)\n * Power: ^ (right-associative)\n * Percent: % (postfix)\n * Primary: literals, refs, functions, parentheses\n */\nimport { Token, TokenType } from './formula-token.js';\nimport { FormulaException } from './formula-lexer.js';\nimport {\n FormulaNode, NumberNode, StringNode, BooleanNode, ErrorNode, BlankNode,\n CellReferenceNode, RangeReferenceNode, SheetCellReferenceNode, SheetRangeReferenceNode,\n NamedRangeNode, SpillReferenceNode, FunctionCallNode, CallNode,\n BinaryOpNode, BinaryOperator, UnaryOpNode, UnaryOperator,\n ImplicitIntersectionNode,\n} from './formula-node.js';\nimport { FormulaValue } from './formula-value.js';\n\nexport class FormulaParser {\n readonly #tokens: Token[];\n #pos = 0;\n\n constructor(tokens: Token[]) {\n this.#tokens = tokens;\n }\n\n parse(): FormulaNode {\n this.#pos = 0;\n const node = this.#parseComparison();\n if (this.#current.type !== TokenType.EOF) {\n throw new FormulaException(\n `Unexpected token '${this.#current.value}' at position ${this.#current.position}.`,\n );\n }\n return node;\n }\n\n // ── Token helpers ──────────────────────────────────────────────────────────\n\n get #current(): Token {\n return this.#tokens[this.#pos] ?? { type: TokenType.EOF, value: '', position: -1 };\n }\n\n #advance(): Token {\n const t = this.#current;\n this.#pos++;\n return t;\n }\n\n #expect(type: TokenType): Token {\n if (this.#current.type !== type) {\n throw new FormulaException(\n `Expected token type ${type} but got ${this.#current.type} ('${this.#current.value}') at position ${this.#current.position}.`,\n );\n }\n return this.#advance();\n }\n\n // ── Precedence levels ──────────────────────────────────────────────────────\n\n #parseComparison(): FormulaNode {\n let left = this.#parseConcatenation();\n while (true) {\n const op = comparisonOp(this.#current.type);\n if (op === null) break;\n this.#advance();\n left = new BinaryOpNode(left, op, this.#parseConcatenation());\n }\n return left;\n }\n\n #parseConcatenation(): FormulaNode {\n let left = this.#parseAddSub();\n while (this.#current.type === TokenType.Ampersand) {\n this.#advance();\n left = new BinaryOpNode(left, BinaryOperator.Concatenate, this.#parseAddSub());\n }\n return left;\n }\n\n #parseAddSub(): FormulaNode {\n let left = this.#parseMulDiv();\n while (true) {\n const t = this.#current.type;\n if (t !== TokenType.Plus && t !== TokenType.Minus) break;\n this.#advance();\n const op = t === TokenType.Plus ? BinaryOperator.Add : BinaryOperator.Subtract;\n left = new BinaryOpNode(left, op, this.#parseMulDiv());\n }\n return left;\n }\n\n #parseMulDiv(): FormulaNode {\n let left = this.#parseUnary();\n while (true) {\n const t = this.#current.type;\n if (t !== TokenType.Multiply && t !== TokenType.Divide) break;\n this.#advance();\n const op = t === TokenType.Multiply ? BinaryOperator.Multiply : BinaryOperator.Divide;\n left = new BinaryOpNode(left, op, this.#parseUnary());\n }\n return left;\n }\n\n #parseUnary(): FormulaNode {\n if (this.#current.type === TokenType.Minus) {\n this.#advance();\n return new UnaryOpNode(UnaryOperator.Negate, this.#parsePower());\n }\n if (this.#current.type === TokenType.Plus) {\n this.#advance();\n return new UnaryOpNode(UnaryOperator.Plus, this.#parsePower());\n }\n if (this.#current.type === TokenType.AtSign) {\n this.#advance();\n return new ImplicitIntersectionNode(this.#parsePower());\n }\n return this.#parsePower();\n }\n\n #parsePower(): FormulaNode {\n const left = this.#parsePercent();\n if (this.#current.type === TokenType.Power) {\n this.#advance();\n // Right-associative\n return new BinaryOpNode(left, BinaryOperator.Power, this.#parseUnary());\n }\n return left;\n }\n\n #parsePercent(): FormulaNode {\n let node = this.#parsePostfix();\n while (this.#current.type === TokenType.Percent) {\n this.#advance();\n node = new UnaryOpNode(UnaryOperator.Percent, node);\n }\n return node;\n }\n\n /** Handles postfix call syntax on an expression, e.g. LAMBDA(x,x+1)(5). */\n #parsePostfix(): FormulaNode {\n let node = this.#parsePrimary();\n while (this.#current.type === TokenType.LeftParen) {\n this.#advance(); // consume '('\n node = new CallNode(node, this.#parseArgList());\n }\n return node;\n }\n\n #parsePrimary(): FormulaNode {\n const token = this.#current;\n\n switch (token.type) {\n case TokenType.Number: {\n this.#advance();\n const n = parseFloat(token.value);\n if (isNaN(n)) throw new FormulaException(`Invalid number: ${token.value}`);\n return new NumberNode(n);\n }\n\n case TokenType.String:\n this.#advance();\n return new StringNode(token.value);\n\n case TokenType.Boolean:\n this.#advance();\n return new BooleanNode(token.value === 'TRUE');\n\n case TokenType.ErrorLiteral:\n this.#advance();\n return new ErrorNode(FormulaValue.error(FormulaValue.errorFromString(token.value)));\n\n case TokenType.CellReference: {\n this.#advance();\n // Check for range A1:B5\n if (this.#current.type === TokenType.Colon) {\n this.#advance();\n const end = this.#expect(TokenType.CellReference);\n return new RangeReferenceNode(token.value, end.value);\n }\n return new CellReferenceNode(token.value);\n }\n\n case TokenType.SheetReference: {\n this.#advance();\n const parts = token.value.split('!');\n const sheetName = parts[0]!;\n const cellRef = parts[1] ?? '';\n // Check for range Sheet1!A1:B5\n if (this.#current.type === TokenType.Colon) {\n this.#advance();\n const end = this.#expect(TokenType.CellReference);\n return new SheetRangeReferenceNode(sheetName, cellRef, end.value);\n }\n return new SheetCellReferenceNode(sheetName, cellRef);\n }\n\n case TokenType.NamedRange:\n this.#advance();\n return new NamedRangeNode(token.value);\n\n case TokenType.SpillReference:\n this.#advance();\n return new SpillReferenceNode(token.value);\n\n case TokenType.Function:\n return this.#parseFunction();\n\n case TokenType.LeftParen: {\n this.#advance();\n const expr = this.#parseComparison();\n this.#expect(TokenType.RightParen);\n return expr;\n }\n\n default:\n throw new FormulaException(\n `Unexpected token '${token.value}' (type ${token.type}) at position ${token.position}.`,\n );\n }\n }\n\n #parseFunction(): FormulaNode {\n const nameToken = this.#advance();\n this.#expect(TokenType.LeftParen);\n return new FunctionCallNode(nameToken.value.toUpperCase(), this.#parseArgList());\n }\n\n /** Parses a comma-separated argument list up to and including the ')'. */\n #parseArgList(): FormulaNode[] {\n const args: FormulaNode[] = [];\n\n if (this.#current.type !== TokenType.RightParen) {\n // First arg — may be blank if leading comma\n if (this.#current.type === TokenType.Comma) {\n args.push(new BlankNode());\n } else {\n args.push(this.#parseComparison());\n }\n\n while (this.#current.type === TokenType.Comma) {\n this.#advance(); // consume comma\n if (\n this.#current.type === TokenType.Comma ||\n this.#current.type === TokenType.RightParen\n ) {\n args.push(new BlankNode());\n } else {\n args.push(this.#parseComparison());\n }\n }\n }\n\n this.#expect(TokenType.RightParen);\n return args;\n }\n}\n\nfunction comparisonOp(type: TokenType): BinaryOperator | null {\n switch (type) {\n case TokenType.Equal: return BinaryOperator.Equal;\n case TokenType.NotEqual: return BinaryOperator.NotEqual;\n case TokenType.LessThan: return BinaryOperator.LessThan;\n case TokenType.LessThanOrEqual: return BinaryOperator.LessThanOrEqual;\n case TokenType.GreaterThan: return BinaryOperator.GreaterThan;\n case TokenType.GreaterThanOrEqual: return BinaryOperator.GreaterThanOrEqual;\n default: return null;\n }\n}\n","/**\n * Mathematical and aggregate Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.MathFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerMath(r: FunctionRegistry): void {\n r.register('SUM', sum, 1);\n r.register('AVERAGE', average, 1);\n r.register('MIN', min, 1);\n r.register('MAX', max, 1);\n r.register('COUNT', count, 1);\n r.register('COUNTA', countA, 1);\n r.register('COUNTBLANK', countBlank, 1, 1);\n r.register('COUNTIF', countIf, 2, 2);\n r.register('COUNTIFS', countIfs, 2);\n r.register('SUMIF', sumIf, 2, 3);\n r.register('SUMIFS', sumIfs, 3);\n r.register('AVERAGEIF', averageIf, 2, 3);\n r.register('AVERAGEIFS', averageIfs, 3);\n r.register('PRODUCT', product, 1);\n r.register('SUMPRODUCT', sumProduct, 1);\n r.register('SUMSQ', sumSq, 1);\n r.register('ABS', abs, 1, 1);\n r.register('ROUND', round, 2, 2);\n r.register('ROUNDUP', roundUp, 2, 2);\n r.register('ROUNDDOWN', roundDown, 2, 2);\n r.register('CEILING', ceiling, 2, 2);\n r.register('CEILING.MATH', ceiling, 2, 2);\n r.register('FLOOR', floor, 2, 2);\n r.register('FLOOR.MATH', floor, 2, 2);\n r.register('INT', int_, 1, 1);\n r.register('TRUNC', trunc, 1, 2);\n r.register('MOD', mod, 2, 2);\n r.register('QUOTIENT', quotient, 2, 2);\n r.register('POWER', power, 2, 2);\n r.register('SQRT', sqrt, 1, 1);\n r.register('SIGN', sign, 1, 1);\n r.register('PI', pi, 0, 0);\n r.register('RAND', rand, 0, 0, true);\n r.register('RANDBETWEEN', randBetween, 2, 2, true);\n r.register('LOG', log, 1, 2);\n r.register('LOG10', log10, 1, 1);\n r.register('LN', ln, 1, 1);\n r.register('EXP', exp, 1, 1);\n r.register('FACT', fact, 1, 1);\n r.register('COMBIN', combin, 2, 2);\n // Trigonometry\n r.register('SIN', unary(Math.sin), 1, 1);\n r.register('COS', unary(Math.cos), 1, 1);\n r.register('TAN', unary(Math.tan), 1, 1);\n r.register('ASIN', asin, 1, 1);\n r.register('ACOS', acos, 1, 1);\n r.register('ATAN', unary(Math.atan), 1, 1);\n r.register('ATAN2', atan2, 2, 2);\n r.register('SINH', unary(Math.sinh), 1, 1);\n r.register('COSH', unary(Math.cosh), 1, 1);\n r.register('TANH', unary(Math.tanh), 1, 1);\n r.register('DEGREES', unary(r2d => (r2d * 180) / Math.PI), 1, 1);\n r.register('RADIANS', unary(d => (d * Math.PI) / 180), 1, 1);\n}\n\n// ── Multi-criteria aggregates (SUMIFS/COUNTIFS/AVERAGEIFS) ────────────────────\n\n/** Value at flat index i of a value that may be a scalar or an array. */\nfunction valueAt(v: FormulaValue, i: number): FormulaValue {\n return v.isArray ? v.arrayVal.getFlat(i) : v;\n}\n\n/** Flat length of a value that may be a scalar or an array. */\nfunction lengthOf(v: FormulaValue): number {\n return v.isArray ? v.arrayVal.length : 1;\n}\n\n/**\n * Builds a boolean mask over `len` positions from criteria pairs\n * (criteria_range, criteria) starting at `startIdx`. A position stays set only\n * if every pair matches. Returns the first error encountered, if any.\n */\nfunction computeIfsMask(\n a: Args,\n c: Ctx,\n startIdx: number,\n len: number,\n): { ok: true; mask: Uint8Array } | { ok: false; error: FormulaValue } {\n const mask = new Uint8Array(len).fill(1);\n for (let p = startIdx; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c);\n if (cr.isError) return { ok: false, error: cr };\n const crit = a[p + 1]!.evaluate(c);\n if (crit.isError) return { ok: false, error: crit };\n const critText = crit.asText();\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n if (!FormulaHelper.matchesCriteria(valueAt(cr, i), critText)) mask[i] = 0;\n }\n }\n return { ok: true, mask };\n}\n\nfunction sumIfs(a: Args, c: Ctx): FormulaValue {\n // sum_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n const sumRange = a[0]!.evaluate(c);\n if (sumRange.isError) return sumRange;\n const len = lengthOf(sumRange);\n const m = computeIfsMask(a, c, 1, len);\n if (!m.ok) return m.error;\n\n let total = 0;\n for (let i = 0; i < len; i++) {\n if (!m.mask[i]) continue;\n const r = valueAt(sumRange, i).tryAsDouble();\n if (r.ok) total += r.value;\n }\n return FormulaValue.number(total);\n}\n\nfunction countIfs(a: Args, c: Ctx): FormulaValue {\n // (criteria_range, criteria)+ → 2k args (even, ≥ 2)\n if (a.length < 2 || a.length % 2 !== 0) return FormulaValue.errorValue;\n const first = a[0]!.evaluate(c);\n if (first.isError) return first;\n const len = lengthOf(first);\n const m = computeIfsMask(a, c, 0, len);\n if (!m.ok) return m.error;\n\n let n = 0;\n for (let i = 0; i < len; i++) if (m.mask[i]) n++;\n return FormulaValue.number(n);\n}\n\nfunction averageIfs(a: Args, c: Ctx): FormulaValue {\n // average_range, (criteria_range, criteria)+ → 1 + 2k args (odd, ≥ 3)\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n const avgRange = a[0]!.evaluate(c);\n if (avgRange.isError) return avgRange;\n const len = lengthOf(avgRange);\n const m = computeIfsMask(a, c, 1, len);\n if (!m.ok) return m.error;\n\n let total = 0, cnt = 0;\n for (let i = 0; i < len; i++) {\n if (!m.mask[i]) continue;\n const r = valueAt(avgRange, i).tryAsDouble();\n if (r.ok) { total += r.value; cnt++; }\n }\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\n}\n\nfunction sumSq(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((s, n) => s + n * n, 0));\n}\n\n// ── Trigonometry ─────────────────────────────────────────────────────────────\n\n/** Wraps a single-argument Math function into a formula handler. */\nfunction unary(fn: (x: number) => number): (a: Args, c: Ctx) => FormulaValue {\n return (a, c) => {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(fn(r.value)) : r.error;\n };\n}\n\nfunction asin(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.asin(r.value));\n}\n\nfunction acos(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < -1 || r.value > 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.acos(r.value));\n}\n\nfunction atan2(a: Args, c: Ctx): FormulaValue {\n // Excel ATAN2(x, y) — note the reversed argument order vs Math.atan2(y, x).\n const x = FormulaHelper.evalDouble(a[0]!, c);\n if (!x.ok) return x.error;\n const y = FormulaHelper.evalDouble(a[1]!, c);\n if (!y.ok) return y.error;\n if (x.value === 0 && y.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.atan2(y.value, x.value));\n}\n\n// ── Aggregates ─────────────────────────────────────────────────────────────\n\nfunction sum(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0));\n}\n\nfunction average(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(r.values.reduce((s, n) => s + n, 0) / r.values.length);\n}\n\nfunction min(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.min(...r.values));\n}\n\nfunction max(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return r.values.length === 0 ? FormulaValue.zero : FormulaValue.number(Math.max(...r.values));\n}\n\nfunction count(a: Args, c: Ctx): FormulaValue {\n const flat = FormulaHelper.flattenArgs(a, c);\n let n = 0;\n for (const v of flat) {\n if (v.isNumber || (v.isText && !isNaN(parseFloat(v.textValue)))) n++;\n }\n return FormulaValue.number(n);\n}\n\nfunction countA(a: Args, c: Ctx): FormulaValue {\n return FormulaValue.number(FormulaHelper.flattenArgs(a, c).filter(v => !v.isBlank).length);\n}\n\nfunction countBlank(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isArray) return FormulaValue.number(v.isBlank ? 1 : 0);\n let n = 0;\n for (const item of v.arrayVal.values()) if (item.isBlank) n++;\n return FormulaValue.number(n);\n}\n\nfunction countIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n\n if (!range.isArray) return FormulaValue.number(FormulaHelper.matchesCriteria(range, criteria) ? 1 : 0);\n let n = 0;\n for (const item of range.arrayVal.values()) {\n if (!item.isBlank && FormulaHelper.matchesCriteria(item, criteria)) n++;\n }\n return FormulaValue.number(n);\n}\n\nfunction sumIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n\n const sumRange = a.length > 2 ? a[2]!.evaluate(c) : range;\n if (sumRange.isError) return sumRange;\n\n if (!range.isArray) {\n if (FormulaHelper.matchesCriteria(range, criteria)) {\n const r = sumRange.tryAsDouble();\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.zero;\n }\n return FormulaValue.zero;\n }\n\n const rangeArr = range.arrayVal;\n const sumArr = sumRange.isArray ? sumRange.arrayVal : null;\n let total = 0;\n\n for (let i = 0; i < rangeArr.length; i++) {\n const rv = rangeArr.getFlat(i);\n if (rv.isBlank) continue;\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\n const sv = sumArr ? sumArr.getFlat(i) : rangeArr.getFlat(i);\n const r = sv.tryAsDouble();\n if (r.ok) total += r.value;\n }\n }\n return FormulaValue.number(total);\n}\n\nfunction averageIf(a: Args, c: Ctx): FormulaValue {\n const range = a[0]!.evaluate(c);\n if (range.isError) return range;\n const crit = a[1]!.evaluate(c);\n if (crit.isError) return crit;\n const criteria = crit.asText();\n const avgRange = a.length > 2 ? a[2]!.evaluate(c) : range;\n if (avgRange.isError) return avgRange;\n\n if (!range.isArray) {\n if (!FormulaHelper.matchesCriteria(range, criteria)) return FormulaValue.errorDiv0;\n const r = avgRange.tryAsDouble();\n return r.ok ? FormulaValue.number(r.value) : FormulaValue.errorDiv0;\n }\n\n const rangeArr = range.arrayVal;\n const avgArr = avgRange.isArray ? avgRange.arrayVal : null;\n let total = 0, cnt = 0;\n\n for (let i = 0; i < rangeArr.length; i++) {\n const rv = rangeArr.getFlat(i);\n if (rv.isBlank) continue;\n if (FormulaHelper.matchesCriteria(rv, criteria)) {\n const sv = avgArr ? avgArr.getFlat(i) : rangeArr.getFlat(i);\n const r = sv.tryAsDouble();\n if (r.ok) { total += r.value; cnt++; }\n }\n }\n return cnt === 0 ? FormulaValue.errorDiv0 : FormulaValue.number(total / cnt);\n}\n\nfunction product(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n return FormulaValue.number(r.values.reduce((p, n) => p * n, 1));\n}\n\nfunction sumProduct(a: Args, c: Ctx): FormulaValue {\n const arrays = a.map(arg => arg.evaluate(c));\n for (const v of arrays) if (v.isError) return v;\n\n const first = arrays[0]!;\n const len = first.isArray ? first.arrayVal.length : 1;\n let total = 0;\n\n for (let i = 0; i < len; i++) {\n let prod = 1;\n for (const v of arrays) {\n const item = v.isArray ? v.arrayVal.getFlat(i) : v;\n const r = item.tryAsDouble();\n if (!r.ok) { prod = 0; break; }\n prod *= r.value;\n }\n total += prod;\n }\n return FormulaValue.number(total);\n}\n\n// ── Single-arg math ────────────────────────────────────────────────────────\n\nfunction abs(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.abs(r.value)) : r.error;\n}\n\nfunction round(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.round(n.value * factor) / factor);\n}\n\nfunction roundUp(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.ceil(n.value * factor) / factor);\n}\n\nfunction roundDown(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n const factor = Math.pow(10, Math.round(d.value));\n return FormulaValue.number(Math.floor(n.value * factor) / factor);\n}\n\nfunction ceiling(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const s = FormulaHelper.evalDouble(a[1]!, c);\n if (!s.ok) return s.error;\n if (s.value === 0) return FormulaValue.zero;\n return FormulaValue.number(Math.ceil(n.value / s.value) * s.value);\n}\n\nfunction floor(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const s = FormulaHelper.evalDouble(a[1]!, c);\n if (!s.ok) return s.error;\n if (s.value === 0) return FormulaValue.zero;\n return FormulaValue.number(Math.floor(n.value / s.value) * s.value);\n}\n\nfunction int_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.floor(r.value)) : r.error;\n}\n\nfunction trunc(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n let digits = 0;\n if (a.length > 1) {\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n digits = Math.round(d.value);\n }\n const factor = Math.pow(10, digits);\n return FormulaValue.number(Math.trunc(n.value * factor) / factor);\n}\n\nfunction mod(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n if (d.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(n.value - d.value * Math.floor(n.value / d.value));\n}\n\nfunction quotient(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const d = FormulaHelper.evalDouble(a[1]!, c);\n if (!d.ok) return d.error;\n if (d.value === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.trunc(n.value / d.value));\n}\n\nfunction power(a: Args, c: Ctx): FormulaValue {\n const b = FormulaHelper.evalDouble(a[0]!, c);\n if (!b.ok) return b.error;\n const e = FormulaHelper.evalDouble(a[1]!, c);\n if (!e.ok) return e.error;\n return FormulaValue.number(Math.pow(b.value, e.value));\n}\n\nfunction sqrt(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value < 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.sqrt(r.value));\n}\n\nfunction sign(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.sign(r.value)) : r.error;\n}\n\nfunction pi(): FormulaValue { return FormulaValue.number(Math.PI); }\nfunction rand(): FormulaValue { return FormulaValue.number(Math.random()); }\n\nfunction randBetween(a: Args, c: Ctx): FormulaValue {\n const lo = FormulaHelper.evalDouble(a[0]!, c);\n if (!lo.ok) return lo.error;\n const hi = FormulaHelper.evalDouble(a[1]!, c);\n if (!hi.ok) return hi.error;\n return FormulaValue.number(Math.floor(lo.value + Math.random() * (hi.value - lo.value + 1)));\n}\n\nfunction log(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n if (n.value <= 0) return FormulaValue.errorNum;\n let base = 10;\n if (a.length > 1) {\n const b = FormulaHelper.evalDouble(a[1]!, c);\n if (!b.ok) return b.error;\n base = b.value;\n }\n if (base <= 0 || base === 1) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log(n.value) / Math.log(base));\n}\n\nfunction log10(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value <= 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log10(r.value));\n}\n\nfunction ln(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n if (r.value <= 0) return FormulaValue.errorNum;\n return FormulaValue.number(Math.log(r.value));\n}\n\nfunction exp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n return r.ok ? FormulaValue.number(Math.exp(r.value)) : r.error;\n}\n\nfunction fact(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c);\n if (!r.ok) return r.error;\n const n = Math.round(r.value);\n if (n < 0) return FormulaValue.errorNum;\n if (n > 170) return FormulaValue.errorNum;\n let f = 1;\n for (let i = 2; i <= n; i++) f *= i;\n return FormulaValue.number(f);\n}\n\nfunction combin(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const k = FormulaHelper.evalDouble(a[1]!, c);\n if (!k.ok) return k.error;\n const N = Math.round(n.value);\n const K = Math.round(k.value);\n if (N < 0 || K < 0 || K > N) return FormulaValue.errorNum;\n // C(N,K) = N! / (K! * (N-K)!)\n let result = 1;\n for (let i = 0; i < K; i++) result = result * (N - i) / (i + 1);\n return FormulaValue.number(Math.round(result));\n}\n","/**\n * Text/string Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.TextFunctions (C#)\n */\nimport { fromOADate } from '@devmm/puredocs-excel';\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerText(r: FunctionRegistry): void {\n r.register('LEFT', left, 1, 2);\n r.register('RIGHT', right, 1, 2);\n r.register('MID', mid, 3, 3);\n r.register('LEN', len, 1, 1);\n r.register('UPPER', upper, 1, 1);\n r.register('LOWER', lower, 1, 1);\n r.register('PROPER', proper, 1, 1);\n r.register('TRIM', trim, 1, 1);\n r.register('CLEAN', clean, 1, 1);\n r.register('SUBSTITUTE', substitute, 3, 4);\n r.register('REPLACE', replace, 4, 4);\n r.register('CONCATENATE', concatenate, 1);\n r.register('CONCAT', concatenate, 1);\n r.register('TEXTJOIN', textJoin, 3);\n r.register('TEXT', text_, 2, 2);\n r.register('VALUE', value, 1, 1);\n r.register('FIND', find, 2, 3);\n r.register('SEARCH', search, 2, 3);\n r.register('REPT', rept, 2, 2);\n r.register('EXACT', exact, 2, 2);\n r.register('CHAR', char_, 1, 1);\n r.register('CODE', code, 1, 1);\n r.register('T', t_, 1, 1);\n r.register('TEXTBEFORE', textBefore, 2, 3);\n r.register('TEXTAFTER', textAfter, 2, 3);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction str(a: Args, c: Ctx, idx: number): { ok: true; s: string } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalString(a[idx]!, c);\n return r.ok ? { ok: true, s: r.value } : { ok: false, e: r.error };\n}\n\nfunction num(a: Args, c: Ctx, idx: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction left(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let n = 1;\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\n if (n < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.slice(0, n));\n}\n\nfunction right(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let n = 1;\n if (a.length > 1) { const r = num(a, c, 1); if (!r.ok) return r.e; n = Math.round(r.n); }\n if (n < 0) return FormulaValue.errorValue;\n return FormulaValue.text(n >= s.s.length ? s.s : s.s.slice(-n));\n}\n\nfunction mid(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\n const start = Math.round(sv.n) - 1;\n const count = Math.round(nv.n);\n if (start < 0 || count < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.slice(start, start + count));\n}\n\nfunction len(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.number(s.s.length);\n}\n\nfunction upper(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text(s.s.toUpperCase());\n}\n\nfunction lower(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text(s.s.toLowerCase());\n}\n\nfunction proper(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n let capitalise = true;\n let result = '';\n for (const ch of s.s) {\n result += capitalise ? ch.toUpperCase() : ch.toLowerCase();\n capitalise = !/[a-zA-Z]/.test(ch);\n }\n return FormulaValue.text(result);\n}\n\nfunction trim(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n // Excel TRIM removes leading/trailing spaces AND collapses internal spaces to one\n return FormulaValue.text(s.s.trim().replace(/\\s+/g, ' '));\n}\n\nfunction clean(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n return FormulaValue.text([...s.s].filter(ch => ch.charCodeAt(0) >= 32).join(''));\n}\n\nfunction substitute(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const old = str(a, c, 1); if (!old.ok) return old.e;\n const nw = str(a, c, 2); if (!nw.ok) return nw.e;\n\n if (a.length > 3) {\n const iv = num(a, c, 3); if (!iv.ok) return iv.e;\n const inst = Math.round(iv.n);\n let count = 0, pos = 0, result = '';\n while (pos < s.s.length) {\n const idx = s.s.indexOf(old.s, pos);\n if (idx < 0) { result += s.s.slice(pos); break; }\n count++;\n if (count === inst) {\n result += s.s.slice(pos, idx) + nw.s;\n pos = idx + old.s.length;\n result += s.s.slice(pos);\n break;\n }\n result += s.s.slice(pos, idx + old.s.length);\n pos = idx + old.s.length;\n }\n return FormulaValue.text(result);\n }\n\n return FormulaValue.text(s.s.split(old.s).join(nw.s));\n}\n\nfunction replace(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const sv = num(a, c, 1); if (!sv.ok) return sv.e;\n const nv = num(a, c, 2); if (!nv.ok) return nv.e;\n const nw = str(a, c, 3); if (!nw.ok) return nw.e;\n const start = Math.max(0, Math.round(sv.n) - 1);\n const count = Math.max(0, Math.round(nv.n));\n return FormulaValue.text(s.s.slice(0, start) + nw.s + s.s.slice(start + count));\n}\n\nfunction concatenate(a: Args, c: Ctx): FormulaValue {\n let result = '';\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n result += v.asText();\n }\n return FormulaValue.text(result);\n}\n\nfunction textJoin(a: Args, c: Ctx): FormulaValue {\n const delim = str(a, c, 0); if (!delim.ok) return delim.e;\n const ignV = a[1]!.evaluate(c);\n if (ignV.isError) return ignV;\n const ignoreEmpty = ignV.coerceToBool().booleanValue;\n const parts: string[] = [];\n\n for (let i = 2; i < a.length; i++) {\n const v = a[i]!.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n const t = item.asText();\n if (!ignoreEmpty || t !== '') parts.push(t);\n }\n } else {\n const t = v.asText();\n if (!ignoreEmpty || t !== '') parts.push(t);\n }\n }\n\n const result = parts.join(delim.s);\n if (result.length > 32767) return FormulaValue.errorValue;\n return FormulaValue.text(result);\n}\n\nfunction text_(a: Args, c: Ctx): FormulaValue {\n const n = FormulaHelper.evalDouble(a[0]!, c);\n if (!n.ok) return n.error;\n const f = str(a, c, 1); if (!f.ok) return f.e;\n // Map common Excel format codes to JS toLocaleString / toFixed patterns\n try {\n return FormulaValue.text(formatNumber(n.value, f.s));\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\nfunction formatNumber(value: number, fmt: string): string {\n // Minimal Excel format code interpreter\n if (fmt === '0') return String(Math.round(value));\n if (fmt === '0.00') return value.toFixed(2);\n if (fmt === '#,##0') return Math.round(value).toLocaleString('en-US');\n if (fmt === '#,##0.00') return value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n if (fmt === '0%') return `${Math.round(value * 100)}%`;\n if (fmt === '0.00%') return `${(value * 100).toFixed(2)}%`;\n // Date patterns — convert OADate back if it looks like a date format\n if (/[yYmMdD]/.test(fmt)) {\n try {\n const date = fromOADate(value);\n return date.toLocaleDateString();\n } catch { /* fall through */ }\n }\n return String(value);\n}\n\nfunction value(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const n = parseFloat(s.s.replace(/,/g, '').replace(/%$/, (m) => { return m ? String(parseFloat(s.s) / 100) : ''; }));\n if (isNaN(n)) return FormulaValue.errorValue;\n return FormulaValue.number(n);\n}\n\nfunction find(a: Args, c: Ctx): FormulaValue {\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\n let start = 0;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\n const idx = haystack.s.indexOf(needle.s, start);\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\n}\n\nfunction search(a: Args, c: Ctx): FormulaValue {\n const needle = str(a, c, 0); if (!needle.ok) return needle.e;\n const haystack = str(a, c, 1); if (!haystack.ok) return haystack.e;\n let start = 0;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; start = Math.round(r.n) - 1; }\n const idx = haystack.s.toLowerCase().indexOf(needle.s.toLowerCase(), start);\n return idx < 0 ? FormulaValue.errorValue : FormulaValue.number(idx + 1);\n}\n\nfunction rept(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const n = num(a, c, 1); if (!n.ok) return n.e;\n const count = Math.round(n.n);\n if (count < 0) return FormulaValue.errorValue;\n return FormulaValue.text(s.s.repeat(count));\n}\n\nfunction exact(a: Args, c: Ctx): FormulaValue {\n const s1 = str(a, c, 0); if (!s1.ok) return s1.e;\n const s2 = str(a, c, 1); if (!s2.ok) return s2.e;\n return FormulaValue.boolean(s1.s === s2.s);\n}\n\nfunction char_(a: Args, c: Ctx): FormulaValue {\n const r = num(a, c, 0); if (!r.ok) return r.e;\n const code = Math.round(r.n);\n if (code < 1 || code > 255) return FormulaValue.errorValue;\n return FormulaValue.text(String.fromCharCode(code));\n}\n\nfunction code(a: Args, c: Ctx): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n if (s.s.length === 0) return FormulaValue.errorValue;\n return FormulaValue.number(s.s.charCodeAt(0));\n}\n\nfunction t_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isText ? v : FormulaValue.emptyString;\n}\n\n// TEXTBEFORE(text, delimiter, [instance_num]) — text before the nth delimiter.\n// TEXTAFTER(text, delimiter, [instance_num]) — text after the nth delimiter.\n// instance_num defaults to 1; a negative value counts occurrences from the end.\nfunction textBefore(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'before'); }\nfunction textAfter(a: Args, c: Ctx): FormulaValue { return textSplitAt(a, c, 'after'); }\n\nfunction textSplitAt(a: Args, c: Ctx, mode: 'before' | 'after'): FormulaValue {\n const s = str(a, c, 0); if (!s.ok) return s.e;\n const d = str(a, c, 1); if (!d.ok) return d.e;\n let instance = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; instance = Math.trunc(r.n); }\n if (instance === 0) return FormulaValue.errorValue;\n\n const text = s.s;\n const delim = d.s;\n // Empty delimiter: BEFORE → \"\", AFTER → whole text (mirrors Excel).\n if (delim === '') {\n return FormulaValue.text(mode === 'before' ? '' : text);\n }\n\n // Collect all occurrence start positions.\n const positions: number[] = [];\n let from = 0;\n for (;;) {\n const idx = text.indexOf(delim, from);\n if (idx === -1) break;\n positions.push(idx);\n from = idx + delim.length;\n }\n if (positions.length === 0) return FormulaValue.errorNA;\n\n const nth = instance > 0 ? instance - 1 : positions.length + instance;\n if (nth < 0 || nth >= positions.length) return FormulaValue.errorNA;\n\n const pos = positions[nth]!;\n return FormulaValue.text(\n mode === 'before' ? text.slice(0, pos) : text.slice(pos + delim.length),\n );\n}\n","/**\n * Logical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LogicalFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport type { FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLogical(r: FunctionRegistry): void {\n r.register('IF', if_, 2, 3);\n r.register('AND', and, 1);\n r.register('OR', or, 1);\n r.register('NOT', not, 1, 1);\n r.register('XOR', xor, 1);\n r.register('IFERROR', ifError, 2, 2);\n r.register('IFNA', ifNa, 2, 2);\n r.register('IFS', ifs, 2);\n r.register('SWITCH', switch_, 3);\n r.register('TRUE', trueFn, 0, 0);\n r.register('FALSE', falseFn, 0, 0);\n}\n\nfunction if_(a: Args, c: Ctx): FormulaValue {\n const cond = a[0]!.evaluate(c);\n if (cond.isError) return cond;\n const b = cond.coerceToBool();\n if (b.isError) return b;\n return b.booleanValue\n ? a[1]!.evaluate(c)\n : a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.false_;\n}\n\nfunction and(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (!bv.booleanValue) return FormulaValue.false_;\n }\n }\n return hasValue ? FormulaValue.true_ : FormulaValue.errorValue;\n}\n\nfunction or(a: Args, c: Ctx): FormulaValue {\n let hasValue = false;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank) continue;\n if (item.isError) return item;\n hasValue = true;\n const bv = item.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n } else {\n if (v.isBlank) { hasValue = true; continue; }\n hasValue = true;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return FormulaValue.true_;\n }\n }\n return hasValue ? FormulaValue.false_ : FormulaValue.errorValue;\n}\n\nfunction not(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n return FormulaValue.boolean(!bv.booleanValue);\n}\n\nfunction xor(a: Args, c: Ctx): FormulaValue {\n let trueCount = 0;\n for (const arg of a) {\n const v = arg.evaluate(c);\n if (v.isError) return v;\n const bv = v.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) trueCount++;\n }\n return FormulaValue.boolean(trueCount % 2 === 1);\n}\n\nfunction ifError(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return v.isError && v.errorCode === FormulaError.NA ? a[1]!.evaluate(c) : v;\n}\n\nfunction ifs(a: Args, c: Ctx): FormulaValue {\n for (let i = 0; i + 1 < a.length; i += 2) {\n const cond = a[i]!.evaluate(c);\n if (cond.isError) return cond;\n const bv = cond.coerceToBool();\n if (bv.isError) return bv;\n if (bv.booleanValue) return a[i + 1]!.evaluate(c);\n }\n return FormulaValue.errorNA;\n}\n\nfunction switch_(a: Args, c: Ctx): FormulaValue {\n const expr = a[0]!.evaluate(c);\n if (expr.isError) return expr;\n for (let i = 1; i + 1 < a.length; i += 2) {\n const cv = a[i]!.evaluate(c);\n if (cv.isError) return cv;\n if (FormulaValue.areEqual(expr, cv)) return a[i + 1]!.evaluate(c);\n }\n // Default value: last arg when even count\n return a.length % 2 === 0 ? a[a.length - 1]!.evaluate(c) : FormulaValue.errorNA;\n}\n\nfunction trueFn(): FormulaValue { return FormulaValue.true_; }\nfunction falseFn(): FormulaValue { return FormulaValue.false_; }\n","/**\n * Date and time Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.DateFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\n// OADate helpers (same logic as core package, duplicated to avoid circular dep)\nconst OA_EPOCH_MS = Date.UTC(1899, 11, 30, 0, 0, 0, 0);\nconst MS_PER_DAY = 86_400_000;\n\nfunction toOA(date: Date): number {\n return (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),\n date.getHours(), date.getMinutes(), date.getSeconds()) - OA_EPOCH_MS) / MS_PER_DAY;\n}\n\nfunction fromOA(oa: number): Date {\n const ms = OA_EPOCH_MS + oa * MS_PER_DAY;\n const d = new Date(ms);\n return new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(),\n d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());\n}\n\nexport function registerDate(r: FunctionRegistry): void {\n r.register('NOW', now, 0, 0, true);\n r.register('TODAY', today, 0, 0, true);\n r.register('DATE', date_, 3, 3);\n r.register('YEAR', year, 1, 1);\n r.register('MONTH', month, 1, 1);\n r.register('DAY', day, 1, 1);\n r.register('HOUR', hour, 1, 1);\n r.register('MINUTE', minute, 1, 1);\n r.register('SECOND', second, 1, 1);\n r.register('DATEVALUE', dateValue, 1, 1);\n r.register('DAYS', days, 2, 2);\n r.register('EDATE', edate, 2, 2);\n r.register('EOMONTH', eomonth, 2, 2);\n r.register('WEEKDAY', weekday, 1, 2);\n r.register('WEEKNUM', weeknum, 1, 2);\n r.register('NETWORKDAYS', networkdays, 2, 3);\n r.register('DATEDIF', datedif, 3, 3);\n}\n\nfunction evalDate(a: Args, c: Ctx, idx: number): { ok: true; date: Date } | { ok: false; error: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n if (!r.ok) return r;\n try {\n return { ok: true, date: fromOA(r.value) };\n } catch {\n return { ok: false, error: FormulaValue.errorValue };\n }\n}\n\nfunction now(): FormulaValue { return FormulaValue.number(toOA(new Date())); }\nfunction today(): FormulaValue { const d = new Date(); return FormulaValue.number(toOA(new Date(d.getFullYear(), d.getMonth(), d.getDate()))); }\n\nfunction date_(a: Args, c: Ctx): FormulaValue {\n const y = FormulaHelper.evalDouble(a[0]!, c); if (!y.ok) return y.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const d = FormulaHelper.evalDouble(a[2]!, c); if (!d.ok) return d.error;\n try { return FormulaValue.number(toOA(new Date(Math.round(y.value), Math.round(m.value) - 1, Math.round(d.value)))); }\n catch { return FormulaValue.errorValue; }\n}\n\nfunction year(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getFullYear()) : r.error;\n}\nfunction month(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMonth() + 1) : r.error;\n}\nfunction day(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getDate()) : r.error;\n}\nfunction hour(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getHours()) : r.error;\n}\nfunction minute(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getMinutes()) : r.error;\n}\nfunction second(a: Args, c: Ctx): FormulaValue {\n const r = evalDate(a, c, 0); return r.ok ? FormulaValue.number(r.date.getSeconds()) : r.error;\n}\n\nfunction dateValue(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalString(a[0]!, c); if (!r.ok) return r.error;\n const d = new Date(r.value);\n if (isNaN(d.getTime())) return FormulaValue.errorValue;\n return FormulaValue.number(toOA(d));\n}\n\nfunction days(a: Args, c: Ctx): FormulaValue {\n const d1 = evalDate(a, c, 0); if (!d1.ok) return d1.error;\n const d2 = evalDate(a, c, 1); if (!d2.ok) return d2.error;\n return FormulaValue.number(Math.round((d1.date.getTime() - d2.date.getTime()) / MS_PER_DAY));\n}\n\nfunction edate(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const result = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value), d.date.getDate());\n return isNaN(result.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(result));\n}\n\nfunction eomonth(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const m = FormulaHelper.evalDouble(a[1]!, c); if (!m.ok) return m.error;\n const target = new Date(d.date.getFullYear(), d.date.getMonth() + Math.round(m.value) + 1, 0);\n return isNaN(target.getTime()) ? FormulaValue.errorNum : FormulaValue.number(toOA(target));\n}\n\nfunction weekday(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n let type = 1;\n if (a.length > 1) { const r = FormulaHelper.evalDouble(a[1]!, c); if (!r.ok) return r.error; type = Math.round(r.value); }\n const dow = d.date.getDay(); // 0 = Sunday\n switch (type) {\n case 1: return FormulaValue.number(dow === 0 ? 1 : dow + 1); // Sun=1\n case 2: return FormulaValue.number(dow === 0 ? 7 : dow); // Mon=1\n case 3: return FormulaValue.number(dow === 0 ? 6 : dow - 1); // Mon=0\n default: return FormulaValue.errorNum;\n }\n}\n\nfunction weeknum(a: Args, c: Ctx): FormulaValue {\n const d = evalDate(a, c, 0); if (!d.ok) return d.error;\n const jan1 = new Date(d.date.getFullYear(), 0, 1);\n const days_ = Math.floor((d.date.getTime() - jan1.getTime()) / MS_PER_DAY);\n return FormulaValue.number(Math.ceil((days_ + jan1.getDay() + 1) / 7));\n}\n\nfunction networkdays(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n\n const holidays = new Set<number>();\n if (a.length > 2) {\n const hv = a[2]!.evaluate(c);\n if (hv.isError) return hv;\n const items = hv.isArray ? [...hv.arrayVal.values()] : [hv];\n for (const item of items) {\n if (item.isBlank) continue;\n const r = item.tryAsDouble();\n if (!r.ok) return FormulaValue.errorValue;\n holidays.add(Math.floor(r.value));\n }\n }\n\n const dir = start.date <= end.date ? 1 : -1;\n let count = 0;\n const cur = new Date(start.date);\n\n while (dir > 0 ? cur <= end.date : cur >= end.date) {\n const dow = cur.getDay();\n const oa = Math.floor(toOA(cur));\n if (dow !== 0 && dow !== 6 && !holidays.has(oa)) count++;\n cur.setDate(cur.getDate() + dir);\n }\n\n return FormulaValue.number(count * dir);\n}\n\nfunction datedif(a: Args, c: Ctx): FormulaValue {\n const start = evalDate(a, c, 0); if (!start.ok) return start.error;\n const end = evalDate(a, c, 1); if (!end.ok) return end.error;\n const unit = FormulaHelper.evalString(a[2]!, c); if (!unit.ok) return unit.error;\n\n const s = start.date, e = end.date;\n if (s > e) return FormulaValue.errorNum;\n\n switch (unit.value.toUpperCase()) {\n case 'Y':\n return FormulaValue.number(e.getFullYear() - s.getFullYear() -\n (e.getMonth() < s.getMonth() || (e.getMonth() === s.getMonth() && e.getDate() < s.getDate()) ? 1 : 0));\n case 'M':\n return FormulaValue.number((e.getFullYear() - s.getFullYear()) * 12 + e.getMonth() - s.getMonth() -\n (e.getDate() < s.getDate() ? 1 : 0));\n case 'D':\n return FormulaValue.number(Math.round((e.getTime() - s.getTime()) / MS_PER_DAY));\n case 'MD':\n return FormulaValue.number(e.getDate() >= s.getDate()\n ? e.getDate() - s.getDate()\n : new Date(s.getFullYear(), s.getMonth() + 1, 0).getDate() - s.getDate() + e.getDate());\n case 'YM':\n return FormulaValue.number((e.getMonth() - s.getMonth() + 12) % 12 - (e.getDate() < s.getDate() ? 1 : 0));\n case 'YD': {\n const sameYearEnd = new Date(e.getFullYear(), s.getMonth(), s.getDate());\n return FormulaValue.number(Math.round((e.getTime() - sameYearEnd.getTime()) / MS_PER_DAY));\n }\n default: return FormulaValue.errorNum;\n }\n}\n","/**\n * Lookup and reference Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.LookupFunctions (C#)\n */\nimport { parseCellRef, cellRefFromRowCol, columnLetter } from '@devmm/puredocs-excel';\nimport { FormulaValue, ArrayValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport { CellReferenceNode, RangeReferenceNode } from '../formula-node.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerLookup(r: FunctionRegistry): void {\n r.register('VLOOKUP', vlookup, 3, 4);\n r.register('HLOOKUP', hlookup, 3, 4);\n r.register('XLOOKUP', xlookup, 3, 6);\n r.register('LOOKUP', lookup, 2, 3);\n r.register('INDEX', index_, 2, 3);\n r.register('MATCH', match, 2, 3);\n r.register('XMATCH', xmatch, 2, 4);\n r.register('CHOOSE', choose, 2);\n r.register('ADDRESS', address, 2, 5);\n r.register('ROW', row, 0, 1);\n r.register('COLUMN', column, 0, 1);\n r.register('ROWS', rows, 1, 1);\n r.register('COLUMNS', columns, 1, 1);\n r.register('OFFSET', offset, 3, 5, true);\n r.register('INDIRECT', indirect, 1, 2, true);\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction vlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\n if (!tableVal.isArray) return FormulaValue.errorRef;\n const ci = num(a, c, 2); if (!ci.ok) return ci.e;\n const colIdx = Math.round(ci.n) - 1;\n\n let exactMatch = true;\n if (a.length > 3) {\n const mv = a[3]!.evaluate(c);\n if (mv.isError) return mv;\n exactMatch = !mv.coerceToBool().booleanValue;\n }\n\n const tbl = tableVal.arrayVal;\n if (colIdx < 0 || colIdx >= tbl.columns) return FormulaValue.errorRef;\n\n if (exactMatch) {\n for (let r = 0; r < tbl.rows; r++) {\n if (FormulaValue.areEqual(tbl.get(r, 0), lookupVal)) return tbl.get(r, colIdx);\n }\n return FormulaValue.errorNA;\n }\n\n // Approximate match — first column must be sorted ascending\n let best = -1;\n for (let r = 0; r < tbl.rows; r++) {\n if (FormulaValue.compare(tbl.get(r, 0), lookupVal) <= 0) best = r; else break;\n }\n return best >= 0 ? tbl.get(best, colIdx) : FormulaValue.errorNA;\n}\n\nfunction hlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const tableVal = a[1]!.evaluate(c); if (tableVal.isError) return tableVal;\n if (!tableVal.isArray) return FormulaValue.errorRef;\n const ri = num(a, c, 2); if (!ri.ok) return ri.e;\n const rowIdx = Math.round(ri.n) - 1;\n\n let exactMatch = true;\n if (a.length > 3) {\n const mv = a[3]!.evaluate(c);\n if (mv.isError) return mv;\n exactMatch = !mv.coerceToBool().booleanValue;\n }\n\n const tbl = tableVal.arrayVal;\n if (rowIdx < 0 || rowIdx >= tbl.rows) return FormulaValue.errorRef;\n\n if (exactMatch) {\n for (let col = 0; col < tbl.columns; col++) {\n if (FormulaValue.areEqual(tbl.get(0, col), lookupVal)) return tbl.get(rowIdx, col);\n }\n return FormulaValue.errorNA;\n }\n\n let best = -1;\n for (let col = 0; col < tbl.columns; col++) {\n if (FormulaValue.compare(tbl.get(0, col), lookupVal) <= 0) best = col; else break;\n }\n return best >= 0 ? tbl.get(rowIdx, best) : FormulaValue.errorNA;\n}\n\n/** Builds a case-insensitive regex from an Excel wildcard pattern (*, ?, ~). */\nfunction wildcardRegex(pattern: string): RegExp {\n let out = '';\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i]!;\n if (ch === '~' && i + 1 < pattern.length) {\n const next = pattern[++i]!;\n out += next.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n } else if (ch === '*') out += '.*';\n else if (ch === '?') out += '.';\n else out += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n return new RegExp(`^${out}$`, 'i');\n}\n\n/**\n * Locates the match index (0-based) in a length-`n` vector, or -1.\n * matchMode: 0 exact · -1 exact-or-next-smaller · 1 exact-or-next-larger · 2 wildcard\n * searchMode: 1 first→last · -1 last→first · 2 binary asc · -2 binary desc\n * Binary modes read the vector via `get` without materialising it, so a lookup\n * over a full sorted column stays O(log n) in both time and allocations.\n */\nfunction findMatch(\n n: number,\n get: (i: number) => FormulaValue,\n lookupVal: FormulaValue,\n matchMode: number,\n searchMode: number,\n): number {\n // Binary search (only meaningful for exact / next-smaller / next-larger).\n if ((searchMode === 2 || searchMode === -2) && matchMode !== 2) {\n const at = searchMode === 2 ? get : (j: number) => get(n - 1 - j);\n let lo = 0, hi = n - 1, lastLE = -1, firstGE = -1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const cmp = FormulaValue.compare(at(mid), lookupVal);\n if (cmp === 0) return searchMode === 2 ? mid : n - 1 - mid;\n if (cmp < 0) { lastLE = mid; lo = mid + 1; }\n else { firstGE = mid; hi = mid - 1; }\n }\n const idx = matchMode === -1 ? lastLE : matchMode === 1 ? firstGE : -1;\n return idx < 0 ? -1 : (searchMode === 2 ? idx : n - 1 - idx);\n }\n\n // Linear scan (honouring direction).\n const reverse = searchMode === -1;\n const order = reverse\n ? Array.from({ length: n }, (_, k) => n - 1 - k)\n : Array.from({ length: n }, (_, k) => k);\n\n if (matchMode === 2) {\n const re = wildcardRegex(lookupVal.asText());\n for (const i of order) if (re.test(get(i).asText())) return i;\n return -1;\n }\n if (matchMode === 0) {\n for (const i of order) if (FormulaValue.areEqual(get(i), lookupVal)) return i;\n return -1;\n }\n\n // Approximate: track the closest value on the requested side.\n let best = -1;\n let bestVal: FormulaValue | null = null;\n for (const i of order) {\n const v = get(i);\n const cmp = FormulaValue.compare(v, lookupVal);\n if (cmp === 0) return i;\n if (matchMode === -1 && cmp < 0) {\n if (bestVal === null || FormulaValue.compare(v, bestVal) > 0) { best = i; bestVal = v; }\n } else if (matchMode === 1 && cmp > 0) {\n if (bestVal === null || FormulaValue.compare(v, bestVal) < 0) { best = i; bestVal = v; }\n }\n }\n return best;\n}\n\nfunction xlookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\n const returnRaw = a[2]!.evaluate(c); if (returnRaw.isError) return returnRaw;\n\n const matchMode = a.length > 4 ? num(a, c, 4) : { ok: true as const, n: 0 };\n if (!matchMode.ok) return matchMode.e;\n const searchMode = a.length > 5 ? num(a, c, 5) : { ok: true as const, n: 1 };\n if (!searchMode.ok) return searchMode.e;\n const mm = Math.trunc(matchMode.n), sm = Math.trunc(searchMode.n);\n\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\n const vertical = !(la.rows === 1 && la.columns > 1);\n const n = vertical ? la.rows : la.columns;\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\n\n const idx = findMatch(n, get, lookupVal, mm, sm);\n if (idx < 0) {\n return a.length > 3 ? a[3]!.evaluate(c) : FormulaValue.errorNA;\n }\n\n const ret = returnRaw.isArray ? returnRaw.arrayVal : ArrayValue.fromScalar(returnRaw);\n if (vertical) {\n if (ret.rows !== n) return FormulaValue.errorValue;\n if (ret.columns === 1) return ret.get(idx, 0);\n const out = new ArrayValue(1, ret.columns);\n for (let col = 0; col < ret.columns; col++) out.set(0, col, ret.get(idx, col));\n return FormulaValue.array(out);\n }\n if (ret.columns !== n) return FormulaValue.errorValue;\n if (ret.rows === 1) return ret.get(0, idx);\n const out = new ArrayValue(ret.rows, 1);\n for (let r = 0; r < ret.rows; r++) out.set(r, 0, ret.get(r, idx));\n return FormulaValue.array(out);\n}\n\n/**\n * XMATCH(lookup_value, lookup_array, [match_mode], [search_mode]) — returns the\n * 1-based position of a value in a 1-D vector. Semantics (match/search modes)\n * are identical to XLOOKUP, so we reuse `findMatch`: binary modes stay O(log n)\n * with no array materialisation, keeping full-column lookups cheap.\n */\nfunction xmatch(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const lookupRaw = a[1]!.evaluate(c); if (lookupRaw.isError) return lookupRaw;\n\n const matchMode = a.length > 2 ? num(a, c, 2) : { ok: true as const, n: 0 };\n if (!matchMode.ok) return matchMode.e;\n const searchMode = a.length > 3 ? num(a, c, 3) : { ok: true as const, n: 1 };\n if (!searchMode.ok) return searchMode.e;\n\n const la = lookupRaw.isArray ? lookupRaw.arrayVal : ArrayValue.fromScalar(lookupRaw);\n if (la.rows > 1 && la.columns > 1) return FormulaValue.errorValue;\n const vertical = !(la.rows === 1 && la.columns > 1);\n const n = vertical ? la.rows : la.columns;\n const get = vertical ? (i: number) => la.get(i, 0) : (i: number) => la.get(0, i);\n\n const idx = findMatch(n, get, lookupVal, Math.trunc(matchMode.n), Math.trunc(searchMode.n));\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction index_(a: Args, c: Ctx): FormulaValue {\n const arrVal = a[0]!.evaluate(c); if (arrVal.isError) return arrVal;\n const rv = num(a, c, 1); if (!rv.ok) return rv.e;\n const rowIdx = Math.round(rv.n) - 1;\n let colIdx = 0;\n if (a.length > 2) { const cv = num(a, c, 2); if (!cv.ok) return cv.e; colIdx = Math.round(cv.n) - 1; }\n\n if (!arrVal.isArray) return rowIdx === 0 && colIdx === 0 ? arrVal : FormulaValue.errorRef;\n\n const arr = arrVal.arrayVal;\n if (rowIdx < 0 || rowIdx >= arr.rows || colIdx < 0 || colIdx >= arr.columns) {\n return FormulaValue.errorRef;\n }\n return arr.get(rowIdx, colIdx);\n}\n\nfunction match(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const arrVal = a[1]!.evaluate(c); if (arrVal.isError) return arrVal;\n let matchType = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; matchType = Math.round(r.n); }\n\n if (!arrVal.isArray) {\n return FormulaValue.areEqual(arrVal, lookupVal) ? FormulaValue.one : FormulaValue.errorNA;\n }\n\n const arr = arrVal.arrayVal;\n const len = arr.length;\n\n if (matchType === 0) {\n for (let i = 0; i < len; i++) {\n if (FormulaValue.areEqual(arr.getFlat(i), lookupVal)) return FormulaValue.number(i + 1);\n }\n return FormulaValue.errorNA;\n }\n\n if (matchType === 1) {\n let best = -1;\n for (let i = 0; i < len; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i; else break;\n }\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\n }\n\n // matchType === -1\n let best = -1;\n for (let i = 0; i < len; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) >= 0) best = i; else break;\n }\n return best >= 0 ? FormulaValue.number(best + 1) : FormulaValue.errorNA;\n}\n\nfunction choose(a: Args, c: Ctx): FormulaValue {\n const iv = num(a, c, 0); if (!iv.ok) return iv.e;\n const idx = Math.round(iv.n);\n if (idx < 1 || idx >= a.length) return FormulaValue.errorValue;\n return a[idx]!.evaluate(c);\n}\n\n/** Largest index i (in flat order) with values[i] <= lookupVal, else -1. */\nfunction approxMatchFlat(arr: ArrayValue, lookupVal: FormulaValue): number {\n let best = -1;\n for (let i = 0; i < arr.length; i++) {\n if (FormulaValue.compare(arr.getFlat(i), lookupVal) <= 0) best = i;\n else break;\n }\n return best;\n}\n\nfunction lookup(a: Args, c: Ctx): FormulaValue {\n const lookupVal = a[0]!.evaluate(c); if (lookupVal.isError) return lookupVal;\n const vecVal = a[1]!.evaluate(c); if (vecVal.isError) return vecVal;\n\n // Vector form with explicit result vector.\n if (a.length > 2) {\n const resVal = a[2]!.evaluate(c); if (resVal.isError) return resVal;\n const vecArr = vecVal.isArray ? vecVal.arrayVal : ArrayValue.fromScalar(vecVal);\n const idx = approxMatchFlat(vecArr, lookupVal);\n if (idx < 0) return FormulaValue.errorNA;\n if (resVal.isArray) return resVal.arrayVal.getFlat(idx);\n return idx === 0 ? resVal : FormulaValue.errorNA;\n }\n\n // Scalar.\n if (!vecVal.isArray) {\n return FormulaValue.areEqual(vecVal, lookupVal) ? vecVal : FormulaValue.errorNA;\n }\n\n // Array form: Excel searches the first row when the array is wider than tall,\n // otherwise the first column; the result comes from the last row/column.\n const arr = vecVal.arrayVal;\n if (arr.columns >= arr.rows) {\n let best = -1;\n for (let col = 0; col < arr.columns; col++) {\n if (FormulaValue.compare(arr.get(0, col), lookupVal) <= 0) best = col; else break;\n }\n return best >= 0 ? arr.get(arr.rows - 1, best) : FormulaValue.errorNA;\n }\n let best = -1;\n for (let r = 0; r < arr.rows; r++) {\n if (FormulaValue.compare(arr.get(r, 0), lookupVal) <= 0) best = r; else break;\n }\n return best >= 0 ? arr.get(best, arr.columns - 1) : FormulaValue.errorNA;\n}\n\nfunction address(a: Args, c: Ctx): FormulaValue {\n const rn = num(a, c, 0); if (!rn.ok) return rn.e;\n const cn = num(a, c, 1); if (!cn.ok) return cn.e;\n const row = Math.round(rn.n);\n const col = Math.round(cn.n);\n if (row < 1 || col < 1) return FormulaValue.errorValue;\n\n let absNum = 1;\n if (a.length > 2) { const r = num(a, c, 2); if (!r.ok) return r.e; absNum = Math.round(r.n); }\n if (absNum < 1 || absNum > 4) return FormulaValue.errorValue;\n\n let a1 = true;\n if (a.length > 3) {\n const v = a[3]!.evaluate(c);\n if (v.isError) return v;\n // A1 style is the default; only an explicit FALSE selects R1C1.\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\n }\n\n let sheetPrefix = '';\n if (a.length > 4) {\n const s = FormulaHelper.evalString(a[4]!, c);\n if (!s.ok) return s.error;\n if (s.value !== '') sheetPrefix = `${s.value}!`;\n }\n\n const rowAbs = absNum === 1 || absNum === 2;\n const colAbs = absNum === 1 || absNum === 3;\n\n let ref: string;\n if (a1) {\n ref = `${colAbs ? '$' : ''}${columnLetter(col)}${rowAbs ? '$' : ''}${row}`;\n } else {\n const rPart = rowAbs ? `R${row}` : `R[${row}]`;\n const cPart = colAbs ? `C${col}` : `C[${col}]`;\n ref = `${rPart}${cPart}`;\n }\n return FormulaValue.text(`${sheetPrefix}${ref}`);\n}\n\nfunction row(a: Args, c: Ctx): FormulaValue {\n if (a.length === 0) return FormulaValue.number(c.formulaRow || 1);\n const node = a[0]!;\n if (node instanceof CellReferenceNode) {\n return FormulaValue.number(parseCellRef(node.reference).row);\n }\n if (node instanceof RangeReferenceNode) {\n return FormulaValue.number(parseCellRef(node.startRef).row);\n }\n return FormulaValue.errorValue;\n}\n\nfunction column(a: Args, c: Ctx): FormulaValue {\n if (a.length === 0) return FormulaValue.number(c.formulaCol || 1);\n const node = a[0]!;\n if (node instanceof CellReferenceNode) {\n return FormulaValue.number(parseCellRef(node.reference).column);\n }\n if (node instanceof RangeReferenceNode) {\n return FormulaValue.number(parseCellRef(node.startRef).column);\n }\n return FormulaValue.errorValue;\n}\n\nfunction rows(a: Args, c: Ctx): FormulaValue {\n if (a[0] instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\n return FormulaValue.number(b.endRow - b.startRow + 1);\n }\n const v = a[0]!.evaluate(c);\n return v.isArray ? FormulaValue.number(v.arrayVal.rows) : FormulaValue.one;\n}\n\nfunction columns(a: Args, c: Ctx): FormulaValue {\n if (a[0] instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(a[0].startRef, a[0].endRef);\n return FormulaValue.number(b.endCol - b.startCol + 1);\n }\n const v = a[0]!.evaluate(c);\n return v.isArray ? FormulaValue.number(v.arrayVal.columns) : FormulaValue.one;\n}\n\n// INDIRECT(ref_text, [a1]) — resolves a reference given as text. Volatile: the\n// dependency graph cannot see through it, so the recalc engine recomputes it\n// every pass.\nfunction indirect(a: Args, c: Ctx): FormulaValue {\n const s = FormulaHelper.evalString(a[0]!, c);\n if (!s.ok) return s.error;\n let a1 = true;\n if (a.length > 1) {\n const v = a[1]!.evaluate(c);\n if (v.isError) return v;\n a1 = v.isBlank ? true : v.coerceToBool().booleanValue;\n }\n\n const text = s.value.trim();\n if (text === '') return FormulaValue.errorRef;\n\n // Split off an optional sheet qualifier (\"Sheet1!\" or \"'My Sheet'!\").\n let sheet: string | undefined;\n let body = text;\n const bang = text.lastIndexOf('!');\n if (bang >= 0) {\n sheet = text.slice(0, bang).replace(/^'|'$/g, '');\n body = text.slice(bang + 1);\n }\n\n const colon = body.indexOf(':');\n try {\n if (colon >= 0) {\n const start = toA1(body.slice(0, colon), a1, c);\n const end = toA1(body.slice(colon + 1), a1, c);\n if (start === null || end === null) return FormulaValue.errorRef;\n return sheet !== undefined\n ? c.getSheetRangeValues(sheet, start, end)\n : c.getRangeValues(start, end);\n }\n const cell = toA1(body, a1, c);\n if (cell === null) return FormulaValue.errorRef;\n return sheet !== undefined ? c.getSheetCellValue(sheet, cell) : c.getCellValue(cell);\n } catch {\n return FormulaValue.errorRef;\n }\n}\n\n/** Normalises a single reference (A1 or R1C1) to a plain A1 string, or null. */\nfunction toA1(ref: string, a1: boolean, c: Ctx): string | null {\n const r = ref.trim();\n if (a1) {\n try {\n const { row, column } = parseCellRef(r);\n return cellRefFromRowCol(row, column);\n } catch {\n return null;\n }\n }\n // R1C1 — absolute R{n}C{n} or relative R[{d}]C[{d}] (relative to formula cell).\n const m = /^R(\\[-?\\d+\\]|\\d+)?C(\\[-?\\d+\\]|\\d+)?$/i.exec(r);\n if (!m) return null;\n const axis = (part: string | undefined, base: number): number | null => {\n if (part === undefined) return base; // bare R or C → same row/col\n if (part.startsWith('[')) return base + parseInt(part.slice(1, -1), 10); // relative\n return parseInt(part, 10); // absolute\n };\n const row = axis(m[1], c.formulaRow || 1);\n const col = axis(m[2], c.formulaCol || 1);\n if (row === null || col === null || row < 1 || col < 1) return null;\n return cellRefFromRowCol(row, col);\n}\n\nfunction offset(a: Args, c: Ctx): FormulaValue {\n const baseNode = a[0]!;\n let baseRef: string;\n if (baseNode instanceof CellReferenceNode) baseRef = baseNode.reference;\n else if (baseNode instanceof RangeReferenceNode) baseRef = baseNode.startRef;\n else return FormulaValue.errorValue;\n\n const base = parseCellRef(baseRef);\n\n const ro = FormulaHelper.evalDouble(a[1]!, c); if (!ro.ok) return ro.error;\n const co = FormulaHelper.evalDouble(a[2]!, c); if (!co.ok) return co.error;\n\n const newRow = base.row + Math.round(ro.value);\n const newCol = base.column + Math.round(co.value);\n if (newRow < 1 || newCol < 1) return FormulaValue.errorRef;\n\n let height = 1, width = 1;\n if (a.length > 3) { const h = FormulaHelper.evalDouble(a[3]!, c); if (!h.ok) return h.error; height = Math.round(h.value); }\n if (a.length > 4) { const w = FormulaHelper.evalDouble(a[4]!, c); if (!w.ok) return w.error; width = Math.round(w.value); }\n\n if (height === 1 && width === 1) return c.getCellValue(cellRefFromRowCol(newRow, newCol));\n\n return c.getRangeValues(\n cellRefFromRowCol(newRow, newCol),\n cellRefFromRowCol(newRow + height - 1, newCol + width - 1),\n );\n}\n","/**\n * Statistical Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.StatisticalFunctions (C#)\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerStatistical(r: FunctionRegistry): void {\n r.register('MEDIAN', median, 1);\n r.register('MODE', mode, 1);\n r.register('MODE.SNGL', mode, 1);\n r.register('STDEV', stdev, 1);\n r.register('STDEV.S', stdev, 1);\n r.register('STDEVP', stdevp, 1);\n r.register('STDEV.P', stdevp, 1);\n r.register('VAR', var_, 1);\n r.register('VAR.S', var_, 1);\n r.register('VARP', varp, 1);\n r.register('VAR.P', varp, 1);\n r.register('LARGE', large, 2, 2);\n r.register('SMALL', small, 2, 2);\n r.register('RANK', rank, 2, 3);\n r.register('RANK.EQ', rank, 2, 3);\n r.register('PERCENTILE', percentile, 2, 2);\n r.register('PERCENTILE.INC', percentile, 2, 2);\n r.register('MAXIFS', maxIfs, 3);\n r.register('MINIFS', minIfs, 3);\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction variance(nums: number[], population: boolean): number {\n const mean = nums.reduce((s, n) => s + n, 0) / nums.length;\n const sumSq = nums.reduce((s, n) => s + (n - mean) ** 2, 0);\n return sumSq / (population ? nums.length : nums.length - 1);\n}\n\nfunction numsFromArray(v: FormulaValue): number[] {\n if (v.isArray) {\n return [...v.arrayVal.values()]\n .filter(i => i.isNumber)\n .map(i => i.numberValue);\n }\n return v.isNumber ? [v.numberValue] : [];\n}\n\nfunction num(a: Args, c: Ctx, i: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\n// ── Implementations ──────────────────────────────────────────────────────────\n\nfunction median(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNum;\n const sorted = [...r.values].sort((a, b) => a - b);\n const mid = sorted.length >> 1;\n return FormulaValue.number(\n sorted.length % 2 === 0 ? (sorted[mid - 1]! + sorted[mid]!) / 2 : sorted[mid]!,\n );\n}\n\nfunction mode(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorNA;\n const freq = new Map<number, number>();\n let maxCnt = 0;\n for (const n of r.values) {\n const cnt = (freq.get(n) ?? 0) + 1;\n freq.set(n, cnt);\n if (cnt > maxCnt) maxCnt = cnt;\n }\n if (maxCnt === 1) return FormulaValue.errorNA;\n for (const n of r.values) {\n if ((freq.get(n) ?? 0) === maxCnt) return FormulaValue.number(n);\n }\n return FormulaValue.errorNA;\n}\n\nfunction stdev(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, false)));\n}\n\nfunction stdevp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(Math.sqrt(variance(r.values, true)));\n}\n\nfunction var_(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length < 2) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, false));\n}\n\nfunction varp(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.collectNumbers(a, c);\n if (!r.ok) return r.error;\n if (r.values.length === 0) return FormulaValue.errorDiv0;\n return FormulaValue.number(variance(r.values, true));\n}\n\nfunction large(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => b - a);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction small(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = num(a, c, 1); if (!kv.ok) return kv.e;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n const k = Math.round(kv.n);\n if (k < 1 || k > nums.length) return FormulaValue.errorNum;\n return FormulaValue.number(nums[k - 1]!);\n}\n\nfunction rank(a: Args, c: Ctx): FormulaValue {\n const nv = FormulaHelper.evalDouble(a[0]!, c); if (!nv.ok) return nv.error;\n const arrV = a[1]!.evaluate(c); if (arrV.isError) return arrV;\n let order = 0;\n if (a.length > 2) { const ov = num(a, c, 2); if (!ov.ok) return ov.e; order = Math.round(ov.n); }\n const nums = numsFromArray(arrV).sort((a, b) => order === 0 ? b - a : a - b);\n const idx = nums.indexOf(nv.value);\n return idx < 0 ? FormulaValue.errorNA : FormulaValue.number(idx + 1);\n}\n\nfunction percentile(a: Args, c: Ctx): FormulaValue {\n const arrV = a[0]!.evaluate(c); if (arrV.isError) return arrV;\n const kv = FormulaHelper.evalDouble(a[1]!, c); if (!kv.ok) return kv.error;\n if (kv.value < 0 || kv.value > 1) return FormulaValue.errorNum;\n const nums = numsFromArray(arrV).sort((a, b) => a - b);\n if (nums.length === 0) return FormulaValue.errorNum;\n const n = (nums.length - 1) * kv.value;\n const lo = Math.floor(n), hi = Math.ceil(n);\n if (lo === hi) return FormulaValue.number(nums[lo]!);\n return FormulaValue.number(nums[lo]! + (nums[hi]! - nums[lo]!) * (n - lo));\n}\n\nfunction maxIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'max');\n}\n\nfunction minIfs(a: Args, c: Ctx): FormulaValue {\n return ifsAggregate(a, c, 'min');\n}\n\nfunction ifsAggregate(a: Args, c: Ctx, mode: 'max' | 'min'): FormulaValue {\n if (a.length < 3 || (a.length - 1) % 2 !== 0) return FormulaValue.errorValue;\n const mainRange = a[0]!.evaluate(c); if (mainRange.isError) return mainRange;\n if (!mainRange.isArray) return FormulaValue.errorValue;\n\n const arr = mainRange.arrayVal;\n const len = arr.length;\n const mask = new Uint8Array(len).fill(1);\n\n for (let p = 1; p + 1 < a.length; p += 2) {\n const cr = a[p]!.evaluate(c); if (cr.isError) return cr;\n const criteria = a[p + 1]!.evaluate(c).asText();\n const crArr = cr.isArray ? cr.arrayVal : null;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const cv = crArr ? crArr.getFlat(i) : cr;\n if (!FormulaHelper.matchesCriteria(cv, criteria)) mask[i] = 0;\n }\n }\n\n let result = mode === 'max' ? -Infinity : Infinity;\n let found = false;\n for (let i = 0; i < len; i++) {\n if (!mask[i]) continue;\n const r = arr.getFlat(i).tryAsDouble();\n if (!r.ok) continue;\n if (mode === 'max' ? r.value > result : r.value < result) { result = r.value; found = true; }\n }\n return found ? FormulaValue.number(result) : FormulaValue.zero;\n}\n","/**\n * Information Excel functions (IS*, TYPE, N, ERROR.TYPE, etc.).\n * Port of TVE.PureDocs.Excel.Formulas.InfoFunctions (C#)\n */\nimport { FormulaValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerInfo(r: FunctionRegistry): void {\n r.register('ISBLANK', isBlank, 1, 1);\n r.register('ISNUMBER', isNumber, 1, 1);\n r.register('ISTEXT', isText, 1, 1);\n r.register('ISERROR', isError, 1, 1);\n r.register('ISERR', isErr, 1, 1);\n r.register('ISLOGICAL', isLogical, 1, 1);\n r.register('ISNA', isNa, 1, 1);\n r.register('ISNONTEXT', isNonText, 1, 1);\n r.register('NA', na, 0, 0);\n r.register('TYPE', type_, 1, 1);\n r.register('N', n_, 1, 1);\n r.register('ISODD', isOdd, 1, 1);\n r.register('ISEVEN', isEven, 1, 1);\n r.register('ERROR.TYPE', errorType, 1, 1);\n}\n\nfunction isBlank(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBlank); }\nfunction isNumber(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isNumber); }\nfunction isText(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isText && v.textValue.length > 0);\n}\nfunction isError(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isError); }\nfunction isErr(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode !== FormulaError.NA);\n}\nfunction isLogical(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(a[0]!.evaluate(c).isBoolean); }\nfunction isNa(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n return FormulaValue.boolean(v.isError && v.errorCode === FormulaError.NA);\n}\nfunction isNonText(a: Args, c: Ctx): FormulaValue { return FormulaValue.boolean(!a[0]!.evaluate(c).isText); }\nfunction na(): FormulaValue { return FormulaValue.errorNA; }\n\nfunction type_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n const t = v.isNumber || v.isBlank ? 1\n : v.isText ? 2\n : v.isBoolean ? 4\n : v.isError ? 16\n : v.isArray ? 64 : 1;\n return FormulaValue.number(t);\n}\n\nfunction n_(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isNumber) return v;\n if (v.isBoolean) return FormulaValue.number(v.booleanValue ? 1 : 0);\n return FormulaValue.zero;\n}\n\nfunction isOdd(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.abs(Math.trunc(r.value)) % 2 === 1);\n}\n\nfunction isEven(a: Args, c: Ctx): FormulaValue {\n const r = FormulaHelper.evalDouble(a[0]!, c); if (!r.ok) return r.error;\n return FormulaValue.boolean(Math.trunc(r.value) % 2 === 0);\n}\n\nfunction errorType(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (!v.isError) return FormulaValue.errorNA;\n const map: Partial<Record<FormulaError, number>> = {\n [FormulaError.Null]: 1,\n [FormulaError.Div0]: 2,\n [FormulaError.Value]: 3,\n [FormulaError.Ref]: 4,\n [FormulaError.Name]: 5,\n [FormulaError.Num]: 6,\n [FormulaError.NA]: 7,\n };\n return FormulaValue.number(map[v.errorCode] ?? 7);\n}\n","/**\n * Financial Excel functions: PMT, FV, PV, NPV, IRR, RATE, NPER, XNPV, XIRR,\n * IPMT, PPMT.\n *\n * Sign conventions follow Excel: money you receive is positive, money you pay\n * is negative. `type` is 0 for end-of-period payments (default) or 1 for\n * beginning-of-period.\n */\nimport { FormulaValue } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerFinance(r: FunctionRegistry): void {\n r.register('PMT', pmt, 3, 5);\n r.register('FV', fv, 3, 5);\n r.register('PV', pv, 3, 5);\n r.register('NPV', npv, 2);\n r.register('IRR', irr, 1, 2);\n r.register('RATE', rate, 3, 6);\n r.register('NPER', nper, 3, 5);\n r.register('XNPV', xnpv, 3, 3);\n r.register('XIRR', xirr, 2, 3);\n r.register('IPMT', ipmt, 4, 6);\n r.register('PPMT', ppmt, 4, 6);\n}\n\n// ── Shared time-value-of-money kernels (used by PMT/FV/IPMT/PPMT) ─────────────\n\n/** Level payment for an annuity. Mirrors Excel PMT. */\nfunction pmtValue(r: number, n: number, pv: number, fv: number, type: number): number {\n if (r === 0) return -(pv + fv) / n;\n const pow = Math.pow(1 + r, n);\n let payment = (-fv - pv * pow) * r / (pow - 1);\n if (type === 1) payment /= (1 + r);\n return payment;\n}\n\n/** Future value after `n` periods. Mirrors Excel FV. */\nfunction fvValue(r: number, n: number, pmt: number, pv: number, type: number): number {\n if (r === 0) return -(pv + pmt * n);\n const pow = Math.pow(1 + r, n);\n return -(pv * pow + pmt * (1 + r * type) * (pow - 1) / r);\n}\n\n/** Reads argument `idx` as a number, defaulting when the argument is absent. */\nfunction arg(a: Args, c: Ctx, idx: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } {\n if (idx >= a.length) return { ok: true, n: dflt };\n const r = FormulaHelper.evalDouble(a[idx]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n}\n\nfunction pmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, present = pvv.n, future = fvv.n, t = type.n;\n if (n === 0) return FormulaValue.errorNum;\n return FormulaValue.number(pmtValue(r, n, present, future, t));\n}\n\nfunction fv(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, payment = pmtv.n, present = pvv.n, t = type.n;\n return FormulaValue.number(fvValue(r, n, payment, present, t));\n}\n\nfunction pv(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const nper = arg(a, c, 1, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 2, 0); if (!pmtv.ok) return pmtv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, n = nper.n, payment = pmtv.n, future = fvv.n, t = type.n;\n if (r === 0) return FormulaValue.number(-(future + payment * n));\n\n const pow = Math.pow(1 + r, n);\n return FormulaValue.number(-(future + payment * (1 + r * t) * (pow - 1) / r) / pow);\n}\n\nfunction npv(a: Args, c: Ctx): FormulaValue {\n const rate = FormulaHelper.evalDouble(a[0]!, c);\n if (!rate.ok) return rate.error;\n if (rate.value === -1) return FormulaValue.errorDiv0;\n\n const flows = FormulaHelper.collectNumbers(a.slice(1), c);\n if (!flows.ok) return flows.error;\n\n let total = 0;\n for (let i = 0; i < flows.values.length; i++) {\n total += flows.values[i]! / Math.pow(1 + rate.value, i + 1);\n }\n return FormulaValue.number(total);\n}\n\nfunction irr(a: Args, c: Ctx): FormulaValue {\n const flowsRes = FormulaHelper.collectNumbers([a[0]!], c);\n if (!flowsRes.ok) return flowsRes.error;\n const flows = flowsRes.values;\n if (flows.length < 2) return FormulaValue.errorNum;\n\n let guess = 0.1;\n if (a.length > 1) {\n const g = FormulaHelper.evalDouble(a[1]!, c);\n if (!g.ok) return g.error;\n guess = g.value;\n }\n\n const npvAt = (rate: number): number => {\n let sum = 0;\n for (let i = 0; i < flows.length; i++) sum += flows[i]! / Math.pow(1 + rate, i);\n return sum;\n };\n\n // Newton-Raphson with a numeric derivative; bounded iterations.\n let rate = guess;\n for (let iter = 0; iter < 100; iter++) {\n const f = npvAt(rate);\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\n const h = 1e-6;\n const deriv = (npvAt(rate + h) - f) / h;\n if (deriv === 0) break;\n const next = rate - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\n rate = next;\n }\n if (Math.abs(npvAt(rate)) < 1e-6) return FormulaValue.number(rate);\n return FormulaValue.errorNum;\n}\n\n/**\n * Time-value-of-money residual: the present value of a stream that should\n * equal zero at the true rate. Shared by RATE (root-finding) so its Newton\n * iteration and the closed forms above stay consistent.\n * pv·(1+r)^n + pmt·(1+r·type)·((1+r)^n − 1)/r + fv\n */\nfunction tvm(r: number, n: number, pmt: number, pv: number, fv: number, type: number): number {\n if (r === 0) return pv + pmt * n + fv;\n const pow = Math.pow(1 + r, n);\n return pv * pow + pmt * (1 + r * type) * (pow - 1) / r + fv;\n}\n\nfunction rate(a: Args, c: Ctx): FormulaValue {\n const nper = arg(a, c, 0, 0); if (!nper.ok) return nper.e;\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n const gs = arg(a, c, 5, 0.1); if (!gs.ok) return gs.e;\n\n const n = nper.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0) return FormulaValue.errorNum;\n\n // Newton-Raphson with a numeric derivative; Excel's own default guess is 10%.\n let r = gs.n;\n for (let iter = 0; iter < 100; iter++) {\n const f = tvm(r, n, pmt, pv, fv, t);\n if (Math.abs(f) < 1e-8) return FormulaValue.number(r);\n const h = 1e-6;\n const deriv = (tvm(r + h, n, pmt, pv, fv, t) - f) / h;\n if (deriv === 0) break;\n const next = r - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - r) < 1e-10) { r = next; break; }\n r = next;\n }\n if (Math.abs(tvm(r, n, pmt, pv, fv, t)) < 1e-6) return FormulaValue.number(r);\n return FormulaValue.errorNum;\n}\n\nfunction nper(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const pmtv = arg(a, c, 1, 0); if (!pmtv.ok) return pmtv.e;\n const pvv = arg(a, c, 2, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 3, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 4, 0); if (!type.ok) return type.e;\n\n const r = rate.n, pmt = pmtv.n, pv = pvv.n, fv = fvv.n, t = type.n;\n\n if (r === 0) {\n if (pmt === 0) return FormulaValue.errorNum;\n return FormulaValue.number(-(pv + fv) / pmt);\n }\n // Closed form: n = ln((pmt·(1+r·t) − fv·r)/(pmt·(1+r·t) + pv·r)) / ln(1+r)\n const adj = pmt * (1 + r * t);\n const num = adj - fv * r;\n const den = adj + pv * r;\n if (den === 0 || num / den <= 0) return FormulaValue.errorNum;\n const result = Math.log(num / den) / Math.log(1 + r);\n if (!isFinite(result)) return FormulaValue.errorNum;\n return FormulaValue.number(result);\n}\n\n/**\n * IPMT / PPMT — split the level annuity payment for a single period `per` into\n * its interest and principal parts. IPMT is the balance at the start of the\n * period times the rate; PPMT is the remainder of the payment. Both are O(1)\n * closed forms (no per-period loop), reusing the shared PMT/FV kernels.\n */\nfunction interestForPeriod(r: number, per: number, n: number, pv: number, fv: number, t: number): number {\n const pay = pmtValue(r, n, pv, fv, t);\n // Outstanding balance at the start of period `per` = FV after (per-1) periods.\n // For beginning-of-period annuities the first period accrues no interest, and\n // subsequent periods discount the accrued interest by one period.\n if (t === 1) {\n if (per === 1) return 0;\n return fvValue(r, per - 2, pay, pv, 1) * r / (1 + r);\n }\n return fvValue(r, per - 1, pay, pv, 0) * r;\n}\n\nfunction ipmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\n\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\n return FormulaValue.number(interestForPeriod(r, per, n, pv, fv, t));\n}\n\nfunction ppmt(a: Args, c: Ctx): FormulaValue {\n const rate = arg(a, c, 0, 0); if (!rate.ok) return rate.e;\n const perv = arg(a, c, 1, 0); if (!perv.ok) return perv.e;\n const nper = arg(a, c, 2, 0); if (!nper.ok) return nper.e;\n const pvv = arg(a, c, 3, 0); if (!pvv.ok) return pvv.e;\n const fvv = arg(a, c, 4, 0); if (!fvv.ok) return fvv.e;\n const type = arg(a, c, 5, 0); if (!type.ok) return type.e;\n\n const r = rate.n, per = perv.n, n = nper.n, pv = pvv.n, fv = fvv.n, t = type.n;\n if (n === 0 || per < 1 || per > n) return FormulaValue.errorNum;\n const pay = pmtValue(r, n, pv, fv, t);\n return FormulaValue.number(pay - interestForPeriod(r, per, n, pv, fv, t));\n}\n\n/**\n * Reads a node as a flat list of numbers in row-major order, keeping positional\n * alignment (blanks count as 0, unlike collectNumbers which drops them). Used to\n * pair cash flows with their dates for XNPV/XIRR.\n */\nfunction flatNumbers(\n node: FormulaNode,\n c: Ctx,\n): { ok: true; values: number[] } | { ok: false; e: FormulaValue } {\n const v = node.evaluate(c);\n if (v.isError) return { ok: false, e: v };\n const out: number[] = [];\n const push = (item: FormulaValue): FormulaValue | null => {\n if (item.isError) return item;\n const d = item.tryAsDouble();\n if (!d.ok) return FormulaValue.errorValue;\n out.push(d.value);\n return null;\n };\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n const err = push(item);\n if (err) return { ok: false, e: err };\n }\n } else {\n const err = push(v);\n if (err) return { ok: false, e: err };\n }\n return { ok: true, values: out };\n}\n\n/** Discounted value of dated cash flows: Σ vᵢ / (1+rate)^((dateᵢ − date₀)/365). */\nfunction xnpvAt(rate: number, values: number[], days: number[]): number {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n sum += values[i]! / Math.pow(1 + rate, days[i]! / 365);\n }\n return sum;\n}\n\nfunction xnpv(a: Args, c: Ctx): FormulaValue {\n const rateRes = FormulaHelper.evalDouble(a[0]!, c);\n if (!rateRes.ok) return rateRes.error;\n const rate = rateRes.value;\n if (rate <= -1) return FormulaValue.errorNum;\n\n const valsRes = flatNumbers(a[1]!, c); if (!valsRes.ok) return valsRes.e;\n const datesRes = flatNumbers(a[2]!, c); if (!datesRes.ok) return datesRes.e;\n const values = valsRes.values;\n const dates = datesRes.values;\n if (values.length === 0 || values.length !== dates.length) return FormulaValue.errorNum;\n\n const base = Math.trunc(dates[0]!);\n const days = dates.map(d => Math.trunc(d) - base);\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\n\n return FormulaValue.number(xnpvAt(rate, values, days));\n}\n\nfunction xirr(a: Args, c: Ctx): FormulaValue {\n const valsRes = flatNumbers(a[0]!, c); if (!valsRes.ok) return valsRes.e;\n const datesRes = flatNumbers(a[1]!, c); if (!datesRes.ok) return datesRes.e;\n const values = valsRes.values;\n const dates = datesRes.values;\n if (values.length < 2 || values.length !== dates.length) return FormulaValue.errorNum;\n\n let guess = 0.1;\n if (a.length > 2) {\n const g = FormulaHelper.evalDouble(a[2]!, c);\n if (!g.ok) return g.error;\n guess = g.value;\n }\n\n const base = Math.trunc(dates[0]!);\n const days = dates.map(d => Math.trunc(d) - base);\n if (days.some(d => d < 0)) return FormulaValue.errorNum;\n\n // Analytic derivative: f'(r) = Σ −(dᵢ/365)·vᵢ / (1+r)^(dᵢ/365 + 1).\n const derivAt = (rate: number): number => {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n const e = days[i]! / 365;\n sum += -e * values[i]! / Math.pow(1 + rate, e + 1);\n }\n return sum;\n };\n\n let rate = guess;\n for (let iter = 0; iter < 100; iter++) {\n const f = xnpvAt(rate, values, days);\n if (Math.abs(f) < 1e-7) return FormulaValue.number(rate);\n const deriv = derivAt(rate);\n if (deriv === 0) break;\n const next = rate - f / deriv;\n if (!isFinite(next) || next <= -1) break;\n if (Math.abs(next - rate) < 1e-9) { rate = next; break; }\n rate = next;\n }\n if (Math.abs(xnpvAt(rate, values, days)) < 1e-6) return FormulaValue.number(rate);\n return FormulaValue.errorNum;\n}\n","/**\n * Meta / language functions: LET (and later LAMBDA and its helpers).\n *\n * These are not ordinary value functions — they manipulate names and scopes,\n * so they inspect their argument AST nodes directly rather than only their\n * evaluated values.\n */\nimport { FormulaValue, ArrayValue, TailCall, type LambdaLike } from '../formula-value.js';\n\n/** Safety cap on trampoline iterations (guards a non-terminating tail loop). */\nconst MAX_TAIL_ITERATIONS = 10_000_000;\nimport { type FunctionRegistry } from '../function-registry.js';\nimport { NamedRangeNode, type FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerMeta(r: FunctionRegistry): void {\n r.register('LET', let_, 3);\n r.register('LAMBDA', lambda_, 1);\n r.register('MAP', map_, 2);\n r.register('REDUCE', reduce_, 3, 3);\n r.register('SCAN', scan_, 3, 3);\n r.register('BYROW', byRow, 2, 2);\n r.register('BYCOL', byCol, 2, 2);\n}\n\nconst asArray = (v: FormulaValue): ArrayValue =>\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\n\n/**\n * LET(name1, value1, [name2, value2, ...], calculation)\n *\n * Binds each name to its value in a fresh lexical scope, then evaluates the\n * final calculation. Later bindings may reference earlier ones. Names are\n * ordinary identifiers, which the parser represents as NamedRangeNode.\n */\nfunction let_(a: Args, c: Ctx): FormulaValue {\n // Need an odd count ≥ 3: pairs of (name, value) followed by one calculation.\n if (a.length < 3 || a.length % 2 === 0) return FormulaValue.errorValue;\n\n const bindings = new Map<string, FormulaValue>();\n c.pushScope(bindings);\n try {\n for (let i = 0; i < a.length - 1; i += 2) {\n const nameNode = a[i]!;\n if (!(nameNode instanceof NamedRangeNode)) return FormulaValue.errorValue;\n const value = a[i + 1]!.evaluate(c); // may reference names bound earlier\n if (value.isError) return value;\n bindings.set(nameNode.name.toUpperCase(), value);\n }\n return a[a.length - 1]!.evaluate(c);\n } finally {\n c.popScope();\n }\n}\n\n/**\n * LAMBDA(param1, ..., paramN, calculation)\n *\n * Produces a callable value. When invoked, each parameter is bound to its\n * argument in a fresh scope on the defining context and the calculation is\n * evaluated. Usable inline — LAMBDA(x,x+1)(5) — or via a defined name.\n */\nfunction lambda_(a: Args, c: Ctx): FormulaValue {\n const paramNodes = a.slice(0, -1);\n const body = a[a.length - 1]!;\n const params: string[] = [];\n for (const p of paramNodes) {\n if (!(p instanceof NamedRangeNode)) return FormulaValue.errorValue;\n params.push(p.name.toUpperCase());\n }\n const ctx = c; // capture defining context\n\n const lambda: LambdaLike = {\n arity: params.length,\n\n // One tail-aware evaluation of the body: binds params, then evaluates in\n // tail mode so a self/other tail call surfaces as a TailCall.\n step(args: FormulaValue[]): FormulaValue | TailCall {\n const bindings = new Map<string, FormulaValue>();\n params.forEach((p, i) => bindings.set(p, args[i] ?? FormulaValue.blank));\n ctx.pushScope(bindings);\n try {\n return body.evaluateTail(ctx);\n } finally {\n ctx.popScope();\n }\n },\n\n // Run to completion. Tail calls iterate here (O(1) stack); only non-tail\n // recursion re-enters call() and is bounded by the recursion guard.\n call(args: FormulaValue[]): FormulaValue {\n const guard = ctx.recursionGuard;\n if (guard) {\n if (guard.depth >= guard.max) return FormulaValue.errorNum; // too deep → #NUM!\n guard.depth++;\n }\n try {\n let current: LambdaLike = lambda;\n let currentArgs = args;\n for (let iter = 0; ; iter++) {\n if (iter > MAX_TAIL_ITERATIONS) return FormulaValue.errorNum;\n const r = current.step ? current.step(currentArgs) : current.call(currentArgs);\n if (r instanceof TailCall) {\n current = r.lambda;\n currentArgs = r.args;\n continue;\n }\n return r;\n }\n } finally {\n if (guard) guard.depth--;\n }\n },\n };\n\n return FormulaValue.lambda(lambda);\n}\n\n/** Resolves the trailing lambda argument. */\nfunction lambdaArg(node: FormulaNode, c: Ctx): { ok: true; fn: LambdaLike } | { ok: false; e: FormulaValue } {\n const v = node.evaluate(c);\n if (v.isError) return { ok: false, e: v };\n if (!v.isLambda) return { ok: false, e: FormulaValue.errorValue };\n return { ok: true, fn: v.lambdaVal };\n}\n\n// MAP(array1, [array2, ...], lambda) — element-wise map over one or more arrays.\nfunction map_(a: Args, c: Ctx): FormulaValue {\n const fn = lambdaArg(a[a.length - 1]!, c); if (!fn.ok) return fn.e;\n const arrays = a.slice(0, -1).map(n => asArray(n.evaluate(c)));\n if (arrays.length === 0) return FormulaValue.errorValue;\n const rows = arrays[0]!.rows, cols = arrays[0]!.columns;\n const out = new ArrayValue(rows, cols);\n for (let r = 0; r < rows; r++) {\n for (let col = 0; col < cols; col++) {\n out.set(r, col, fn.fn.call(arrays.map(ar => ar.get(r, col))));\n }\n }\n return FormulaValue.array(out);\n}\n\n// REDUCE(initial, array, lambda(acc, value)) — fold to a single value.\nfunction reduce_(a: Args, c: Ctx): FormulaValue {\n let acc = a[0]!.evaluate(c);\n if (acc.isError) return acc;\n const arr = asArray(a[1]!.evaluate(c));\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\n for (const v of arr.values()) {\n acc = fn.fn.call([acc, v]);\n if (acc.isError) return acc;\n }\n return acc;\n}\n\n// SCAN(initial, array, lambda(acc, value)) — running fold; returns an array.\nfunction scan_(a: Args, c: Ctx): FormulaValue {\n let acc = a[0]!.evaluate(c);\n if (acc.isError) return acc;\n const arr = asArray(a[1]!.evaluate(c));\n const fn = lambdaArg(a[2]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(arr.rows, arr.columns);\n for (let r = 0; r < arr.rows; r++) {\n for (let col = 0; col < arr.columns; col++) {\n acc = fn.fn.call([acc, arr.get(r, col)]);\n out.set(r, col, acc);\n }\n }\n return FormulaValue.array(out);\n}\n\n// BYROW(array, lambda(row)) — apply lambda to each row → column vector.\nfunction byRow(a: Args, c: Ctx): FormulaValue {\n const arr = asArray(a[0]!.evaluate(c));\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(arr.rows, 1);\n for (let r = 0; r < arr.rows; r++) {\n const row = new ArrayValue(1, arr.columns);\n for (let col = 0; col < arr.columns; col++) row.set(0, col, arr.get(r, col));\n out.set(r, 0, fn.fn.call([FormulaValue.array(row)]));\n }\n return FormulaValue.array(out);\n}\n\n// BYCOL(array, lambda(col)) — apply lambda to each column → row vector.\nfunction byCol(a: Args, c: Ctx): FormulaValue {\n const arr = asArray(a[0]!.evaluate(c));\n const fn = lambdaArg(a[1]!, c); if (!fn.ok) return fn.e;\n const out = new ArrayValue(1, arr.columns);\n for (let col = 0; col < arr.columns; col++) {\n const column = new ArrayValue(arr.rows, 1);\n for (let r = 0; r < arr.rows; r++) column.set(r, 0, arr.get(r, col));\n out.set(0, col, fn.fn.call([FormulaValue.array(column)]));\n }\n return FormulaValue.array(out);\n}\n","/**\n * SUBTOTAL and AGGREGATE — aggregates with visibility/nesting awareness.\n *\n * Both can skip rows hidden in the sheet and ignore nested SUBTOTAL/AGGREGATE\n * cells inside their ranges. That requires reference-level information (which\n * cell each value comes from, whether its row is hidden, what formula it holds),\n * so these functions inspect their argument nodes rather than only values, and\n * read the worksheet's optional isRowHidden/getCellFormula hooks.\n */\nimport { cellRefFromRowCol } from '@devmm/puredocs-excel';\nimport { FormulaValue } from '../formula-value.js';\nimport { type FunctionRegistry } from '../function-registry.js';\nimport { RangeReferenceNode, type FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerAggregate(r: FunctionRegistry): void {\n r.register('SUBTOTAL', subtotal, 2);\n r.register('AGGREGATE', aggregate, 3);\n}\n\ninterface CollectOptions {\n excludeHidden: boolean;\n /** Regex of formula names to treat as \"nested\" and skip, or null. */\n nestedPattern: RegExp | null;\n /** Skip cells whose evaluated value is an error (AGGREGATE option 6/7). */\n ignoreErrors: boolean;\n}\n\n/**\n * Collects the included values from the reference/value arguments starting at\n * `startIdx`, honouring hidden-row and nested-formula exclusions for cells that\n * come from same-sheet ranges. Returns the flat list of values, or an error.\n */\nfunction collectValues(\n a: Args,\n c: Ctx,\n startIdx: number,\n opts: CollectOptions,\n): { ok: true; values: FormulaValue[] } | { ok: false; error: FormulaValue } {\n const out: FormulaValue[] = [];\n const ws = c.worksheet;\n\n for (let i = startIdx; i < a.length; i++) {\n const node = a[i]!;\n if (node instanceof RangeReferenceNode) {\n const b = c.getRangeBounds(node.startRef, node.endRef);\n for (let row = b.startRow; row <= b.endRow; row++) {\n if (opts.excludeHidden && ws.isRowHidden?.(row)) continue;\n for (let col = b.startCol; col <= b.endCol; col++) {\n const ref = cellRefFromRowCol(row, col);\n if (opts.nestedPattern) {\n const f = ws.getCellFormula?.(ref);\n if (f && opts.nestedPattern.test(f)) continue; // skip nested SUBTOTAL/AGGREGATE\n }\n const v = c.getCellValue(ref);\n if (v.isError) {\n if (opts.ignoreErrors) continue;\n return { ok: false, error: v };\n }\n out.push(v);\n }\n }\n } else {\n const v = node.evaluate(c);\n if (v.isError) {\n if (opts.ignoreErrors) continue;\n return { ok: false, error: v };\n }\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isError) { if (opts.ignoreErrors) continue; return { ok: false, error: item }; }\n out.push(item);\n }\n } else {\n out.push(v);\n }\n }\n }\n return { ok: true, values: out };\n}\n\n/** Applies aggregate selector 1-11 (SUBTOTAL) / 1-19 (AGGREGATE) to values. */\nfunction applyAggregate(fn: number, values: FormulaValue[], extra?: number): FormulaValue {\n const nums: number[] = [];\n let countA = 0;\n for (const v of values) {\n if (!v.isBlank) countA++;\n const r = v.tryAsDouble();\n if (r.ok && !v.isText && !v.isBlank) nums.push(r.value);\n }\n\n const sum = () => nums.reduce((s, n) => s + n, 0);\n const avg = () => (nums.length ? sum() / nums.length : NaN);\n const variance = (sample: boolean): number => {\n const n = nums.length;\n if (sample ? n < 2 : n < 1) return NaN;\n const m = avg();\n const ss = nums.reduce((s, x) => s + (x - m) ** 2, 0);\n return ss / (sample ? n - 1 : n);\n };\n const sorted = () => [...nums].sort((x, y) => x - y);\n\n switch (fn) {\n case 1: return isNaN(avg()) ? FormulaValue.errorDiv0 : FormulaValue.number(avg());\n case 2: return FormulaValue.number(nums.length); // COUNT\n case 3: return FormulaValue.number(countA); // COUNTA\n case 4: return nums.length ? FormulaValue.number(Math.max(...nums)) : FormulaValue.zero;\n case 5: return nums.length ? FormulaValue.number(Math.min(...nums)) : FormulaValue.zero;\n case 6: return FormulaValue.number(nums.reduce((p, n) => p * n, 1)); // PRODUCT\n case 7: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.S\n case 8: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(Math.sqrt(v)); } // STDEV.P\n case 9: return FormulaValue.number(sum()); // SUM\n case 10: { const v = variance(true); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.S\n case 11: { const v = variance(false); return isNaN(v) ? FormulaValue.errorDiv0 : FormulaValue.number(v); } // VAR.P\n // AGGREGATE-only selectors:\n case 12: { const s = sorted(); const m = s.length; if (!m) return FormulaValue.errorNum;\n const mid = Math.floor(m / 2); return FormulaValue.number(m % 2 ? s[mid]! : (s[mid - 1]! + s[mid]!) / 2); } // MEDIAN\n case 14: { const s = sorted(); const k = Math.round(extra ?? 0); // LARGE\n return k >= 1 && k <= s.length ? FormulaValue.number(s[s.length - k]!) : FormulaValue.errorNum; }\n case 15: { const s = sorted(); const k = Math.round(extra ?? 0); // SMALL\n return k >= 1 && k <= s.length ? FormulaValue.number(s[k - 1]!) : FormulaValue.errorNum; }\n default: return FormulaValue.errorValue;\n }\n}\n\nfunction subtotal(a: Args, c: Ctx): FormulaValue {\n const fnVal = a[0]!.evaluate(c);\n if (fnVal.isError) return fnVal;\n const raw = fnVal.tryAsDouble();\n if (!raw.ok) return FormulaValue.errorValue;\n const code = Math.round(raw.value);\n const excludeHidden = code >= 101 && code <= 111;\n const fn = excludeHidden ? code - 100 : code;\n if (fn < 1 || fn > 11) return FormulaValue.errorValue;\n\n const collected = collectValues(a, c, 1, {\n excludeHidden,\n nestedPattern: /^\\s*SUBTOTAL\\s*\\(/i,\n ignoreErrors: false,\n });\n if (!collected.ok) return collected.error;\n return applyAggregate(fn, collected.values);\n}\n\nfunction aggregate(a: Args, c: Ctx): FormulaValue {\n const fnVal = a[0]!.evaluate(c);\n if (fnVal.isError) return fnVal;\n const optVal = a[1]!.evaluate(c);\n if (optVal.isError) return optVal;\n const fnR = fnVal.tryAsDouble();\n const optR = optVal.tryAsDouble();\n if (!fnR.ok || !optR.ok) return FormulaValue.errorValue;\n\n const fn = Math.round(fnR.value);\n const option = Math.round(optR.value);\n if (fn < 1 || fn > 19) return FormulaValue.errorValue;\n\n // option: 0/1 ignore nested SUBTOTAL/AGGREGATE; 2/3 also ignore errors;\n // 4 nothing; 5 ignore hidden rows; 6 ignore errors; 7 ignore hidden + errors.\n const excludeHidden = option === 1 || option === 3 || option === 5 || option === 7;\n const ignoreErrors = option === 2 || option === 3 || option === 6 || option === 7;\n const ignoreNested = option <= 3 || option === 5 || option === 7;\n\n // LARGE(14)/SMALL(15) take a k argument as the last value argument.\n let extra: number | undefined;\n let endIdx = a.length;\n if (fn === 14 || fn === 15) {\n const kVal = a[a.length - 1]!.evaluate(c);\n const kR = kVal.tryAsDouble();\n if (!kR.ok) return FormulaValue.errorValue;\n extra = kR.value;\n endIdx = a.length - 1;\n }\n\n const collected = collectValues(a.slice(0, endIdx), c, 2, {\n excludeHidden,\n nestedPattern: ignoreNested ? /^\\s*(SUBTOTAL|AGGREGATE)\\s*\\(/i : null,\n ignoreErrors,\n });\n if (!collected.ok) return collected.error;\n return applyAggregate(fn, collected.values, extra);\n}\n","/**\n * Dynamic-array functions (Excel 365): TRANSPOSE, SEQUENCE, UNIQUE, SORT,\n * FILTER, MMULT, TEXTSPLIT, VSTACK, HSTACK, TOCOL, TOROW.\n *\n * Each returns a FormulaValue array; the recalc engine spills it across a block\n * of cells. In a bare evaluateFormula call (no recalc engine) the array is\n * returned as-is and callers may read its top-left with implicit intersection.\n */\nimport { FormulaValue, ArrayValue, FormulaError } from '../formula-value.js';\nimport { FormulaHelper, type FunctionRegistry } from '../function-registry.js';\nimport type { FormulaNode } from '../formula-node.js';\nimport type { FormulaContext } from '../formula-context.js';\n\ntype Args = FormulaNode[];\ntype Ctx = FormulaContext;\n\nexport function registerArray(r: FunctionRegistry): void {\n r.register('TRANSPOSE', transpose, 1, 1);\n r.register('SEQUENCE', sequence, 1, 4);\n r.register('UNIQUE', unique, 1, 3);\n r.register('SORT', sort, 1, 4);\n r.register('SORTBY', sortBy, 2);\n r.register('FILTER', filter, 2, 3);\n r.register('MMULT', mmult, 2, 2);\n r.register('TEXTSPLIT', textSplit, 2, 6);\n r.register('VSTACK', vstack, 1);\n r.register('HSTACK', hstack, 1);\n r.register('TOCOL', toCol, 1, 3);\n r.register('TOROW', toRow, 1, 3);\n}\n\n/** Excel grid limits — guard against runaway allocations from bad formulas. */\nconst MAX_ROWS = 1048576;\nconst MAX_COLS = 16384;\n\nconst asArray = (v: FormulaValue): ArrayValue =>\n v.isArray ? v.arrayVal : ArrayValue.fromScalar(v);\n\nfunction fromRows(rows: FormulaValue[][]): FormulaValue {\n const nr = rows.length;\n const nc = nr > 0 ? rows[0]!.length : 0;\n const arr = new ArrayValue(nr, nc);\n for (let r = 0; r < nr; r++) for (let c = 0; c < nc; c++) arr.set(r, c, rows[r]![c]!);\n return FormulaValue.array(arr);\n}\n\nfunction toRows(arr: ArrayValue): FormulaValue[][] {\n const rows: FormulaValue[][] = [];\n for (let r = 0; r < arr.rows; r++) {\n const row: FormulaValue[] = [];\n for (let c = 0; c < arr.columns; c++) row.push(arr.get(r, c));\n rows.push(row);\n }\n return rows;\n}\n\nconst num = (a: Args, c: Ctx, i: number, dflt: number): { ok: true; n: number } | { ok: false; e: FormulaValue } => {\n if (i >= a.length) return { ok: true, n: dflt };\n const r = FormulaHelper.evalDouble(a[i]!, c);\n return r.ok ? { ok: true, n: r.value } : { ok: false, e: r.error };\n};\n\nfunction transpose(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c);\n if (v.isError) return v;\n return FormulaValue.array(asArray(v).transpose());\n}\n\nfunction sequence(a: Args, c: Ctx): FormulaValue {\n const rows = num(a, c, 0, 1); if (!rows.ok) return rows.e;\n const cols = num(a, c, 1, 1); if (!cols.ok) return cols.e;\n const start = num(a, c, 2, 1); if (!start.ok) return start.e;\n const step = num(a, c, 3, 1); if (!step.ok) return step.e;\n const R = Math.trunc(rows.n), C = Math.trunc(cols.n);\n if (R < 1 || C < 1) return FormulaValue.errorValue;\n const arr = new ArrayValue(R, C);\n for (let r = 0; r < R; r++) {\n for (let col = 0; col < C; col++) {\n arr.set(r, col, FormulaValue.number(start.n + (r * C + col) * step.n));\n }\n }\n return FormulaValue.array(arr);\n}\n\n/**\n * Canonical dedup key for one cell. Two cells that UNIQUE must treat as the same\n * yield the same string; distinct classes yield distinct strings. A kind prefix\n * prevents cross-type collisions (number 1 vs text \"1\" vs boolean TRUE).\n *\n * Deliberate deviations from FormulaValue.areEqual (which is a *comparison*\n * helper, not a dedup rule, and is not transitive):\n * • numbers use exact equality, not the 1e-10 fuzz — matches Excel UNIQUE and\n * restores transitivity (a fuzz-based key cannot have a canonical form);\n * • blank is its own class, never merged with 0 / \"\" / FALSE (Excel keeps an\n * empty cell and a 0 as distinct rows);\n * • errors dedupe by error code, so #N/A ≡ #N/A (areEqual returns false for\n * every error pair, which would leave error rows never deduplicated).\n */\nfunction cellKey(v: FormulaValue): string {\n switch (v.kind) {\n case 'number': return 'n' + (v.numberValue === 0 ? '0' : String(v.numberValue));\n case 'text': return 't' + v.textValue.toUpperCase(); // case-insensitive\n case 'boolean': return v.booleanValue ? 'b1' : 'b0';\n case 'blank': return 'B';\n case 'error': return 'e' + v.errorCode;\n default: return 'x'; // array/lambda never occur as a scalar cell\n }\n}\n\n/**\n * UNIQUE(array, [by_col], [exactly_once]).\n *\n * Single pass over the rows into a Map keyed by a canonical row key (length-\n * prefixed per cell so [\"a\",\"b\"] ≠ [\"ab\",\"\"]). O(n·k) time / O(u·k) memory\n * (u = distinct rows), replacing the previous O(n²·k) pairwise scan. Output\n * order follows first appearance; `exactly_once` filters on the per-key count\n * accumulated in the same pass — no second O(n²) counting sweep.\n */\nfunction unique(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const byCol = a.length > 1 ? a[1]!.evaluate(c).coerceToBool().booleanValue : false;\n const exactlyOnce = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const base = byCol ? asArray(v).transpose() : asArray(v);\n const map = new Map<string, { cells: FormulaValue[]; count: number }>();\n const order: string[] = [];\n for (let r = 0; r < base.rows; r++) {\n const cells: FormulaValue[] = new Array(base.columns);\n let key = '';\n for (let col = 0; col < base.columns; col++) {\n const cell = base.get(r, col);\n cells[col] = cell;\n const k = cellKey(cell);\n key += k.length + ':' + k;\n }\n const hit = map.get(key);\n if (hit) hit.count++;\n else { map.set(key, { cells, count: 1 }); order.push(key); }\n }\n\n const result: FormulaValue[][] = [];\n for (const key of order) {\n const e = map.get(key)!;\n if (exactlyOnce && e.count > 1) continue;\n result.push(e.cells);\n }\n if (result.length === 0) return FormulaValue.error(FormulaError.Calc);\n const out = fromRows(result);\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\n}\n\nfunction sort(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const sortIndex = num(a, c, 1, 1); if (!sortIndex.ok) return sortIndex.e;\n const sortOrder = num(a, c, 2, 1); if (!sortOrder.ok) return sortOrder.e;\n const byCol = a.length > 3 ? a[3]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const base = byCol ? asArray(v).transpose() : asArray(v);\n const rows = toRows(base);\n const idx = Math.trunc(sortIndex.n) - 1;\n const dir = sortOrder.n < 0 ? -1 : 1;\n if (rows.length > 0 && (idx < 0 || idx >= rows[0]!.length)) return FormulaValue.errorValue;\n\n const sorted = rows\n .map((r, i) => ({ r, i }))\n .sort((x, y) => {\n const cmp = FormulaValue.compare(x.r[idx]!, y.r[idx]!) * dir;\n return cmp !== 0 ? cmp : x.i - y.i; // stable\n })\n .map(o => o.r);\n\n const out = fromRows(sorted);\n return byCol ? FormulaValue.array(out.arrayVal.transpose()) : out;\n}\n\n/**\n * SORTBY(array, by_array1, [sort_order1], [by_array2, sort_order2], ...)\n *\n * Sorts `array` by one or more parallel key vectors without reordering `array`\n * itself in place: we sort a permutation of indices (O(n log n), stable) and\n * materialise the result once. Keys are read into flat vectors up front — only\n * the (small) key columns are copied, never the potentially large data array,\n * which keeps peak memory proportional to the keys plus a single output copy.\n */\nfunction sortBy(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const data = asArray(v);\n\n // Parse the trailing (by_array, [sort_order]) groups. sort_order is optional\n // per group; we treat a scalar-numeric argument following a key as its order.\n const keys: { vals: FormulaValue[]; dir: number }[] = [];\n let i = 1;\n while (i < a.length) {\n const byVal = a[i]!.evaluate(c); if (byVal.isError) return byVal;\n i++;\n let dir = 1;\n if (i < a.length) {\n const maybeOrder = a[i]!.evaluate(c);\n if (maybeOrder.isError) return maybeOrder;\n if (!maybeOrder.isArray && maybeOrder.isNumeric) {\n const d = maybeOrder.tryAsDouble();\n if (d.ok) { dir = d.value < 0 ? -1 : 1; i++; }\n }\n }\n keys.push({ vals: [...asArray(byVal).values()], dir });\n }\n if (keys.length === 0) return FormulaValue.errorValue;\n\n // Axis: keys aligned to rows sort rows; keys aligned to columns sort columns.\n const n = keys[0]!.vals.length;\n if (keys.some(k => k.vals.length !== n)) return FormulaValue.errorValue;\n const byRow = n === data.rows;\n const byColumn = !byRow && n === data.columns;\n if (!byRow && !byColumn) return FormulaValue.errorValue;\n\n const perm = Array.from({ length: n }, (_, k) => k);\n perm.sort((x, y) => {\n for (const key of keys) {\n const cmp = FormulaValue.compare(key.vals[x]!, key.vals[y]!) * key.dir;\n if (cmp !== 0) return cmp;\n }\n return x - y; // stable\n });\n\n const out = new ArrayValue(data.rows, data.columns);\n if (byRow) {\n for (let r = 0; r < data.rows; r++) {\n const src = perm[r]!;\n for (let col = 0; col < data.columns; col++) out.set(r, col, data.get(src, col));\n }\n } else {\n for (let col = 0; col < data.columns; col++) {\n const src = perm[col]!;\n for (let r = 0; r < data.rows; r++) out.set(r, col, data.get(r, src));\n }\n }\n return FormulaValue.array(out);\n}\n\nfunction filter(a: Args, c: Ctx): FormulaValue {\n const v = a[0]!.evaluate(c); if (v.isError) return v;\n const inc = a[1]!.evaluate(c); if (inc.isError) return inc;\n const arr = asArray(v);\n const incArr = asArray(inc);\n\n // include is a column mask (per row) or a row mask (per column).\n const perRow = incArr.rows === arr.rows && incArr.columns === 1;\n const perCol = incArr.columns === arr.columns && incArr.rows === 1;\n if (!perRow && !perCol) return FormulaValue.errorValue;\n\n const keptRows: FormulaValue[][] = [];\n if (perRow) {\n for (let r = 0; r < arr.rows; r++) {\n if (!incArr.get(r, 0).coerceToBool().booleanValue) continue;\n const row: FormulaValue[] = [];\n for (let col = 0; col < arr.columns; col++) row.push(arr.get(r, col));\n keptRows.push(row);\n }\n } else {\n // Keep columns; build rows from kept columns.\n const keepCols: number[] = [];\n for (let col = 0; col < arr.columns; col++) {\n if (incArr.get(0, col).coerceToBool().booleanValue) keepCols.push(col);\n }\n for (let r = 0; r < arr.rows; r++) {\n keptRows.push(keepCols.map(col => arr.get(r, col)));\n }\n if (keepCols.length === 0) keptRows.length = 0;\n }\n\n if (keptRows.length === 0 || (keptRows[0] && keptRows[0].length === 0)) {\n return a.length > 2 ? a[2]!.evaluate(c) : FormulaValue.error(FormulaError.Calc);\n }\n return fromRows(keptRows);\n}\n\nfunction mmult(a: Args, c: Ctx): FormulaValue {\n const av = a[0]!.evaluate(c); if (av.isError) return av;\n const bv = a[1]!.evaluate(c); if (bv.isError) return bv;\n const A = asArray(av), B = asArray(bv);\n if (A.columns !== B.rows) return FormulaValue.errorValue;\n\n const out = new ArrayValue(A.rows, B.columns);\n for (let i = 0; i < A.rows; i++) {\n for (let j = 0; j < B.columns; j++) {\n let sum = 0;\n for (let k = 0; k < A.columns; k++) {\n const x = A.get(i, k).tryAsDouble();\n const y = B.get(k, j).tryAsDouble();\n if (!x.ok || !y.ok) return FormulaValue.errorValue;\n sum += x.value * y.value;\n }\n out.set(i, j, FormulaValue.number(sum));\n }\n }\n return FormulaValue.array(out);\n}\n\nfunction textSplit(a: Args, c: Ctx): FormulaValue {\n const t = FormulaHelper.evalString(a[0]!, c); if (!t.ok) return t.error;\n const colD = FormulaHelper.evalString(a[1]!, c); if (!colD.ok) return colD.error;\n let rowD = '';\n if (a.length > 2) {\n const rd = a[2]!.evaluate(c);\n if (rd.isError) return rd;\n if (!rd.isBlank) { const r = FormulaHelper.evalString(a[2]!, c); if (!r.ok) return r.error; rowD = r.value; }\n }\n\n const split = (s: string, d: string): string[] => (d === '' ? [s] : s.split(d));\n const lines = rowD ? split(t.value, rowD) : [t.value];\n const grid = lines.map(line => split(line, colD.value));\n const width = grid.reduce((m, r) => Math.max(m, r.length), 0);\n\n const rows: FormulaValue[][] = grid.map(r => {\n const row: FormulaValue[] = [];\n for (let i = 0; i < width; i++) row.push(FormulaValue.text(r[i] ?? ''));\n return row;\n });\n return fromRows(rows);\n}\n\n/**\n * VSTACK(array1, [array2], ...) — stack arrays vertically. The result width is\n * the widest input; shorter rows are padded with #N/A (Excel behaviour). Two\n * passes: size first, then copy element-by-element into a single output buffer\n * via `get`/`set` — inputs are never re-materialised, so peak memory is one\n * output array regardless of how large the inputs are.\n */\nfunction vstack(a: Args, c: Ctx): FormulaValue {\n // Errors are embedded as cell values (Excel behaviour), not propagated — a\n // downstream TOCOL(..,2) can then drop them.\n const parts: ArrayValue[] = [];\n let totalRows = 0, maxCols = 0;\n for (const node of a) {\n const arr = asArray(node.evaluate(c));\n parts.push(arr);\n totalRows += arr.rows;\n if (arr.columns > maxCols) maxCols = arr.columns;\n }\n if (totalRows > MAX_ROWS || maxCols > MAX_COLS) return FormulaValue.errorNum;\n\n const out = new ArrayValue(totalRows, maxCols);\n let rowOff = 0;\n for (const arr of parts) {\n for (let r = 0; r < arr.rows; r++) {\n for (let col = 0; col < maxCols; col++) {\n out.set(rowOff + r, col, col < arr.columns ? arr.get(r, col) : FormulaValue.errorNA);\n }\n }\n rowOff += arr.rows;\n }\n return FormulaValue.array(out);\n}\n\n/**\n * HSTACK(array1, [array2], ...) — stack arrays horizontally. Result height is\n * the tallest input; shorter columns are padded with #N/A.\n */\nfunction hstack(a: Args, c: Ctx): FormulaValue {\n const parts: ArrayValue[] = [];\n let totalCols = 0, maxRows = 0;\n for (const node of a) {\n const arr = asArray(node.evaluate(c));\n parts.push(arr);\n totalCols += arr.columns;\n if (arr.rows > maxRows) maxRows = arr.rows;\n }\n if (maxRows > MAX_ROWS || totalCols > MAX_COLS) return FormulaValue.errorNum;\n\n const out = new ArrayValue(maxRows, totalCols);\n let colOff = 0;\n for (const arr of parts) {\n for (let col = 0; col < arr.columns; col++) {\n for (let r = 0; r < maxRows; r++) {\n out.set(r, colOff + col, r < arr.rows ? arr.get(r, col) : FormulaValue.errorNA);\n }\n }\n colOff += arr.columns;\n }\n return FormulaValue.array(out);\n}\n\n/** Shared flatten for TOCOL/TOROW: walks the array in scan order, applying the\n * `ignore` filter, and returns the surviving values in order. Streams through\n * `get` without building an intermediate index array. */\nfunction flatten(a: Args, c: Ctx): { ok: true; values: FormulaValue[] } | { ok: false; e: FormulaValue } {\n const arr = asArray(a[0]!.evaluate(c));\n const ig = num(a, c, 1, 0); if (!ig.ok) return { ok: false, e: ig.e };\n const ignore = Math.trunc(ig.n); // bit 1 = skip blanks, bit 2 = skip errors\n const byCol = a.length > 2 ? a[2]!.evaluate(c).coerceToBool().booleanValue : false;\n\n const skip = (x: FormulaValue) =>\n (((ignore & 1) !== 0) && x.isBlank) || (((ignore & 2) !== 0) && x.isError);\n\n const values: FormulaValue[] = [];\n if (byCol) {\n for (let col = 0; col < arr.columns; col++)\n for (let r = 0; r < arr.rows; r++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\n } else {\n for (let r = 0; r < arr.rows; r++)\n for (let col = 0; col < arr.columns; col++) { const x = arr.get(r, col); if (!skip(x)) values.push(x); }\n }\n return { ok: true, values };\n}\n\n/** TOCOL(array, [ignore], [scan_by_column]) — flatten to a single column. */\nfunction toCol(a: Args, c: Ctx): FormulaValue {\n const f = flatten(a, c); if (!f.ok) return f.e;\n if (f.values.length === 0) return FormulaValue.errorNA;\n const out = new ArrayValue(f.values.length, 1);\n for (let i = 0; i < f.values.length; i++) out.set(i, 0, f.values[i]!);\n return FormulaValue.array(out);\n}\n\n/** TOROW(array, [ignore], [scan_by_column]) — flatten to a single row. */\nfunction toRow(a: Args, c: Ctx): FormulaValue {\n const f = flatten(a, c); if (!f.ok) return f.e;\n if (f.values.length === 0) return FormulaValue.errorNA;\n const out = new ArrayValue(1, f.values.length);\n for (let i = 0; i < f.values.length; i++) out.set(0, i, f.values[i]!);\n return FormulaValue.array(out);\n}\n","/**\n * Central registry of all supported Excel functions.\n * Port of TVE.PureDocs.Excel.Formulas.FunctionRegistry (C#)\n */\nimport { FormulaValue } from './formula-value.js';\nimport type { FormulaNode } from './formula-node.js';\nimport type { FormulaContext } from './formula-context.js';\nimport { registerMath } from './functions/math-functions.js';\nimport { registerText } from './functions/text-functions.js';\nimport { registerLogical } from './functions/logical-functions.js';\nimport { registerDate } from './functions/date-functions.js';\nimport { registerLookup } from './functions/lookup-functions.js';\nimport { registerStatistical } from './functions/statistical-functions.js';\nimport { registerInfo } from './functions/info-functions.js';\nimport { registerFinance } from './functions/finance-functions.js';\nimport { registerMeta } from './functions/meta-functions.js';\nimport { registerAggregate } from './functions/aggregate-functions.js';\nimport { registerArray } from './functions/array-functions.js';\n\nexport type FormulaFunction = (args: FormulaNode[], ctx: FormulaContext) => FormulaValue;\n\nexport interface FunctionDef {\n readonly name: string;\n readonly minArgs: number;\n readonly maxArgs: number; // -1 = unlimited\n readonly isVolatile: boolean;\n readonly handler: FormulaFunction;\n}\n\nexport class FunctionRegistry {\n static #default: FunctionRegistry | undefined;\n\n /** Lazily-created default registry with all built-in functions registered. */\n static get default(): FunctionRegistry {\n if (!FunctionRegistry.#default) {\n FunctionRegistry.#default = new FunctionRegistry();\n FunctionRegistry.#default.#registerBuiltIns();\n }\n return FunctionRegistry.#default;\n }\n\n readonly #functions = new Map<string, FunctionDef>();\n\n /** Registers a function. Name is normalised to UPPERCASE. */\n register(\n name: string,\n handler: FormulaFunction,\n minArgs = 0,\n maxArgs = -1,\n isVolatile = false,\n ): void {\n this.#functions.set(name.toUpperCase(), {\n name: name.toUpperCase(), minArgs, maxArgs, isVolatile, handler,\n });\n }\n\n /** Executes a function by name with argument validation. */\n execute(name: string, args: FormulaNode[], ctx: FormulaContext): FormulaValue {\n const def = this.#functions.get(name.toUpperCase());\n if (!def) return FormulaValue.errorName;\n\n if (args.length < def.minArgs) return FormulaValue.errorValue;\n if (def.maxArgs >= 0 && args.length > def.maxArgs) return FormulaValue.errorValue;\n\n try {\n return def.handler(args, ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n }\n\n /** Returns true if the named function is volatile (NOW, RAND, etc.). */\n isVolatile(name: string): boolean {\n return this.#functions.get(name.toUpperCase())?.isVolatile ?? false;\n }\n\n /** Returns true if the function is registered. */\n has(name: string): boolean {\n return this.#functions.has(name.toUpperCase());\n }\n\n #registerBuiltIns(): void {\n // Static imports keep registration synchronous and deterministic.\n // The circular import (registry ↔ function modules) is safe because the\n // register* bindings are only invoked here at call time, never during\n // module evaluation.\n registerMath(this);\n registerText(this);\n registerLogical(this);\n registerDate(this);\n registerLookup(this);\n registerStatistical(this);\n registerInfo(this);\n registerFinance(this);\n registerMeta(this);\n registerAggregate(this);\n registerArray(this);\n }\n}\n\n// ── FormulaHelper — shared utilities used by function implementations ─────────\n\nexport namespace FormulaHelper {\n /** Evaluates a node and coerces to number, propagating errors. */\n export function evalDouble(\n node: FormulaNode,\n ctx: FormulaContext,\n ): { ok: true; value: number } | { ok: false; error: FormulaValue } {\n const v = node.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n const r = v.tryAsDouble();\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\n return { ok: true, value: r.value };\n }\n\n /** Evaluates a node and coerces to string, propagating errors. */\n export function evalString(\n node: FormulaNode,\n ctx: FormulaContext,\n ): { ok: true; value: string } | { ok: false; error: FormulaValue } {\n const v = node.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n return { ok: true, value: v.asText() };\n }\n\n /**\n * Collects numbers from all args (expanding arrays, skipping blanks/text).\n * Returns false + error value if any arg is an error.\n */\n export function collectNumbers(\n args: FormulaNode[],\n ctx: FormulaContext,\n ): { ok: true; values: number[] } | { ok: false; error: FormulaValue } {\n const nums: number[] = [];\n for (const arg of args) {\n const v = arg.evaluate(ctx);\n if (v.isError) return { ok: false, error: v };\n if (v.isArray) {\n for (const item of v.arrayVal.values()) {\n if (item.isBlank || item.isText) continue;\n if (item.isError) return { ok: false, error: item };\n const r = item.tryAsDouble();\n if (r.ok) nums.push(r.value);\n }\n } else if (!v.isBlank && !v.isText) {\n const r = v.tryAsDouble();\n if (!r.ok) return { ok: false, error: FormulaValue.errorValue };\n nums.push(r.value);\n }\n }\n return { ok: true, values: nums };\n }\n\n /** Flattens all args into FormulaValue array (expanding arrays). */\n export function flattenArgs(\n args: FormulaNode[],\n ctx: FormulaContext,\n ): FormulaValue[] {\n const result: FormulaValue[] = [];\n for (const arg of args) {\n const v = arg.evaluate(ctx);\n if (v.isArray) {\n for (const item of v.arrayVal.values()) result.push(item);\n } else {\n result.push(v);\n }\n }\n return result;\n }\n\n /** Matches a criteria string (e.g. \">5\", \"=hello\", \"*partial*\") against a value. */\n export function matchesCriteria(value: FormulaValue, criteria: string): boolean {\n criteria = criteria.trim();\n\n // Comparison operator prefix\n const opMatch = /^(>=|<=|<>|>|<|=)(.*)$/.exec(criteria);\n if (opMatch) {\n const op = opMatch[1]!;\n const rhs = opMatch[2]!;\n const rhsVal = parseFloat(rhs);\n const rhsNum = isNaN(rhsVal) ? null : rhsVal;\n\n const cmp = rhsNum !== null\n ? FormulaValue.compare(value, FormulaValue.number(rhsNum))\n : FormulaValue.compare(value, FormulaValue.text(rhs));\n\n switch (op) {\n case '>': return cmp > 0;\n case '>=': return cmp >= 0;\n case '<': return cmp < 0;\n case '<=': return cmp <= 0;\n case '<>': return !FormulaValue.areEqual(value, rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs));\n case '=': return FormulaValue.areEqual(value, rhsNum !== null ? FormulaValue.number(rhsNum) : FormulaValue.text(rhs));\n }\n }\n\n // Wildcard string matching\n if (criteria.includes('*') || criteria.includes('?')) {\n const pattern = wildcardToRegex(criteria);\n return pattern.test(value.asText());\n }\n\n // Exact match (case-insensitive for text)\n const num = parseFloat(criteria);\n if (!isNaN(num)) {\n return FormulaValue.areEqual(value, FormulaValue.number(num));\n }\n return value.asText().toUpperCase() === criteria.toUpperCase();\n }\n\n function wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`, 'i');\n }\n}\n","/**\n * Evaluation context — resolves cell/range values, dispatches functions.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaContext (C#)\n */\nimport { parseCellRef, cellRefFromRowCol } from '@devmm/puredocs-excel';\nimport { FormulaValue, ArrayValue } from './formula-value.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport type { FormulaNode } from './formula-node.js';\n\n// Forward declaration to avoid circular import\nexport interface WorksheetLike {\n getCellValue(reference: string): unknown;\n name: string;\n /** Optional: whether a 1-based row is hidden (used by SUBTOTAL/AGGREGATE). */\n isRowHidden?(row: number): boolean;\n /** Optional: formula text of a cell (used by SUBTOTAL to skip nested calls). */\n getCellFormula?(reference: string): string | null;\n /** Optional: spill range (e.g. \"A1:A3\") of a dynamic-array anchor, for A1#. */\n getSpillRange?(reference: string): string | null;\n}\n\nexport interface WorkbookLike {\n worksheets: readonly WorksheetLike[];\n getWorksheet(name: string): WorksheetLike;\n /**\n * Optional resolver for defined names (named ranges). Returns the refers-to\n * expression (without leading '='), following Excel scoping: a name scoped to\n * `sheetName` wins over the workbook-global name. When this method is absent\n * (or returns undefined), named-range references evaluate to #NAME?.\n *\n * @devmm/puredocs-excel's Workbook implements this.\n */\n getDefinedName?(name: string, sheetName?: string): string | undefined;\n}\n\nexport class FormulaContext {\n readonly #sheet: WorksheetLike;\n readonly #functions: FunctionRegistry;\n readonly #evaluating: Set<string>;\n\n /** Row of the formula cell (for @ implicit intersection). */\n formulaRow: number;\n /** Column of the formula cell (for @ implicit intersection). */\n formulaCol: number;\n\n /** Optional workbook reference for cross-sheet references. */\n workbook?: WorkbookLike;\n\n /**\n * Optional named-range resolver, installed by the evaluator when the workbook\n * exposes getDefinedName. Given a name, returns its evaluated value. Left\n * undefined when no resolver is available, in which case named ranges are\n * #NAME? (unchanged legacy behaviour).\n */\n nameResolver?: (name: string) => FormulaValue;\n\n /**\n * Shared recursion budget for LAMBDA calls, threaded across all contexts in a\n * single evaluation. Guards non-tail recursion (which grows the JS stack);\n * tail recursion is trampolined and does not count against it.\n */\n recursionGuard?: { depth: number; max: number };\n\n /**\n * Lexical scope stack for LET/LAMBDA local names. Each frame maps an\n * upper-cased local name to its value. Names resolve innermost-first and take\n * precedence over workbook defined names.\n */\n readonly #scopes: Array<Map<string, FormulaValue>> = [];\n\n /** Pushes a new binding frame (used by LET/LAMBDA). */\n pushScope(bindings: Map<string, FormulaValue>): void {\n this.#scopes.push(bindings);\n }\n\n /** Pops the innermost binding frame. */\n popScope(): void {\n this.#scopes.pop();\n }\n\n #lookupScope(name: string): FormulaValue | undefined {\n if (this.#scopes.length === 0) return undefined;\n const key = name.toUpperCase();\n for (let i = this.#scopes.length - 1; i >= 0; i--) {\n const v = this.#scopes[i]!.get(key);\n if (v !== undefined) return v;\n }\n return undefined;\n }\n\n constructor(\n sheet: WorksheetLike,\n formulaRow = 0,\n formulaCol = 0,\n evaluating?: Set<string>,\n registry?: FunctionRegistry,\n ) {\n this.#sheet = sheet;\n this.formulaRow = formulaRow;\n this.formulaCol = formulaCol;\n this.#evaluating = evaluating ?? new Set<string>();\n this.#functions = registry ?? FunctionRegistry.default;\n }\n\n get worksheet(): WorksheetLike { return this.#sheet; }\n\n // ── Cell/Range resolution ─────────────────────────────────────────────────\n\n getCellValue(cellReference: string): FormulaValue {\n const norm = cellReference.replace(/\\$/g, '').toUpperCase();\n\n // Circular reference detection\n if (this.#evaluating.has(norm)) return FormulaValue.errorRef;\n this.#evaluating.add(norm);\n\n try {\n const raw = this.#sheet.getCellValue(cellReference);\n return FormulaValue.fromObjectSync(raw);\n } finally {\n this.#evaluating.delete(norm);\n }\n }\n\n getRangeValues(startRef: string, endRef: string): FormulaValue {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n const rows = e.row - s.row + 1;\n const cols = e.column - s.column + 1;\n const arr = new ArrayValue(rows, cols);\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const ref = cellRefFromRowCol(s.row + r, s.column + c);\n arr.set(r, c, this.getCellValue(ref));\n }\n }\n return FormulaValue.array(arr);\n }\n\n getSheetCellValue(sheetName: string, cellReference: string): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n const sheet = this.workbook.getWorksheet(sheetName);\n const ctx = new FormulaContext(sheet, this.formulaRow, this.formulaCol, this.#evaluating, this.#functions);\n ctx.workbook = this.workbook;\n return ctx.getCellValue(cellReference);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n getSheetRangeValues(sheetName: string, startRef: string, endRef: string): FormulaValue {\n if (!this.workbook) return FormulaValue.errorRef;\n try {\n const sheet = this.workbook.getWorksheet(sheetName);\n const ctx = new FormulaContext(sheet, this.formulaRow, this.formulaCol, this.#evaluating, this.#functions);\n ctx.workbook = this.workbook;\n return ctx.getRangeValues(startRef, endRef);\n } catch {\n return FormulaValue.errorRef;\n }\n }\n\n resolveNamedRange(name: string): FormulaValue {\n // LET/LAMBDA locals shadow everything else.\n const scoped = this.#lookupScope(name);\n if (scoped !== undefined) return scoped;\n // Otherwise delegate to the evaluator-installed nameResolver, which looks\n // the name up on the workbook and evaluates its refers-to expression.\n // Absent a resolver, a named reference is #NAME? (legacy behaviour).\n return this.nameResolver ? this.nameResolver(name) : FormulaValue.errorName;\n }\n\n /**\n * Resolves a spill-range reference (A1#) to the array spilling from the anchor\n * cell. Requires the worksheet to expose getSpillRange; otherwise #REF!.\n */\n resolveSpillRange(anchorRef: string): FormulaValue {\n const spillRef = this.#sheet.getSpillRange?.(anchorRef);\n if (!spillRef) return FormulaValue.errorRef;\n const colon = spillRef.indexOf(':');\n if (colon < 0) return this.getCellValue(spillRef);\n return this.getRangeValues(spillRef.slice(0, colon), spillRef.slice(colon + 1));\n }\n\n getRangeBounds(startRef: string, endRef: string): { startRow: number; startCol: number; endRow: number; endCol: number } {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return { startRow: s.row, startCol: s.column, endRow: e.row, endCol: e.column };\n }\n\n // ── Function dispatch ─────────────────────────────────────────────────────\n\n /** True if a built-in function with this name is registered. */\n hasFunction(name: string): boolean {\n return this.#functions.has(name);\n }\n\n evaluateFunction(name: string, args: FormulaNode[]): FormulaValue {\n // A call to an unregistered name may be a call to a named LAMBDA.\n if (!this.#functions.has(name)) {\n const named = this.resolveNamedRange(name);\n if (named.isLambda) {\n return named.lambdaVal.call(args.map(a => a.evaluate(this)));\n }\n }\n return this.#functions.execute(name, args, this);\n }\n}\n","/**\n * Least-Recently-Used cache using JavaScript Map insertion-order semantics.\n * Port of TVE.PureDocs.Excel.Formulas.LruCache<TKey, TValue> (C#)\n *\n * JS Map maintains insertion order, so LRU eviction is simply:\n * delete oldest key = map.keys().next().value\n * move to end = delete + re-insert\n *\n * This is simpler and faster than the C# LinkedList + Dictionary approach.\n */\nexport class LruCache<K, V> {\n readonly #map: Map<K, V>;\n #capacity: number;\n\n #hits = 0;\n #misses = 0;\n #evictions = 0;\n\n constructor(capacity: number) {\n if (capacity <= 0) throw new RangeError('LruCache capacity must be > 0.');\n this.#capacity = capacity;\n this.#map = new Map();\n }\n\n get capacity(): number { return this.#capacity; }\n get size(): number { return this.#map.size; }\n get hits(): number { return this.#hits; }\n get misses(): number { return this.#misses; }\n get evictions():number { return this.#evictions; }\n get hitRate(): number {\n const total = this.#hits + this.#misses;\n return total === 0 ? 0 : this.#hits / total;\n }\n\n /**\n * Returns the value for key, or undefined if not present.\n * Moves the accessed key to the \"most recently used\" end.\n */\n get(key: K): V | undefined {\n const value = this.#map.get(key);\n if (value === undefined) {\n this.#misses++;\n return undefined;\n }\n // Move to end (most recently used)\n this.#map.delete(key);\n this.#map.set(key, value);\n this.#hits++;\n return value;\n }\n\n /**\n * Inserts or updates a key-value pair.\n * Evicts the least-recently-used entry if over capacity.\n */\n set(key: K, value: V): void {\n if (this.#map.has(key)) {\n // Update: remove and re-insert to move to end\n this.#map.delete(key);\n } else if (this.#map.size >= this.#capacity) {\n // Evict oldest (first key in Map)\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n this.#map.set(key, value);\n }\n\n /** Removes a key from the cache. Returns true if it existed. */\n delete(key: K): boolean {\n return this.#map.delete(key);\n }\n\n /** Returns true if the key is present (does NOT update LRU order). */\n has(key: K): boolean {\n return this.#map.has(key);\n }\n\n /** Removes all entries and resets statistics. */\n clear(): void {\n this.#map.clear();\n this.#hits = this.#misses = this.#evictions = 0;\n }\n\n /** Resizes the cache, evicting oldest entries if necessary. */\n resize(newCapacity: number): void {\n if (newCapacity <= 0) throw new RangeError('Capacity must be > 0.');\n this.#capacity = newCapacity;\n while (this.#map.size > newCapacity) {\n const oldest = this.#map.keys().next().value as K;\n this.#map.delete(oldest);\n this.#evictions++;\n }\n }\n}\n","/**\n * Main entry point for formula evaluation.\n * Port of TVE.PureDocs.Excel.Formulas.FormulaEvaluator (C#)\n *\n * Includes LRU cache for parsed ASTs to avoid re-parsing identical formulas.\n */\nimport { FormulaLexer } from './formula-lexer.js';\nimport { FormulaParser } from './formula-parser.js';\nimport { FormulaContext, type WorksheetLike, type WorkbookLike } from './formula-context.js';\nimport { FormulaValue } from './formula-value.js';\nimport { LruCache } from './lru-cache.js';\nimport type { FormulaNode } from './formula-node.js';\n\nconst DEFAULT_CACHE_CAPACITY = 10_000;\n\n// Global AST cache shared across all evaluations (formula text → AST)\nconst astCache = new LruCache<string, FormulaNode>(DEFAULT_CACHE_CAPACITY);\n\n/**\n * Parses a formula string to an AST, with LRU caching.\n */\nexport function parseFormula(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const cached = astCache.get(stripped);\n if (cached !== undefined) return cached;\n\n const ast = parseFormulaUncached(stripped);\n astCache.set(stripped, ast);\n return ast;\n}\n\n/**\n * Parses a formula without consulting or populating the shared AST cache.\n *\n * For callers that keep the AST themselves — the recalculation engine holds one\n * per registered formula — the cache is pure overhead: it would evict entries\n * that are still live elsewhere once a workbook has more formulas than its\n * capacity, paying eviction cost and retaining memory for no hits.\n */\nexport function parseFormulaUncached(formula: string): FormulaNode {\n const stripped = formula.startsWith('=') ? formula.slice(1) : formula;\n const tokens = new FormulaLexer(stripped).tokenize();\n return new FormulaParser(tokens).parse();\n}\n\n/** Default cap on non-tail LAMBDA recursion depth (JS stack safety). */\nconst DEFAULT_LAMBDA_DEPTH = 1024;\n\ninterface BuildContextOptions {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n /** Shared cell-evaluation guard (circular cell reference detection). */\n evaluating?: Set<string>;\n /** Shared named-range-resolution guard (circular name detection). */\n resolvingNames?: Set<string>;\n /** Shared cache of resolved names within one top-level evaluation. */\n resolvedNames?: Map<string, FormulaValue>;\n /** Shared recursion budget for LAMBDA calls. */\n recursionGuard?: { depth: number; max: number };\n}\n\n/**\n * Builds a FormulaContext, wiring the named-range resolver when the workbook\n * exposes getDefinedName. The evaluation and name-resolution guard sets, the\n * resolved-name cache, and the recursion guard are threaded into child contexts.\n */\nfunction buildContext(sheet: WorksheetLike, opts: BuildContextOptions): FormulaContext {\n const evaluating = opts.evaluating ?? new Set<string>();\n const ctx = new FormulaContext(\n sheet,\n opts.formulaRow ?? 0,\n opts.formulaCol ?? 0,\n evaluating,\n );\n ctx.recursionGuard = opts.recursionGuard ?? { depth: 0, max: DEFAULT_LAMBDA_DEPTH };\n\n const wb = opts.workbook;\n if (wb) {\n ctx.workbook = wb;\n if (typeof wb.getDefinedName === 'function') {\n const resolving = opts.resolvingNames ?? new Set<string>();\n const resolved = opts.resolvedNames ?? new Map<string, FormulaValue>();\n const guard = ctx.recursionGuard;\n ctx.nameResolver = (name: string) =>\n resolveName(name, sheet, wb, evaluating, resolving, resolved, guard);\n }\n }\n return ctx;\n}\n\n/**\n * Resolves a named range by looking up its refers-to expression on the workbook\n * (scoped to the referencing sheet) and evaluating it. Results are cached per\n * top-level evaluation so recursive named lambdas don't re-parse each call, and\n * name→name cycles are guarded.\n */\nfunction resolveName(\n name: string,\n sheet: WorksheetLike,\n workbook: WorkbookLike,\n evaluating: Set<string>,\n resolving: Set<string>,\n resolved: Map<string, FormulaValue>,\n recursionGuard: { depth: number; max: number },\n): FormulaValue {\n const key = `${sheet.name} ${name.toUpperCase()}`;\n const cached = resolved.get(key);\n if (cached !== undefined) return cached;\n\n if (resolving.has(key)) return FormulaValue.errorRef; // circular name definition\n const refersTo = workbook.getDefinedName!(name, sheet.name);\n if (refersTo == null || refersTo === '') return FormulaValue.errorName;\n\n resolving.add(key);\n try {\n const ast = parseFormula(refersTo);\n const ctx = buildContext(sheet, {\n workbook, evaluating, resolvingNames: resolving, resolvedNames: resolved, recursionGuard,\n });\n const value = ast.evaluate(ctx);\n // Cache only pure lambdas — they are stable closures. Other values may read\n // cells and are cheap to recompute; caching them risks subtle staleness.\n if (value.isLambda) resolved.set(key, value);\n return value;\n } catch {\n return FormulaValue.errorName;\n } finally {\n resolving.delete(key);\n }\n}\n\n/**\n * Evaluates a formula string against a worksheet.\n * Mirrors FormulaEvaluator.Evaluate() in C#.\n */\nexport function evaluateFormula(\n formula: string,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n },\n): FormulaValue {\n if (!formula) return FormulaValue.blank;\n\n try {\n return evaluateAst(parseFormula(formula), sheet, options);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n/**\n * Evaluates an already-parsed formula. Callers that hold onto an AST — such as\n * the recalculation engine, which parses each formula once when it is\n * registered — should use this so repeated evaluation never depends on the\n * global AST cache still holding the entry.\n */\nexport function evaluateAst(\n ast: FormulaNode,\n sheet: WorksheetLike,\n options?: {\n workbook?: WorkbookLike;\n formulaRow?: number;\n formulaCol?: number;\n },\n): FormulaValue {\n try {\n const ctx = buildContext(sheet, {\n workbook: options?.workbook,\n formulaRow: options?.formulaRow,\n formulaCol: options?.formulaCol,\n });\n return ast.evaluate(ctx);\n } catch {\n return FormulaValue.errorValue;\n }\n}\n\n// ── Cache management ──────────────────────────────────────────────────────────\n\nexport function clearAstCache(): void {\n astCache.clear();\n}\n\nexport function getAstCacheStats(): { size: number; hits: number; misses: number; hitRate: number } {\n return {\n size: astCache.size,\n hits: astCache.hits,\n misses: astCache.misses,\n hitRate: astCache.hitRate,\n };\n}\n\nexport function setAstCacheCapacity(capacity: number): void {\n astCache.resize(capacity);\n}\n","/**\n * Static precedent extraction from a parsed formula AST.\n *\n * Walks the AST and collects the cell/range references a formula reads\n * (its precedents), plus whether the formula is volatile (contains a volatile\n * function such as NOW/RAND/OFFSET/INDIRECT). The dependency graph is built\n * from these precedents; volatile formulas are always recalculated because\n * their real precedents cannot be known statically (e.g. INDIRECT/OFFSET\n * compute a reference at run time).\n */\nimport { parseCellRef } from '@devmm/puredocs-excel';\nimport { FunctionRegistry } from './function-registry.js';\nimport { parseFormula } from './formula-evaluator.js';\nimport {\n FormulaNode,\n CellReferenceNode,\n RangeReferenceNode,\n SheetCellReferenceNode,\n SheetRangeReferenceNode,\n NamedRangeNode,\n SpillReferenceNode,\n FunctionCallNode,\n BinaryOpNode,\n UnaryOpNode,\n ImplicitIntersectionNode,\n} from './formula-node.js';\n\n/** A rectangular precedent region on a specific sheet (1-based, inclusive). */\nexport interface PrecedentRef {\n /** Upper-cased sheet name. */\n readonly sheet: string;\n readonly startRow: number;\n readonly startCol: number;\n readonly endRow: number;\n readonly endCol: number;\n}\n\nexport interface ExtractResult {\n readonly refs: PrecedentRef[];\n readonly volatile: boolean;\n}\n\n/** Resolves a defined name to its refers-to expression, for name expansion. */\nexport type NameResolver = (name: string, sheet: string) => string | undefined;\n\n/**\n * Extracts the precedents and volatility of a formula AST.\n *\n * @param ast The parsed formula.\n * @param formulaSheet Upper-cased name of the sheet the formula lives on;\n * unqualified references resolve against it.\n * @param registry Function registry used to test volatility.\n * @param resolveName Optional resolver so NamedRangeNode precedents expand to\n * the references inside their refers-to expression.\n */\nexport function extractReferences(\n ast: FormulaNode,\n formulaSheet: string,\n registry: FunctionRegistry = FunctionRegistry.default,\n resolveName?: NameResolver,\n): ExtractResult {\n const refs: PrecedentRef[] = [];\n let volatile = false;\n const seenNames = new Set<string>();\n\n const cell = (sheet: string, ref: string): PrecedentRef => {\n const { row, column } = parseCellRef(ref);\n return { sheet: sheet.toUpperCase(), startRow: row, startCol: column, endRow: row, endCol: column };\n };\n const range = (sheet: string, startRef: string, endRef: string): PrecedentRef => {\n const s = parseCellRef(startRef);\n const e = parseCellRef(endRef);\n return {\n sheet: sheet.toUpperCase(),\n startRow: Math.min(s.row, e.row),\n startCol: Math.min(s.column, e.column),\n endRow: Math.max(s.row, e.row),\n endCol: Math.max(s.column, e.column),\n };\n };\n\n const walk = (node: FormulaNode): void => {\n if (node instanceof CellReferenceNode) {\n refs.push(cell(formulaSheet, node.reference));\n } else if (node instanceof RangeReferenceNode) {\n refs.push(range(formulaSheet, node.startRef, node.endRef));\n } else if (node instanceof SheetCellReferenceNode) {\n refs.push(cell(node.sheetName, node.cellReference));\n } else if (node instanceof SheetRangeReferenceNode) {\n refs.push(range(node.sheetName, node.startRef, node.endRef));\n } else if (node instanceof NamedRangeNode) {\n expandName(node.name);\n } else if (node instanceof SpillReferenceNode) {\n // A1# co-changes with its anchor; depending on the anchor cell suffices\n // to retrigger this formula whenever the spilling formula recomputes.\n refs.push(cell(formulaSheet, node.anchorRef));\n } else if (node instanceof FunctionCallNode) {\n if (registry.isVolatile(node.functionName)) volatile = true;\n for (const arg of node.args) walk(arg);\n } else if (node instanceof BinaryOpNode) {\n walk(node.left);\n walk(node.right);\n } else if (node instanceof UnaryOpNode) {\n walk(node.operand);\n } else if (node instanceof ImplicitIntersectionNode) {\n walk(node.inner);\n }\n // Literal nodes have no precedents.\n };\n\n const expandName = (name: string): void => {\n if (!resolveName) return;\n const key = name.toUpperCase();\n if (seenNames.has(key)) return; // guard against name → name cycles\n seenNames.add(key);\n const refersTo = resolveName(name, formulaSheet);\n if (!refersTo) return;\n try {\n walk(parseFormula(refersTo));\n } catch {\n /* ignore unparseable refers-to */\n }\n };\n\n walk(ast);\n return { refs, volatile };\n}\n\n/** True if the 1-based cell (sheet,row,col) falls inside a precedent region. */\nexport function refContains(ref: PrecedentRef, sheet: string, row: number, col: number): boolean {\n return (\n ref.sheet === sheet &&\n row >= ref.startRow && row <= ref.endRow &&\n col >= ref.startCol && col <= ref.endCol\n );\n}\n","/**\n * Reverse-dependency index: given a cell, which registered formulas read it?\n *\n * Without an index the only way to answer that is to test every formula's\n * precedent rectangles, which makes a single edit O(F) and a full recalc O(F²).\n * Since precedents are rectangles rather than points, the index buckets them\n * into a coarse tile grid: a rectangle registers itself in every tile it\n * overlaps, and a query only inspects the one tile containing the cell. Typical\n * precedents are single cells or short ranges, so they land in one tile.\n *\n * Rectangles too large to enumerate tiles for (a whole column is 16384 tiles\n * tall) go into a per-sheet overflow list that every query on that sheet also\n * scans. That keeps registration cheap and the common case exact.\n */\nimport { refContains, type PrecedentRef } from './recalc-references.js';\n\nconst TILE_ROWS = 64;\nconst TILE_COLS = 64;\n/** Above this many tiles a rectangle is treated as sheet-wide instead. */\nconst MAX_TILES_PER_REF = 32;\n\nexport class DependencyIndex {\n /** `sheet|tileRow|tileCol` → formula keys whose precedents overlap that tile. */\n readonly #tiles = new Map<string, Set<string>>();\n /** sheet → formula keys with a precedent too broad to tile. */\n readonly #wide = new Map<string, Set<string>>();\n /** formula key → the bucket keys it was filed under, for cheap removal. */\n readonly #placements = new Map<string, string[]>();\n\n /** Registers (or re-registers) a formula's precedent rectangles. */\n add(formulaKey: string, refs: readonly PrecedentRef[]): void {\n this.remove(formulaKey);\n if (refs.length === 0) return;\n\n const buckets: string[] = [];\n for (const ref of refs) {\n const tileRow0 = (ref.startRow / TILE_ROWS) | 0;\n const tileRow1 = (ref.endRow / TILE_ROWS) | 0;\n const tileCol0 = (ref.startCol / TILE_COLS) | 0;\n const tileCol1 = (ref.endCol / TILE_COLS) | 0;\n const tileCount = (tileRow1 - tileRow0 + 1) * (tileCol1 - tileCol0 + 1);\n\n if (tileCount > MAX_TILES_PER_REF) {\n this.#fileIn(this.#wide, ref.sheet, formulaKey, buckets, `w ${ref.sheet}`);\n continue;\n }\n for (let tr = tileRow0; tr <= tileRow1; tr++) {\n for (let tc = tileCol0; tc <= tileCol1; tc++) {\n const key = `${ref.sheet} ${tr} ${tc}`;\n this.#fileIn(this.#tiles, key, formulaKey, buckets, `t ${key}`);\n }\n }\n }\n this.#placements.set(formulaKey, buckets);\n }\n\n /** Forgets a formula. */\n remove(formulaKey: string): void {\n const buckets = this.#placements.get(formulaKey);\n if (!buckets) return;\n for (const bucket of buckets) {\n const wide = bucket.charCodeAt(0) === 119 /* 'w' */;\n const store = wide ? this.#wide : this.#tiles;\n const key = bucket.slice(2);\n const set = store.get(key);\n if (!set) continue;\n set.delete(formulaKey);\n if (set.size === 0) store.delete(key);\n }\n this.#placements.delete(formulaKey);\n }\n\n /** Drops every registration. */\n clear(): void {\n this.#tiles.clear();\n this.#wide.clear();\n this.#placements.clear();\n }\n\n /**\n * Calls `visit` with the key of each formula that *may* read the given cell.\n * Callers still confirm with {@link refContains}: a tile is coarser than a\n * rectangle, so this over-approximates by at most a tile's worth.\n */\n candidates(sheet: string, row: number, col: number, visit: (formulaKey: string) => void): void {\n const tile = this.#tiles.get(\n `${sheet} ${(row / TILE_ROWS) | 0} ${(col / TILE_COLS) | 0}`,\n );\n if (tile) for (const key of tile) visit(key);\n const wide = this.#wide.get(sheet);\n if (wide) for (const key of wide) visit(key);\n }\n\n #fileIn(\n store: Map<string, Set<string>>,\n key: string,\n formulaKey: string,\n buckets: string[],\n bucketId: string,\n ): void {\n let set = store.get(key);\n if (!set) { set = new Set(); store.set(key, set); }\n if (set.has(formulaKey)) return; // several refs can share one tile\n set.add(formulaKey);\n buckets.push(bucketId);\n }\n}\n\nexport { refContains };\n","/**\n * Workbook-level recalculation engine: dependency graph + topological recalc.\n *\n * The formula evaluator (evaluateFormula) is a pure function — it computes one\n * formula and reads precedent values from the model, but it does not track which\n * cells depend on which, nor write results back. This engine is the missing\n * stateful layer:\n *\n * 1. Register formulas with setCellFormula(); their precedents are extracted\n * from the AST (see recalc-references.ts).\n * 2. When an input cell changes, only the dependent formulas are recomputed,\n * in dependency (topological) order, and written back to the model.\n * 3. Volatile formulas (NOW/RAND/OFFSET/INDIRECT/…) are always recomputed,\n * since their true precedents cannot be known statically.\n * 4. Circular references are detected at the graph level and marked #REF!.\n *\n * The engine talks to storage through the small RecalcModel interface, so it is\n * independent of the core Workbook class (though it adapts to one trivially).\n */\nimport {\n parseCellRef,\n cellRefFromRowCol,\n shiftIndex,\n shiftSpan,\n shiftFormulaRefs,\n EXCEL_MAX_ROWS,\n EXCEL_MAX_COLUMNS,\n type RefShift,\n} from '@devmm/puredocs-excel';\nimport { FormulaValue, FormulaError } from './formula-value.js';\nimport { FunctionRegistry } from './function-registry.js';\nimport { evaluateAst, parseFormulaUncached } from './formula-evaluator.js';\nimport type { FormulaNode } from './formula-node.js';\nimport type { WorksheetLike, WorkbookLike } from './formula-context.js';\nimport { extractReferences, refContains, type PrecedentRef } from './recalc-references.js';\nimport { DependencyIndex } from './dependency-index.js';\n\n// ── Core Workbook adapter ──────────────────────────────────────────────────────\n\ninterface CoreCellLike {\n setComputedValue(value: unknown): unknown;\n setFormula(formula: string): unknown;\n setArrayRef(spillRef: string | null): unknown;\n clear(): void;\n}\ninterface CoreSheetLike {\n getCellValue(ref: string): unknown;\n getCell(ref: string): CoreCellLike;\n getCellFormula?(ref: string): string | null;\n getSpillRange?(ref: string): string | null;\n isRowHidden?(row: number): boolean;\n}\ninterface CoreWorkbookLike {\n getWorksheet(name: string): CoreSheetLike;\n getDefinedName(name: string, sheet?: string): string | undefined;\n}\n\n/**\n * Adapts a @devmm/puredocs-excel Workbook to a RecalcModel so the engine can\n * read cell values and write computed results back into the document (via\n * Cell.setComputedValue, which preserves the formula). Named ranges defined on\n * the workbook are resolved automatically.\n */\nexport function createWorkbookRecalcModel(workbook: CoreWorkbookLike): RecalcModel {\n return {\n getCellValue: (sheet, ref) => workbook.getWorksheet(sheet).getCellValue(ref),\n setCellValue: (sheet, ref, value) => { workbook.getWorksheet(sheet).getCell(ref).setComputedValue(value); },\n setCellFormula: (sheet, ref, formula) => { workbook.getWorksheet(sheet).getCell(ref).setFormula(formula); },\n clearCell: (sheet, ref) => { workbook.getWorksheet(sheet).getCell(ref).clear(); },\n setCellArrayRef: (sheet, ref, spillRef) => { workbook.getWorksheet(sheet).getCell(ref).setArrayRef(spillRef); },\n getCellFormula: (sheet, ref) => workbook.getWorksheet(sheet).getCellFormula?.(ref) ?? null,\n getSpillRange: (sheet, ref) => workbook.getWorksheet(sheet).getSpillRange?.(ref) ?? null,\n isRowHidden: (sheet, row) => workbook.getWorksheet(sheet).isRowHidden?.(row) ?? false,\n getDefinedName: (name, sheet) => workbook.getDefinedName(name, sheet),\n };\n}\n\n/** Minimal storage abstraction the engine reads inputs from and writes results to. */\nexport interface RecalcModel {\n /** Current value of a cell (raw input value, or last computed value). */\n getCellValue(sheet: string, ref: string): unknown;\n /** Store a computed formula result. Must NOT clear the cell's formula. */\n setCellValue(sheet: string, ref: string, value: unknown): void;\n /**\n * Optional: persist a formula string on a cell so it serialises with the\n * document. When present, the engine calls it from setCellFormula so the\n * model stays the source of truth for the formula text.\n */\n setCellFormula?(sheet: string, ref: string, formula: string): void;\n /** Optional: clear a cell (value + formula) — used by clearCellFormula. */\n clearCell?(sheet: string, ref: string): void;\n /** Optional: mark/unmark a cell as a dynamic-array anchor with its spill range. */\n setCellArrayRef?(sheet: string, ref: string, spillRef: string | null): void;\n /** Optional: formula text of a cell (lets SUBTOTAL skip nested calls). */\n getCellFormula?(sheet: string, ref: string): string | null;\n /** Optional: spill range of a dynamic-array anchor (enables A1#). */\n getSpillRange?(sheet: string, ref: string): string | null;\n /** Optional: whether a 1-based row is hidden (SUBTOTAL/AGGREGATE). */\n isRowHidden?(sheet: string, row: number): boolean;\n /** Optional defined-name resolver (enables named ranges in formulas). */\n getDefinedName?(name: string, sheet?: string): string | undefined;\n}\n\n/** One recomputed cell, in evaluation order. */\nexport interface RecalcResult {\n readonly sheet: string;\n readonly ref: string;\n /** The written JS value (null/number/string/boolean). For a dynamic array,\n * this is the anchor's top-left value. */\n readonly value: unknown;\n /** True when the cell is part of a circular reference. */\n readonly circular?: boolean;\n /** For a dynamic-array anchor: the spilled block size (rows × cols). */\n readonly spill?: { rows: number; cols: number };\n}\n\ninterface FormulaEntry {\n sheet: string; // upper-cased key (for graph/containment)\n sheetName: string; // original casing (for model I/O)\n ref: string; // normalised (no '$', upper-cased)\n /** Precomputed `SHEET!REF` map key — rebuilding it is pure string churn. */\n key: string;\n row: number;\n col: number;\n formula: string; // without leading '='\n /**\n * Parsed form of `formula`, kept for the lifetime of the registration so\n * repeated evaluation never re-parses and never depends on the global AST\n * cache still holding this text. Cleared when the text is rewritten.\n */\n ast?: FormulaNode;\n refs: PrecedentRef[];\n volatile: boolean;\n}\n\n/** A cell coordinate with its upper-cased sheet key. */\ninterface CellRC { sheet: string; row: number; col: number }\n\nconst normSheet = (s: string): string => s.toUpperCase();\nconst normRef = (r: string): string => r.replace(/\\$/g, '').toUpperCase();\nconst keyOf = (sheet: string, ref: string): string => `${normSheet(sheet)}!${normRef(ref)}`;\n\n/** Splits a \"SHEET!REF\" key back into its parts (sheet upper-cased). */\nfunction parseKey(key: string): { sheet: string; ref: string; row: number; col: number } {\n const bang = key.indexOf('!');\n const sheet = key.slice(0, bang);\n const ref = key.slice(bang + 1);\n const { row, column } = parseCellRef(ref);\n return { sheet, ref, row, col: column };\n}\n\nexport class RecalcEngine {\n readonly #model: RecalcModel;\n readonly #registry: FunctionRegistry;\n #formulas = new Map<string, FormulaEntry>();\n /** upper-cased sheet key → original casing, for case-correct model I/O. */\n readonly #sheetNames = new Map<string, string>();\n /** anchor cellKey → set of spilled (non-anchor) cellKeys it currently owns. */\n #spills = new Map<string, Set<string>>();\n /** spilled cellKey → the anchor cellKey that owns it. */\n readonly #spillOwner = new Map<string, string>();\n /**\n * Reverse dependency index, so finding the formulas that read a cell does not\n * mean testing every registered formula.\n */\n readonly #dependents = new DependencyIndex();\n /**\n * Keys of the volatile formulas. Maintained incrementally: scanning every\n * formula for volatility on each edit is O(F) per keystroke on its own.\n */\n readonly #volatiles = new Set<string>();\n /** Memoised per-sheet adapters — these are stateless w.r.t. the formula. */\n readonly #sheetLikes = new Map<string, WorksheetLike>();\n #workbookLike?: WorkbookLike;\n\n constructor(model: RecalcModel, registry: FunctionRegistry = FunctionRegistry.default) {\n this.#model = model;\n this.#registry = registry;\n }\n\n /** Registers an entry in the map, the reverse index and the volatile set. */\n #register(entry: FormulaEntry): void {\n this.#formulas.set(entry.key, entry);\n this.#dependents.add(entry.key, entry.refs);\n if (entry.volatile) this.#volatiles.add(entry.key);\n else this.#volatiles.delete(entry.key);\n }\n\n #unregister(key: string): void {\n this.#formulas.delete(key);\n this.#dependents.remove(key);\n this.#volatiles.delete(key);\n }\n\n #rememberSheet(name: string): void {\n this.#sheetNames.set(normSheet(name), name);\n }\n\n // ── Registration ─────────────────────────────────────────────────────────────\n\n /**\n * Registers (or replaces) a formula for a cell and recalculates that cell and\n * everything downstream of it. Returns the recomputed cells in the order they\n * were evaluated. The leading '=' of the formula is optional.\n */\n setCellFormula(sheet: string, ref: string, formula: string): RecalcResult[] {\n if (!formula) throw new Error('Formula cannot be empty.');\n const text = formula.startsWith('=') ? formula.slice(1) : formula;\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n\n const ast = parseFormulaUncached(text);\n const { refs, volatile } = extractReferences(\n ast,\n s,\n this.#registry,\n this.#model.getDefinedName ? (n, sh) => this.#model.getDefinedName!(n, sh) : undefined,\n );\n\n this.#rememberSheet(sheet);\n const key = keyOf(s, r);\n this.#register({\n sheet: s, sheetName: sheet, ref: r, key, row, col: column, formula: text, ast, refs, volatile,\n });\n\n // Persist the formula text on the model (source of truth for serialisation)\n // before evaluating; the computed value is written back during recalc.\n this.#model.setCellFormula?.(sheet, r, text);\n\n // Recompute this cell and its dependents.\n return this.#recalcFrom([{ sheet: s, row, col: column }], key);\n }\n\n /**\n * Removes a formula from a cell and recalculates its dependents (which may now\n * read a plain input value instead). Returns the recomputed dependent cells.\n */\n clearCellFormula(sheet: string, ref: string): RecalcResult[] {\n const s = normSheet(sheet);\n const r = normRef(ref);\n const key = keyOf(s, r);\n if (!this.#formulas.has(key)) return [];\n this.#unregister(key);\n this.#model.clearCell?.(sheet, r);\n const { row, column } = parseCellRef(r);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Writes a raw input value to a cell and recalculates every formula that\n * depends on it. Use this for non-formula edits so dependents stay current.\n */\n setCellValue(sheet: string, ref: string, value: unknown): RecalcResult[] {\n this.#rememberSheet(sheet);\n const s = normSheet(sheet);\n const r = normRef(ref);\n this.#model.setCellValue(sheet, r, value);\n const { row, column } = parseCellRef(r);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /**\n * Signals that a cell changed by some external means (the model was already\n * updated) and recalculates its dependents.\n */\n onCellChanged(sheet: string, ref: string): RecalcResult[] {\n this.#rememberSheet(sheet);\n const s = normSheet(sheet);\n const r = normRef(ref);\n const { row, column } = parseCellRef(r);\n return this.#recalcFrom([{ sheet: s, row, col: column }]);\n }\n\n /** Recalculates every registered formula in dependency order. */\n recalcAll(): RecalcResult[] {\n return this.#evaluatePass([...this.#formulas.values()]).results;\n }\n\n /** The precedents recorded for a formula cell (mainly for tests/inspection). */\n getPrecedents(sheet: string, ref: string): readonly PrecedentRef[] {\n return this.#formulas.get(keyOf(sheet, ref))?.refs ?? [];\n }\n\n // ── Structural edits ─────────────────────────────────────────────────────────\n\n /**\n * Tells the engine rows were inserted on a sheet. Call AFTER the\n * corresponding `Worksheet.insertRows` (the model must already reflect the\n * edit). The dependency graph is translated in place — registrations,\n * formula text and spill bookkeeping all move — and only volatile formulas\n * are recomputed, because a pure translation changes no values.\n *\n * @example\n * ws.insertRows(3, 2);\n * engine.onRowsInserted('S1', 3, 2);\n */\n onRowsInserted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'row', kind: 'insert', at, count, sheetName: sheet });\n }\n\n /**\n * Tells the engine rows were deleted on a sheet. Call AFTER the\n * corresponding `Worksheet.deleteRows`. Registrations inside the deleted\n * band are dropped; the rest of the graph is translated, and only formulas\n * whose precedents touched the deleted band (plus their dependents and\n * volatiles) are recomputed.\n */\n onRowsDeleted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'row', kind: 'delete', at, count, sheetName: sheet });\n }\n\n /** Column counterpart to {@link onRowsInserted}. */\n onColumnsInserted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'col', kind: 'insert', at, count, sheetName: sheet });\n }\n\n /** Column counterpart to {@link onRowsDeleted}. */\n onColumnsDeleted(sheet: string, at: number, count = 1): RecalcResult[] {\n return this.#applyShift({ dim: 'col', kind: 'delete', at, count, sheetName: sheet });\n }\n\n #applyShift(shift: RefShift): RecalcResult[] {\n const editedSheet = normSheet(shift.sheetName);\n const isRowShift = shift.dim === 'row';\n const bandEnd = shift.at + shift.count - 1;\n\n const rekeyed: FormulaEntry[] = [];\n const needsRecalc = new Set<string>();\n\n for (const e of this.#formulas.values()) {\n // Translate the registration's own position on the edited sheet.\n let row = e.row;\n let col = e.col;\n if (e.sheet === editedSheet) {\n const shifted = shiftIndex(isRowShift ? row : col, shift);\n if (shifted === null) continue; // the formula cell itself was deleted\n if (isRowShift) row = shifted; else col = shifted;\n }\n\n // Did a pre-shift precedent rectangle touch the deleted band? Those\n // formulas lost a precedent value and must be recomputed; a pure\n // translation must not be.\n const touchedBand = shift.kind === 'delete' && e.refs.some(r =>\n r.sheet === editedSheet && (isRowShift\n ? r.endRow >= shift.at && r.startRow <= bandEnd\n : r.endCol >= shift.at && r.startCol <= bandEnd));\n\n const rewritten = shiftFormulaRefs(e.formula, shift, e.sheetName);\n const moved = row !== e.row || col !== e.col;\n const ref = moved ? cellRefFromRowCol(row, col) : e.ref;\n const key = moved ? keyOf(e.sheet, ref) : e.key;\n\n rekeyed.push({\n ...e,\n ref,\n key,\n row,\n col,\n formula: rewritten.changed ? rewritten.text : e.formula,\n // A rewritten formula's cached AST no longer matches its text; it is\n // re-parsed lazily, and only if the cell is actually evaluated again.\n ast: rewritten.changed ? undefined : e.ast,\n refs: this.#shiftPrecedents(e.refs, shift, editedSheet),\n // Volatility is a property of which *functions* a formula calls, and\n // rewriting references cannot change that.\n });\n if (touchedBand || rewritten.hasRefError) needsRecalc.add(key);\n }\n\n // Rebuild the map and the reverse index from the translated entries.\n this.#formulas = new Map();\n this.#dependents.clear();\n this.#volatiles.clear();\n for (const e of rekeyed) this.#register(e);\n\n this.#shiftSpillBookkeeping(shift, editedSheet);\n\n // Seed the fixpoint: affected formulas (delete only) plus volatiles.\n const pending = new Map<string, FormulaEntry>();\n for (const k of needsRecalc) {\n const e = this.#formulas.get(k);\n if (e) pending.set(k, e);\n }\n for (const e of this.#formulas.values()) {\n if (e.volatile) pending.set(e.key, e);\n }\n return this.#runFixpoint(pending, new Set());\n }\n\n /**\n * Translates precedent rectangles across a structural edit.\n *\n * This is arithmetic rather than a re-parse of the rewritten formula, and the\n * two are equivalent by construction: `shiftFormulaRefs` derives the new\n * reference text by calling `shiftSpan`/`shiftIndex` on exactly these numbers,\n * so applying the same functions to the stored rectangle yields the same\n * region. A rectangle that is entirely deleted disappears, matching the\n * `#REF!` the text rewrite produces.\n */\n #shiftPrecedents(\n refs: readonly PrecedentRef[],\n shift: RefShift,\n editedSheet: string,\n ): PrecedentRef[] {\n const out: PrecedentRef[] = [];\n for (const r of refs) {\n if (r.sheet !== editedSheet) { out.push(r); continue; }\n\n if (shift.dim === 'row') {\n const span = shiftSpan(r.startRow, r.endRow, shift);\n if (!span) continue; // region deleted → the formula now reads #REF!\n out.push({\n sheet: r.sheet,\n startRow: span.start,\n endRow: Math.min(span.end, EXCEL_MAX_ROWS),\n startCol: r.startCol,\n endCol: r.endCol,\n });\n } else {\n const span = shiftSpan(r.startCol, r.endCol, shift);\n if (!span) continue;\n out.push({\n sheet: r.sheet,\n startRow: r.startRow,\n endRow: r.endRow,\n startCol: span.start,\n endCol: Math.min(span.end, EXCEL_MAX_COLUMNS),\n });\n }\n }\n return out;\n }\n\n /** Translates spill ownership across a structural edit on `editedSheet`. */\n #shiftSpillBookkeeping(shift: RefShift, editedSheet: string): void {\n const shiftCellKey = (key: string): string | null => {\n const { sheet, row, col } = parseKey(key);\n if (sheet !== editedSheet) return key;\n const r = shift.dim === 'row' ? shiftIndex(row, shift) : row;\n const c = shift.dim === 'col' ? shiftIndex(col, shift) : col;\n if (r === null || c === null) return null;\n return keyOf(sheet, cellRefFromRowCol(r, c));\n };\n\n const newSpills = new Map<string, Set<string>>();\n this.#spillOwner.clear();\n\n for (const [anchor, members] of this.#spills) {\n const newAnchor = shiftCellKey(anchor);\n if (newAnchor === null) {\n // The anchor was deleted — clear its surviving spilled values.\n for (const m of members) {\n const shifted = shiftCellKey(m);\n if (!shifted) continue;\n const cell = parseKey(shifted);\n this.#model.setCellValue(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null);\n }\n continue;\n }\n const newMembers = new Set<string>();\n for (const m of members) {\n const shifted = shiftCellKey(m);\n if (!shifted) continue;\n newMembers.add(shifted);\n this.#spillOwner.set(shifted, newAnchor);\n }\n newSpills.set(newAnchor, newMembers);\n }\n\n this.#spills = newSpills;\n }\n\n // ── Internals ────────────────────────────────────────────────────────────────\n\n /**\n * Recomputes formulas affected by the given changed cells, to a fixpoint.\n *\n * A single topological pass is not enough once dynamic arrays exist: a\n * formula that spills changes cells the graph could not know about until the\n * array was computed, and those cells may have their own dependents. So we\n * evaluate a pass, collect every cell whose value actually changed (formula\n * outputs plus spilled/cleared cells), then recompute the dependents of those\n * cells, repeating until nothing new is affected (bounded for safety).\n */\n #recalcFrom(\n seeds: CellRC[],\n includeKey?: string,\n ): RecalcResult[] {\n const results: RecalcResult[] = [];\n const evaluated = new Set<string>();\n\n // First wave: dependents of the seed cells, plus volatiles, plus a\n // freshly-set formula cell.\n let pending = this.#dependentClosure(seeds, evaluated);\n this.#addVolatiles(pending);\n if (includeKey) {\n const self = this.#formulas.get(includeKey);\n if (self) pending.set(includeKey, self);\n }\n\n results.push(...this.#runFixpoint(pending, evaluated));\n return results;\n }\n\n /** Evaluates `pending` entries to a fixpoint, following spill-induced changes. */\n #runFixpoint(pending: Map<string, FormulaEntry>, evaluated: Set<string>): RecalcResult[] {\n const results: RecalcResult[] = [];\n let guard = 0;\n const maxIterations = this.#formulas.size + 8;\n while (pending.size > 0 && guard++ <= maxIterations) {\n const { results: passResults, changed } = this.#evaluatePass([...pending.values()]);\n results.push(...passResults);\n for (const k of pending.keys()) evaluated.add(k);\n pending = this.#dependentClosure(changed, evaluated);\n }\n return results;\n }\n\n /** Adds every volatile formula to a pending set. */\n #addVolatiles(pending: Map<string, FormulaEntry>): void {\n for (const key of this.#volatiles) {\n const e = this.#formulas.get(key);\n if (e) pending.set(key, e);\n }\n }\n\n /**\n * Formula entries (not yet evaluated) whose precedents include one of the\n * cells, transitively. The queue is walked with a head index — Array.shift()\n * is O(n) per dequeue, which turns a long dependency chain quadratic.\n */\n #dependentClosure(cells: CellRC[], evaluated: Set<string>): Map<string, FormulaEntry> {\n const out = new Map<string, FormulaEntry>();\n const queue: CellRC[] = [...cells];\n for (let head = 0; head < queue.length; head++) {\n const cell = queue[head]!;\n this.#forEachDirectDependent(cell, dep => {\n if (out.has(dep.key) || evaluated.has(dep.key)) return;\n out.set(dep.key, dep);\n queue.push({ sheet: dep.sheet, row: dep.row, col: dep.col });\n });\n }\n return out;\n }\n\n /**\n * Visits the formula entries whose precedents include the given cell, via the\n * reverse index. The index over-approximates (it buckets rectangles into\n * tiles), so each candidate is still confirmed against its real rectangles.\n */\n #forEachDirectDependent(cell: CellRC, visit: (entry: FormulaEntry) => void): void {\n this.#dependents.candidates(cell.sheet, cell.row, cell.col, key => {\n const e = this.#formulas.get(key);\n if (!e) return;\n for (const ref of e.refs) {\n if (refContains(ref, cell.sheet, cell.row, cell.col)) { visit(e); return; }\n }\n });\n }\n\n /**\n * Topologically sorts the given entries and evaluates them, writing results\n * (scalars or spilled arrays) back to the model. Returns the results and the\n * flat list of cells whose value changed. Entries left in a cycle are #REF!.\n */\n #evaluatePass(entries: FormulaEntry[]): { results: RecalcResult[]; changed: CellRC[] } {\n const inSet = new Map<string, FormulaEntry>();\n for (const e of entries) inSet.set(e.key, e);\n\n // Build edges precedent → dependent, restricted to entries in this pass.\n // Driven from the reverse index: asking \"who reads this cell\" for each pass\n // member is O(candidates), where testing every pair would be O(n²).\n const indegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const k of inSet.keys()) { indegree.set(k, 0); dependents.set(k, []); }\n\n for (const pe of entries) {\n const seen = new Set<string>();\n this.#forEachDirectDependent({ sheet: pe.sheet, row: pe.row, col: pe.col }, dep => {\n if (dep.key === pe.key || !inSet.has(dep.key) || seen.has(dep.key)) return;\n seen.add(dep.key);\n dependents.get(pe.key)!.push(dep.key);\n indegree.set(dep.key, indegree.get(dep.key)! + 1);\n });\n }\n\n // Kahn topological sort. The ready list is drained with a head index, since\n // Array.shift() would be O(n) per step.\n const ready: string[] = [];\n for (const [k, d] of indegree) if (d === 0) ready.push(k);\n const order: string[] = [];\n for (let head = 0; head < ready.length; head++) {\n const k = ready[head]!;\n order.push(k);\n for (const d of dependents.get(k)!) {\n const left = indegree.get(d)! - 1;\n indegree.set(d, left);\n if (left === 0) ready.push(d);\n }\n }\n\n const results: RecalcResult[] = [];\n const changed: CellRC[] = [];\n const emitted = new Set(order);\n\n for (const k of order) {\n const e = inSet.get(k)!;\n const { result, changed: c } = this.#writeResult(e);\n results.push(result);\n changed.push(...c);\n }\n\n // Anything not emitted is in a circular reference.\n for (const [k, e] of inSet) {\n if (emitted.has(k)) continue;\n this.#clearSpill(e.key, changed);\n const value = FormulaValue.errorRef.toObject();\n this.#model.setCellValue(e.sheetName, e.ref, value);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n results.push({ sheet: e.sheetName, ref: e.ref, value, circular: true });\n }\n\n return { results, changed };\n }\n\n /**\n * Evaluates one formula and writes its result. Scalars go to the anchor cell.\n * Arrays spill across a block anchored at the formula cell: on a collision\n * with existing content the anchor becomes #SPILL! and nothing spills; when\n * an array shrinks, previously-spilled cells it no longer covers are cleared.\n */\n #writeResult(e: FormulaEntry): { result: RecalcResult; changed: CellRC[] } {\n const anchorKey = e.key;\n const fv = this.#evaluateFormulaValue(e);\n const changed: CellRC[] = [];\n const prevSpill = this.#spills.get(anchorKey) ?? new Set<string>();\n\n if (!fv.isArray) {\n this.#clearSpill(anchorKey, changed);\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\n const value = fv.toObject();\n this.#model.setCellValue(e.sheetName, e.ref, value);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\n }\n\n const arr = fv.arrayVal;\n const rows = arr.rows, cols = arr.columns;\n\n // Collision check for every non-anchor cell in the target block.\n let collides = false;\n for (let dr = 0; dr < rows && !collides; dr++) {\n for (let dc = 0; dc < cols && !collides; dc++) {\n if (dr === 0 && dc === 0) continue;\n const r = e.row + dr, c = e.col + dc;\n const cellKey = keyOf(e.sheet, cellRefFromRowCol(r, c));\n if (this.#isOccupied(cellKey, e.sheetName, cellRefFromRowCol(r, c), anchorKey, prevSpill)) {\n collides = true;\n }\n }\n }\n\n if (collides) {\n this.#clearSpill(anchorKey, changed);\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, null);\n const value = FormulaValue.error(FormulaError.Spill).toObject(); // '#SPILL!'\n this.#model.setCellValue(e.sheetName, e.ref, value);\n changed.push({ sheet: e.sheet, row: e.row, col: e.col });\n return { result: { sheet: e.sheetName, ref: e.ref, value }, changed };\n }\n\n // Write the block; track newly-owned spill cells.\n const newSpill = new Set<string>();\n for (let dr = 0; dr < rows; dr++) {\n for (let dc = 0; dc < cols; dc++) {\n const r = e.row + dr, c = e.col + dc;\n const ref = cellRefFromRowCol(r, c);\n this.#model.setCellValue(e.sheetName, ref, arr.get(dr, dc).toObject());\n changed.push({ sheet: e.sheet, row: r, col: c });\n if (dr !== 0 || dc !== 0) {\n const cellKey = keyOf(e.sheet, ref);\n newSpill.add(cellKey);\n this.#spillOwner.set(cellKey, anchorKey);\n }\n }\n }\n\n // Clear previously-spilled cells no longer covered.\n for (const oldKey of prevSpill) {\n if (newSpill.has(oldKey)) continue;\n const cell = parseKey(oldKey);\n this.#model.setCellValue(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null);\n this.#spillOwner.delete(oldKey);\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\n }\n\n this.#spills.set(anchorKey, newSpill);\n // Mark the anchor as a dynamic-array formula spanning the written block.\n const spillRef = `${e.ref}:${cellRefFromRowCol(e.row + rows - 1, e.col + cols - 1)}`;\n this.#model.setCellArrayRef?.(e.sheetName, e.ref, spillRef);\n return {\n result: { sheet: e.sheetName, ref: e.ref, value: arr.get(0, 0).toObject(), spill: { rows, cols } },\n changed,\n };\n }\n\n /** Whether a target cell already holds content that blocks a spill. */\n #isOccupied(\n cellKey: string,\n sheetName: string,\n ref: string,\n anchorKey: string,\n prevSpill: Set<string>,\n ): boolean {\n // Another formula living in the target block blocks the spill.\n if (this.#formulas.has(cellKey) && cellKey !== anchorKey) return true;\n // Owned by a different anchor's spill → collision.\n const owner = this.#spillOwner.get(cellKey);\n if (owner && owner !== anchorKey) return true;\n // Our own previous spill cell → free to reuse.\n if (prevSpill.has(cellKey)) return false;\n // A literal value already there → collision.\n const v = this.#model.getCellValue(sheetName, ref);\n return v !== null && v !== undefined && v !== '';\n }\n\n /** Clears an anchor's spilled cells (not the anchor itself) and forgets them. */\n #clearSpill(anchorKey: string, changed: CellRC[]): void {\n const spill = this.#spills.get(anchorKey);\n if (!spill) return;\n for (const cellKey of spill) {\n const cell = parseKey(cellKey);\n this.#model.setCellValue(this.#sheetNames.get(cell.sheet) ?? cell.sheet, cell.ref, null);\n this.#spillOwner.delete(cellKey);\n changed.push({ sheet: cell.sheet, row: cell.row, col: cell.col });\n }\n this.#spills.delete(anchorKey);\n }\n\n #evaluateFormulaValue(e: FormulaEntry): FormulaValue {\n if (!e.ast) {\n // Only reachable after a structural rewrite invalidated the cached AST.\n try {\n e.ast = parseFormulaUncached(e.formula);\n } catch {\n return FormulaValue.errorValue;\n }\n }\n return evaluateAst(e.ast, this.#sheetLike(e.sheetName), {\n workbook: this.#buildWorkbookLike(),\n formulaRow: e.row,\n formulaCol: e.col,\n });\n }\n\n /**\n * Per-sheet evaluator adapter. Memoised: these hold no per-formula state, and\n * rebuilding one (with its four closures) for every formula evaluated made a\n * full recalc allocate several objects per cell.\n */\n #sheetLike(sheetName: string): WorksheetLike {\n let cached = this.#sheetLikes.get(sheetName);\n if (!cached) {\n cached = this.#buildSheetLike(sheetName);\n this.#sheetLikes.set(sheetName, cached);\n }\n return cached;\n }\n\n #buildSheetLike(sheetName: string): WorksheetLike {\n return {\n name: sheetName,\n getCellValue: (ref: string) => this.#model.getCellValue(sheetName, ref),\n isRowHidden: this.#model.isRowHidden\n ? (row: number) => this.#model.isRowHidden!(sheetName, row)\n : undefined,\n getCellFormula: this.#model.getCellFormula\n ? (ref: string) => this.#model.getCellFormula!(sheetName, ref)\n : undefined,\n getSpillRange: this.#model.getSpillRange\n ? (ref: string) => this.#model.getSpillRange!(sheetName, ref)\n : undefined,\n };\n }\n\n #buildWorkbookLike(): WorkbookLike {\n if (this.#workbookLike) return this.#workbookLike;\n const self = this;\n return (this.#workbookLike = {\n get worksheets(): readonly WorksheetLike[] {\n return [...self.#sheetNames.values()].map(n => self.#sheetLike(n));\n },\n getWorksheet: (name: string) => self.#sheetLike(name),\n getDefinedName: this.#model.getDefinedName\n ? (name: string, sheet?: string) => this.#model.getDefinedName!(name, sheet)\n : undefined,\n });\n }\n}\n"]}