@atomic-ehr/fhirpath 0.0.3 → 0.0.4
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.browser.d.ts +22 -0
- package/dist/index.browser.js +15758 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.node.d.ts +24 -0
- package/dist/{index.js → index.node.js} +5450 -3809
- package/dist/index.node.js.map +1 -0
- package/dist/{index.d.ts → model-provider.common-oir-zg7r.d.ts} +81 -74
- package/package.json +10 -5
- package/src/analyzer.ts +46 -9
- package/src/complex-types/quantity-value.ts +131 -9
- package/src/complex-types/temporal.ts +45 -6
- package/src/errors.ts +4 -0
- package/src/index.browser.ts +4 -0
- package/src/{index.ts → index.common.ts} +18 -14
- package/src/index.node.ts +4 -0
- package/src/interpreter/navigator.ts +12 -0
- package/src/interpreter/runtime-context.ts +60 -25
- package/src/interpreter.ts +118 -33
- package/src/lexer.ts +4 -1
- package/src/model-provider.browser.ts +35 -0
- package/src/{model-provider.ts → model-provider.common.ts} +29 -26
- package/src/model-provider.node.ts +41 -0
- package/src/operations/allTrue-function.ts +6 -10
- package/src/operations/and-operator.ts +2 -2
- package/src/operations/as-function.ts +41 -0
- package/src/operations/combine-operator.ts +17 -4
- package/src/operations/comparison.ts +73 -21
- package/src/operations/convertsToQuantity-function.ts +56 -7
- package/src/operations/decode-function.ts +114 -0
- package/src/operations/divide-operator.ts +3 -3
- package/src/operations/encode-function.ts +110 -0
- package/src/operations/escape-function.ts +114 -0
- package/src/operations/exp-function.ts +65 -0
- package/src/operations/extension-function.ts +88 -0
- package/src/operations/greater-operator.ts +5 -24
- package/src/operations/greater-or-equal-operator.ts +5 -24
- package/src/operations/hasValue-function.ts +84 -0
- package/src/operations/iif-function.ts +7 -1
- package/src/operations/implies-operator.ts +1 -0
- package/src/operations/index.ts +11 -0
- package/src/operations/is-function.ts +11 -0
- package/src/operations/is-operator.ts +187 -5
- package/src/operations/less-operator.ts +6 -24
- package/src/operations/less-or-equal-operator.ts +5 -24
- package/src/operations/less-than.ts +7 -12
- package/src/operations/ln-function.ts +62 -0
- package/src/operations/log-function.ts +113 -0
- package/src/operations/lowBoundary-function.ts +14 -0
- package/src/operations/minus-operator.ts +8 -1
- package/src/operations/mod-operator.ts +7 -1
- package/src/operations/not-function.ts +9 -2
- package/src/operations/ofType-function.ts +35 -0
- package/src/operations/plus-operator.ts +46 -3
- package/src/operations/precision-function.ts +146 -0
- package/src/operations/replace-function.ts +19 -19
- package/src/operations/replaceMatches-function.ts +5 -0
- package/src/operations/sort-function.ts +209 -0
- package/src/operations/take-function.ts +1 -1
- package/src/operations/toQuantity-function.ts +0 -1
- package/src/operations/toString-function.ts +76 -12
- package/src/operations/trace-function.ts +20 -3
- package/src/operations/unescape-function.ts +119 -0
- package/src/operations/where-function.ts +3 -1
- package/src/parser.ts +14 -2
- package/src/types.ts +7 -5
- package/src/utils/decimal.ts +76 -0
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/complex-types/temporal.ts","../src/lexer.ts","../src/registry.ts","../src/operations/index.ts","../src/operations/plus-operator.ts","../src/complex-types/quantity-value.ts","../src/interpreter/boxing.ts","../src/operations/unary-plus-operator.ts","../src/operations/minus-operator.ts","../src/operations/unary-minus-operator.ts","../src/operations/multiply-operator.ts","../src/operations/divide-operator.ts","../src/operations/div-operator.ts","../src/operations/mod-operator.ts","../src/operations/less-operator.ts","../src/operations/greater-operator.ts","../src/operations/less-or-equal-operator.ts","../src/operations/greater-or-equal-operator.ts","../src/operations/equal-operator.ts","../src/operations/comparison.ts","../src/operations/not-equal-operator.ts","../src/operations/equivalent-operator.ts","../src/operations/not-equivalent-operator.ts","../src/operations/and-operator.ts","../src/operations/or-operator.ts","../src/operations/xor-operator.ts","../src/operations/implies-operator.ts","../src/operations/in-operator.ts","../src/operations/contains-operator.ts","../src/operations/is-operator.ts","../src/operations/as-operator.ts","../src/operations/ofType-function.ts","../src/operations/is-function.ts","../src/operations/as-function.ts","../src/operations/union-operator.ts","../src/operations/combine-operator.ts","../src/operations/dot-operator.ts","../src/interpreter/runtime-context.ts","../src/operations/where-function.ts","../src/operations/select-function.ts","../src/operations/repeat-function.ts","../src/operations/first-function.ts","../src/operations/last-function.ts","../src/operations/children-function.ts","../src/operations/descendants-function.ts","../src/operations/skip-function.ts","../src/operations/take-function.ts","../src/operations/tail-function.ts","../src/operations/single-function.ts","../src/operations/count-function.ts","../src/operations/exists-function.ts","../src/operations/all-function.ts","../src/operations/empty-function.ts","../src/operations/not-function.ts","../src/operations/distinct-function.ts","../src/operations/isDistinct-function.ts","../src/operations/iif-function.ts","../src/operations/defineVariable-function.ts","../src/operations/temporal-functions.ts","../src/operations/join-function.ts","../src/operations/replace-function.ts","../src/operations/union-function.ts","../src/operations/combine-function.ts","../src/operations/intersect-function.ts","../src/operations/exclude-function.ts","../src/operations/indexOf-function.ts","../src/operations/lastIndexOf-function.ts","../src/operations/substring-function.ts","../src/operations/matches-function.ts","../src/operations/matchesFull-function.ts","../src/operations/replaceMatches-function.ts","../src/operations/toChars-function.ts","../src/operations/contains-function.ts","../src/operations/startsWith-function.ts","../src/operations/endsWith-function.ts","../src/operations/length-function.ts","../src/operations/trim-function.ts","../src/operations/allTrue-function.ts","../src/operations/split-function.ts","../src/operations/upper-function.ts","../src/operations/lower-function.ts","../src/operations/allFalse-function.ts","../src/operations/anyTrue-function.ts","../src/operations/anyFalse-function.ts","../src/operations/subsetOf-function.ts","../src/operations/supersetOf-function.ts","../src/operations/toInteger-function.ts","../src/operations/toDecimal-function.ts","../src/operations/toString-function.ts","../src/operations/toBoolean-function.ts","../src/operations/toQuantity-function.ts","../src/operations/toLong-function.ts","../src/operations/convertsToBoolean-function.ts","../src/operations/convertsToInteger-function.ts","../src/operations/convertsToDecimal-function.ts","../src/operations/convertsToString-function.ts","../src/operations/convertsToQuantity-function.ts","../src/operations/convertsToLong-function.ts","../src/operations/trace-function.ts","../src/operations/dateOf-function.ts","../src/operations/timeOf-function.ts","../src/operations/yearOf-function.ts","../src/operations/monthOf-function.ts","../src/operations/dayOf-function.ts","../src/operations/hourOf-function.ts","../src/operations/minuteOf-function.ts","../src/operations/secondOf-function.ts","../src/operations/millisecondOf-function.ts","../src/operations/timezoneOffsetOf-function.ts","../src/operations/lowBoundary-function.ts","../src/operations/decimal-boundaries.ts","../src/operations/highBoundary-function.ts","../src/operations/aggregate-function.ts","../src/operations/abs-function.ts","../src/operations/ceiling-function.ts","../src/operations/floor-function.ts","../src/operations/round-function.ts","../src/operations/truncate-function.ts","../src/operations/sqrt-function.ts","../src/operations/power-function.ts","../src/parser.ts","../src/parser/cursor-nodes.ts","../src/analyzer/augmentor.ts","../src/analyzer/cursor-services.ts","../src/analyzer/trivia-indexer.ts","../src/utils/pprint.ts","../src/interpreter.ts","../src/interpreter/navigator.ts","../src/analyzer.ts","../src/analyzer/type-compat.ts","../src/analyzer/utils.ts","../src/index.ts","../src/model-provider.ts","../src/inspect.ts","../src/completion-provider.ts"],"names":["DiagnosticSeverity","ErrorCodes","TokenType","createTimeQuantity","add","Errors","evaluate","subtract","compare","isTemporalValue","equivalent","parseTemporalLiteral","isFHIRDate","isFHIRDateTime","isFHIRTime","result","ucum","MAX_LONG","MIN_LONG","truncated","ceiling","CursorContext","transform","leftResult","rightResult","argResult","isEmpty","registry","operatorDef","isOperator","asOperator","createCanonicalManager","schema","schemaHierarchy","CompletionKind","completions"],"mappings":"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","file":"index.js","sourcesContent":["import type { Token, TokenType } from './lexer';\nimport type { AnyCursorNode } from './parser/cursor-nodes';\n\n// Precedence levels (higher number = higher precedence)\nexport enum PRECEDENCE {\n // Lowest precedence\n IMPLIES = 10,\n OR = 20,\n XOR = 30,\n AND = 40,\n IN_CONTAINS = 50,\n EQUALITY = 60, // =, !=, ~, !~\n COMPARISON = 70, // <, >, <=, >=\n PIPE = 80, // |\n ADDITIVE = 90, // +, -\n MULTIPLICATIVE = 100, // *, /, div, mod\n UNARY = 110, // unary +, -, not\n AS_IS = 120, // as, is\n POSTFIX = 130, // []\n DOT = 140, // . (highest)\n}\n\nexport type TypeName = 'Any' | 'Boolean' | 'String' | 'Integer' | 'Long' | 'Decimal' | 'Date' | 'DateTime' | 'Time' | 'Quantity';\n\nexport interface TypeInfo<TypeContext = unknown> {\n // FHIRPath type\n type: TypeName;\n singleton?: boolean;\n \n // Indicates this is definitely an empty collection\n isEmpty?: boolean;\n\n // Model type information FHIR.Patient; FHIR.string; \n namespace?: string;\n name?: string;\n\n // opaque context for model provider\n modelContext?: TypeContext;\n}\n\n// Model Provider Interface (from ADR-004)\nexport interface ModelProvider<TypeContext = unknown> {\n getType(typeName: string): Promise<TypeInfo<TypeContext> | undefined>;\n \n // get element type from complex type\n getElementType(parentType: TypeInfo<TypeContext>, propertyName: string): Promise<TypeInfo<TypeContext> | undefined>;\n\n // get type from union type\n ofType(type: TypeInfo<TypeContext>, typeName: TypeName): TypeInfo<TypeContext> | undefined;\n\n // get element names from complex type\n getElementNames(parentType: TypeInfo<TypeContext>): string[];\n\n // Returns a union type of all possible child element types\n getChildrenType(parentType: TypeInfo<TypeContext>): Promise<TypeInfo<TypeContext> | undefined>;\n\n // Get detailed information about elements of a type for completion suggestions\n getElements(typeName: string): Promise<Array<{\n name: string;\n type: string;\n documentation?: string;\n }>>;\n\n // Get list of all resource types (now async for clean design)\n getResourceTypes(): Promise<string[]>;\n \n // Get list of all complex types\n getComplexTypes(): Promise<string[]>;\n \n // Get list of all primitive types\n getPrimitiveTypes(): Promise<string[]>;\n}\n\nexport interface OperatorSignature {\n name: string;\n left: TypeInfo;\n right: TypeInfo;\n result: TypeInfo | 'inputType' | 'leftType' | 'rightType';\n}\n\nexport interface OperatorDefinition {\n symbol: string;\n name: string;\n doesNotPropagateEmpty?: boolean;\n category: string[];\n precedence: PRECEDENCE;\n associativity: 'left' | 'right';\n description: string;\n examples: string[];\n signatures: OperatorSignature[];\n evaluate: OperationEvaluator;\n}\n\nexport interface RegisteredOperator extends OperatorDefinition {\n}\n\nexport interface FunctionSignature {\n name: string;\n input: TypeInfo;\n parameters: Array<{\n name: string;\n optional?: boolean;\n type: TypeInfo;\n expression?: boolean;\n typeReference?: boolean; // When true, this parameter expects a type name (e.g., ofType(Patient))\n }>;\n result: TypeInfo | 'inputType' | 'inputTypeSingleton' | 'parameterType';\n}\n\nexport interface FunctionDefinition {\n name: string;\n category: string[];\n description: string;\n examples: string[];\n signatures: FunctionSignature[];\n evaluate: FunctionEvaluator;\n inferResultType?: (\n analyzer: any,\n node: any,\n inputType?: TypeInfo\n ) => Promise<TypeInfo>;\n analyze?: (\n context: AnalysisContext,\n args: ASTNode[]\n ) => Promise<InternalAnalysisResult> | InternalAnalysisResult;\n doesNotPropagateEmpty?: boolean; // When true, function doesn't propagate empty collections\n}\n\n// Node types enum - string-based for better debugging\nexport enum NodeType {\n EOF = 'EOF',\n Binary = 'Binary',\n Unary = 'Unary',\n Identifier = 'Identifier',\n Literal = 'Literal',\n TemporalLiteral = 'TemporalLiteral',\n Function = 'Function',\n Variable = 'Variable',\n Index = 'Index',\n MembershipTest = 'MembershipTest',\n TypeCast = 'TypeCast',\n Collection = 'Collection',\n TypeReference = 'TypeReference',\n Quantity = 'Quantity',\n}\n\n// LSP-compatible position (zero-based line and character)\nexport interface Position {\n line: number; // zero-based line number (uinteger in LSP)\n character: number; // zero-based character offset within line (uinteger in LSP)\n offset?: number; // absolute offset in source (optional, for compatibility)\n}\n\n// LSP-compatible Range\nexport interface Range {\n start: Position;\n end: Position;\n}\n\n// LSP SymbolKind enum (subset of LSP spec)\nexport enum SymbolKind {\n Function = 12,\n Variable = 13,\n Property = 7,\n Field = 8,\n Method = 6,\n}\n\n// Trivia information for preserving formatting\nexport interface TriviaInfo {\n type: 'whitespace' | 'comment' | 'lineComment';\n value: string;\n range: Range;\n}\n\n// Parser options to control what gets populated\nexport interface ParserOptions {\n mode?: 'production' | 'development';\n preserveTrivia?: boolean; // Populate trivia arrays\n buildNavigation?: boolean; // Populate parent/children\n preserveSource?: boolean; // Populate raw text\n generateIds?: boolean; // Generate unique IDs\n addSymbolInfo?: boolean; // Add symbolKind for LSP\n}\n\n// Base structure for all AST nodes\nexport interface BaseASTNode {\n // Core properties - always present\n type: NodeType | 'Error' | 'CursorNode';\n \n // LSP-compatible range - always present for LSP features\n range: Range;\n \n // Optional rich information - populated based on parser options\n parent?: ASTNode; // Parent reference\n children?: ASTNode[]; // Child nodes for navigation\n \n // Source preservation (useful for refactoring)\n leadingTrivia?: TriviaInfo[]; // Comments/whitespace before\n trailingTrivia?: TriviaInfo[]; // Comments/whitespace after\n raw?: string; // Original source text\n \n // Metadata for tools\n id?: string; // Unique identifier for the node\n symbolKind?: SymbolKind; // LSP SymbolKind for outline\n \n // Type information (populated by analyzer)\n typeInfo?: TypeInfo; // Inferred type information\n}\n\n// Error node for LSP compatibility\nexport interface ErrorNode extends BaseASTNode {\n type: 'Error';\n message: string;\n expected?: string[];\n // LSP diagnostic info\n severity?: DiagnosticSeverity;\n code?: string | number;\n source?: string; // e.g., 'fhirpath'\n}\n\n// Specific node types\nexport interface IdentifierNode extends BaseASTNode {\n type: NodeType.Identifier;\n name: string;\n // Optional LSP symbol info\n symbolKind?: SymbolKind.Variable | SymbolKind.Function | SymbolKind.Property;\n}\n\nexport interface LiteralNode extends BaseASTNode {\n type: NodeType.Literal;\n value: any;\n valueType: 'string' | 'number' | 'boolean' | 'date' | 'time' | 'datetime' | 'null';\n}\n\nexport interface TemporalLiteralNode extends BaseASTNode {\n type: NodeType.TemporalLiteral;\n value: any; // The parsed temporal object\n valueType: 'date' | 'time' | 'datetime';\n rawValue: string; // The original string value (without @)\n}\n\nexport interface BinaryNode extends BaseASTNode {\n type: NodeType.Binary;\n operator: string;\n left: ASTNode;\n right: ASTNode;\n}\n\nexport interface UnaryNode extends BaseASTNode {\n type: NodeType.Unary;\n operator: string;\n operand: ASTNode;\n}\n\nexport interface FunctionNode extends BaseASTNode {\n type: NodeType.Function;\n name: ASTNode;\n arguments: ASTNode[];\n // LSP-specific\n symbolKind?: SymbolKind.Function;\n detail?: string; // Function signature for hover/outline\n}\n\nexport interface VariableNode extends BaseASTNode {\n type: NodeType.Variable;\n name: string;\n}\n\nexport interface IndexNode extends BaseASTNode {\n type: NodeType.Index;\n expression: ASTNode;\n index: ASTNode;\n}\n\nexport interface MembershipTestNode extends BaseASTNode {\n type: NodeType.MembershipTest;\n expression: ASTNode;\n targetType: string;\n}\n\nexport interface TypeCastNode extends BaseASTNode {\n type: NodeType.TypeCast;\n expression: ASTNode;\n targetType: string;\n}\n\nexport interface CollectionNode extends BaseASTNode {\n type: NodeType.Collection;\n elements: ASTNode[];\n}\n\nexport interface TypeReferenceNode extends BaseASTNode {\n type: NodeType.TypeReference;\n typeName: string;\n}\n\nexport interface QuantityNode extends BaseASTNode {\n type: NodeType.Quantity;\n value: number;\n unit: string;\n}\n\n// Unified ASTNode type - discriminated union\nexport type ASTNode = \n | IdentifierNode\n | LiteralNode\n | TemporalLiteralNode\n | BinaryNode\n | UnaryNode\n | FunctionNode\n | VariableNode\n | IndexNode\n | MembershipTestNode\n | TypeCastNode\n | CollectionNode\n | TypeReferenceNode\n | QuantityNode\n | ErrorNode\n | AnyCursorNode;\n\nexport interface RuntimeContext {\n input: any[];\n focus: any[];\n variables: Record<string, any>;\n currentNode?: ASTNode;\n modelProvider?: ModelProvider;\n}\n\n// Evaluation result - everything is a collection of boxed values\nexport interface EvaluationResult {\n value: import('./interpreter/boxing').FHIRPathValue[];\n context: RuntimeContext;\n}\n\n\nexport enum DiagnosticSeverity {\n Error = 1,\n Warning = 2,\n Information = 3,\n Hint = 4\n}\n\nexport interface Diagnostic {\n range: Range;\n severity?: DiagnosticSeverity;\n code?: string;\n source?: string;\n message: string;\n tags?: number[];\n relatedInformation?: any[];\n data?: any;\n}\n\nexport interface AnalysisResult {\n diagnostics: Diagnostic[];\n ast: ASTNode;\n type?: TypeInfo;\n userVariables?: Map<string, TypeInfo>;\n}\n\n// Parse error type\nexport interface ParseError {\n message: string;\n position: Position;\n range?: Range;\n token?: Token;\n}\n\n// Parse result for parser\nexport interface ParseResult {\n ast: ASTNode;\n errors: ParseError[];\n indexes?: {\n nodeById: Map<string, ASTNode>;\n nodesByType: Map<NodeType | 'Error' | 'CursorNode', ASTNode[]>;\n identifiers: Map<string, ASTNode[]>;\n };\n cursorContext?: {\n node: ASTNode | null;\n expectedTokens: TokenType[];\n availableCompletions: string[];\n };\n}\n\nexport type NodeEvaluator = (node: ASTNode, input: import('./interpreter/boxing').FHIRPathValue[], context: RuntimeContext) => Promise<EvaluationResult>;\n\nexport type OperationEvaluator = (input: import('./interpreter/boxing').FHIRPathValue[], context: RuntimeContext, ...args: any[]) => Promise<EvaluationResult>;\n\nexport type FunctionEvaluator = (\n input: import('./interpreter/boxing').FHIRPathValue[],\n context: RuntimeContext,\n args: ASTNode[],\n evaluator: (node: ASTNode, input: import('./interpreter/boxing').FHIRPathValue[], context: RuntimeContext) => Promise<EvaluationResult>\n) => Promise<EvaluationResult>;\n\n// Type guards for optional properties\nexport function hasParentNavigation(node: ASTNode): node is ASTNode & { parent: ASTNode; children: ASTNode[] } {\n return node.parent !== undefined && node.children !== undefined;\n}\n\nexport function hasTrivia(node: ASTNode): node is ASTNode & { leadingTrivia: TriviaInfo[]; trailingTrivia: TriviaInfo[] } {\n return node.leadingTrivia !== undefined && node.trailingTrivia !== undefined;\n}\n\nexport function hasSourceInfo(node: ASTNode): node is ASTNode & { raw: string } {\n return node.raw !== undefined;\n}\n\nexport function hasSymbolKind(node: ASTNode): node is ASTNode & { symbolKind: SymbolKind } {\n return node.symbolKind !== undefined;\n}\n\nexport function isErrorNode(node: ASTNode): node is ErrorNode {\n return node.type === 'Error';\n}\n\nexport function isIdentifierNode(node: ASTNode): node is IdentifierNode {\n return node.type === NodeType.Identifier;\n}\n\nexport function isFunctionNode(node: ASTNode): node is FunctionNode {\n return node.type === NodeType.Function;\n}\n\n/**\n * Result of analyzing a single AST node in the context-flow architecture.\n */\nexport interface InternalAnalysisResult {\n type: TypeInfo;\n diagnostics: Diagnostic[];\n context?: AnalysisContext;\n}\n\n/**\n * Immutable context that flows through the analysis tree.\n * Carries variable scopes and input types through the AST.\n */\nexport class AnalysisContext {\n constructor(\n public readonly inputType: TypeInfo,\n public readonly systemVariables: ReadonlyMap<string, TypeInfo>,\n public readonly userVariables: ReadonlyMap<string, TypeInfo>,\n private readonly analyzeNodeCallback: (node: ASTNode, ctx: AnalysisContext) => Promise<InternalAnalysisResult>,\n public readonly modelProvider?: ModelProvider,\n public readonly hasDynamicVariables: boolean = false,\n public readonly _chainHead: boolean = true\n ) {}\n\n withUserVariable(name: string, type: TypeInfo): AnalysisContext {\n const newUserVars = new Map(this.userVariables);\n newUserVars.set(name, type);\n return new AnalysisContext(\n this.inputType,\n this.systemVariables,\n newUserVars,\n this.analyzeNodeCallback,\n this.modelProvider,\n this.hasDynamicVariables,\n this._chainHead\n );\n }\n\n withSystemVariable(name: string, type: TypeInfo): AnalysisContext {\n const newSystemVars = new Map(this.systemVariables);\n newSystemVars.set(name, type);\n return new AnalysisContext(\n this.inputType,\n newSystemVars,\n this.userVariables,\n this.analyzeNodeCallback,\n this.modelProvider,\n this.hasDynamicVariables,\n this._chainHead\n );\n }\n\n withInputType(type: TypeInfo): AnalysisContext {\n return new AnalysisContext(\n type,\n this.systemVariables,\n this.userVariables,\n this.analyzeNodeCallback,\n this.modelProvider,\n this.hasDynamicVariables,\n false\n );\n }\n\n withDynamicVariables(): AnalysisContext {\n return new AnalysisContext(\n this.inputType,\n this.systemVariables,\n this.userVariables,\n this.analyzeNodeCallback,\n this.modelProvider,\n true,\n this._chainHead\n );\n }\n\n fork(): AnalysisContext {\n return new AnalysisContext(\n this.inputType,\n new Map(this.systemVariables),\n new Map(this.userVariables),\n this.analyzeNodeCallback,\n this.modelProvider,\n this.hasDynamicVariables,\n this._chainHead\n );\n }\n\n analyzeNode(node: ASTNode): Promise<InternalAnalysisResult> {\n return this.analyzeNodeCallback(node, this);\n }\n}\n","import type { Range, Diagnostic } from './types';\nimport { DiagnosticSeverity } from './types';\n\n/**\n * Base error class for all FHIRPath errors\n */\nexport class FHIRPathError extends Error {\n constructor(\n public code: string,\n message: string,\n public location?: Range\n ) {\n super(message);\n this.name = 'FHIRPathError';\n \n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Convert FHIRPathError to Diagnostic for analyzer\n */\nexport function toDiagnostic(error: FHIRPathError, severity: DiagnosticSeverity = DiagnosticSeverity.Error): Diagnostic {\n return {\n code: error.code,\n message: error.message,\n severity,\n range: error.location!,\n source: 'fhirpath'\n };\n}\n\n/**\n * Error factory with specialized constructors\n */\nexport const Errors = {\n // Resolution errors (1000-1999)\n unknownOperator(operator: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNKNOWN_OPERATOR, `Unknown operator: ${operator}`, location);\n },\n \n unknownFunction(name: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNKNOWN_FUNCTION, `Unknown function: ${name}`, location);\n },\n \n unknownVariable(name: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNKNOWN_VARIABLE, `Unknown variable: ${name}`, location);\n },\n \n unknownUserVariable(name: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNKNOWN_USER_VARIABLE, `Unknown user variable: ${name}`, location);\n },\n \n unknownProperty(property: string, type: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNKNOWN_PROPERTY, `Unknown property '${property}' on type ${type}`, location);\n },\n \n unknownNodeType(nodeType: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNKNOWN_NODE_TYPE, `Unknown node type: ${nodeType}`, location);\n },\n \n noEvaluatorFound(evaluatorType: string, name: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.NO_EVALUATOR_FOUND, `No evaluator found for ${evaluatorType}: ${name}`, location);\n },\n \n variableNotDefined(name: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.VARIABLE_NOT_DEFINED, `Variable '${name}' is not defined in the current scope`, location);\n },\n \n variableAlreadyDefined(name: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.VARIABLE_ALREADY_DEFINED, `Variable '${name}' already defined in current scope`, location);\n },\n \n // Arity errors (2000-2999)\n wrongArgumentCount(funcName: string, expected: number, actual: number, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.WRONG_ARGUMENT_COUNT, `${funcName} expects ${expected} arguments, got ${actual}`, location);\n },\n \n wrongArgumentCountRange(funcName: string, min: number, max: number, actual: number, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.WRONG_ARGUMENT_COUNT_RANGE, `${funcName} expects ${min} to ${max} arguments, got ${actual}`, location);\n },\n \n singletonRequired(funcName: string, actualCount: number, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.SINGLETON_REQUIRED, `${funcName} requires a single item, but collection has ${actualCount} items`, location);\n },\n \n stringSingletonRequired(funcName: string, actualCount: number, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.SINGLETON_REQUIRED, `${funcName} can only be used on a single string, but collection has ${actualCount} items`, location);\n },\n \n emptyNotAllowed(funcName: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.EMPTY_NOT_ALLOWED, `${funcName} cannot operate on empty collection`, location);\n },\n \n argumentRequired(funcName: string, argumentName: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.ARGUMENT_REQUIRED, `${funcName} requires ${argumentName}`, location);\n },\n \n singletonTypeRequired(funcName: string, actualType: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.SINGLETON_REQUIRED, `${funcName} expects a singleton value, but received collection type ${actualType}`, location);\n },\n \n // Type errors (3000-3999)\n \n operatorTypeMismatch(operator: string, leftType: string, rightType: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.OPERATOR_TYPE_MISMATCH, `Operator '${operator}' cannot be applied to types ${leftType} and ${rightType}`, location);\n },\n \n argumentTypeMismatch(argIndex: number, funcName: string, expected: string, actual: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.ARGUMENT_TYPE_MISMATCH, `Argument ${argIndex} of ${funcName}: expected ${expected}, got ${actual}`, location);\n },\n \n conversionFailed(value: string, targetType: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.CONVERSION_FAILED, `Cannot convert '${value}' to ${targetType}`, location);\n },\n \n invalidValueType(expected: string, actual: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_VALUE_TYPE, `${expected} expected, got ${actual}`, location);\n },\n \n invalidOperandType(operation: string, type: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_OPERAND_TYPE, `Cannot apply ${operation} to ${type}`, location);\n },\n \n stringOperationOnNonString(operation: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.STRING_OPERATION_ON_NON_STRING, `${operation} can only be used on string values`, location);\n },\n \n numericOperationOnNonNumeric(operation: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.NUMERIC_OPERATION_ON_NON_NUMERIC, `${operation} can only be applied to numeric values`, location);\n },\n \n booleanOperationOnNonBoolean(operation: string, index: number, actualType: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.BOOLEAN_OPERATION_ON_NON_BOOLEAN, `${operation} expects all items to be Boolean values, but item at index ${index} is ${actualType}`, location);\n },\n \n // Configuration errors (4000-4999)\n modelProviderRequired(operation: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.MODEL_PROVIDER_REQUIRED, \n `ModelProvider required for '${operation}' operation. Even primitive types like Boolean can fail due to choice types (e.g., Patient.deceased is actually deceasedBoolean in FHIR data)`, \n location);\n },\n \n // Syntax errors (5000-5999)\n unexpectedToken(token: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.UNEXPECTED_TOKEN, `Unexpected token: ${token}`, location);\n },\n \n expectedToken(expected: string, actual: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.EXPECTED_TOKEN, `Expected ${expected}, got ${actual}`, location);\n },\n \n invalidSyntax(details: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_SYNTAX, `Invalid syntax: ${details}`, location);\n },\n \n expectedIdentifier(after: string, actual: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.EXPECTED_IDENTIFIER, `Expected identifier after '${after}', got: ${actual}`, location);\n },\n \n expectedTypeName(actual: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.EXPECTED_TYPE_NAME, `Expected type name, got: ${actual}`, location);\n },\n \n // Domain errors (6000-6999)\n divisionByZero(location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.DIVISION_BY_ZERO, 'Division by zero', location);\n },\n \n invalidDateTimeFormat(format: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_DATE_TIME_FORMAT, `Invalid date/time format: '${format}'`, location);\n },\n \n incompatibleUnits(unit1: string, unit2: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INCOMPATIBLE_UNITS, `Cannot perform operation on incompatible units: ${unit1} and ${unit2}`, location);\n },\n \n indexOutOfBounds(index: number, size: number, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INDEX_OUT_OF_BOUNDS, `Index ${index} out of bounds for collection of size ${size}`, location);\n },\n \n invalidOperation(details: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_OPERATION, `Invalid operation: ${details}`, location);\n },\n \n invalidPrecision(operation: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_PRECISION, `${operation} precision must be a non-negative integer`, location);\n },\n \n invalidStringOperation(operation: string, paramName: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_STRING_OPERATION, `${operation} ${paramName} must be a string`, location);\n },\n \n invalidNumericOperation(operation: string, paramName: string, expectedType: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_NUMERIC_OPERATION, `${operation} ${paramName} must be ${expectedType}`, location);\n },\n \n invalidTemporalUnit(temporalType: string, unit: string, location?: Range): FHIRPathError {\n return new FHIRPathError(ErrorCodes.INVALID_TEMPORAL_UNIT, `Cannot use variable-duration unit '${unit}' with ${temporalType} - use calendar duration keywords instead`, location);\n },\n\n unsupportedTemporalUnitForType(temporalType: string, unit: string, location?: Range): FHIRPathError {\n return new FHIRPathError(\n ErrorCodes.UNSUPPORTED_TEMPORAL_UNIT_FOR_TYPE,\n `Unit '${unit}' is not allowed for ${temporalType} arithmetic; allowed units: years, months, weeks, days`,\n location\n );\n }\n};\n\n// Export error codes as enum for external use\nexport enum ErrorCodes {\n // Resolution errors (1000-1999)\n UNKNOWN_OPERATOR = 'FP1001',\n UNKNOWN_FUNCTION = 'FP1002',\n UNKNOWN_VARIABLE = 'FP1003',\n UNKNOWN_USER_VARIABLE = 'FP1004',\n UNKNOWN_PROPERTY = 'FP1005',\n UNKNOWN_NODE_TYPE = 'FP1006',\n NO_EVALUATOR_FOUND = 'FP1007',\n VARIABLE_NOT_DEFINED = 'FP1008',\n \n // Arity errors (2000-2999)\n WRONG_ARGUMENT_COUNT = 'FP2001',\n WRONG_ARGUMENT_COUNT_RANGE = 'FP2002',\n SINGLETON_REQUIRED = 'FP2003',\n EMPTY_NOT_ALLOWED = 'FP2004',\n ARGUMENT_REQUIRED = 'FP2005',\n \n // Type errors (3000-3999)\n // FP3001 - removed (unified with FP3006)\n OPERATOR_TYPE_MISMATCH = 'FP3006',\n ARGUMENT_TYPE_MISMATCH = 'FP3003',\n CONVERSION_FAILED = 'FP3004',\n INVALID_VALUE_TYPE = 'FP3005',\n INVALID_OPERAND_TYPE = 'FP3006',\n STRING_OPERATION_ON_NON_STRING = 'FP3007',\n NUMERIC_OPERATION_ON_NON_NUMERIC = 'FP3008',\n BOOLEAN_OPERATION_ON_NON_BOOLEAN = 'FP3009',\n \n // Configuration errors (4000-4999)\n MODEL_PROVIDER_REQUIRED = 'FP4001',\n \n // Syntax errors (5000-5999)\n UNEXPECTED_TOKEN = 'FP5001',\n EXPECTED_TOKEN = 'FP5002',\n INVALID_SYNTAX = 'FP5003',\n EXPECTED_IDENTIFIER = 'FP5004',\n EXPECTED_TYPE_NAME = 'FP5005',\n \n // Domain errors (6000-6999)\n DIVISION_BY_ZERO = 'FP6001',\n INVALID_DATE_TIME_FORMAT = 'FP6002',\n INCOMPATIBLE_UNITS = 'FP6003',\n INDEX_OUT_OF_BOUNDS = 'FP6004',\n INVALID_OPERATION = 'FP6005',\n INVALID_PRECISION = 'FP6006',\n INVALID_STRING_OPERATION = 'FP6007',\n INVALID_NUMERIC_OPERATION = 'FP6008',\n VARIABLE_ALREADY_DEFINED = 'FP6009',\n INVALID_TEMPORAL_UNIT = 'FP6010',\n UNSUPPORTED_TEMPORAL_UNIT_FOR_TYPE = 'FP6011',\n \n // Static analysis warnings (7000-7999)\n UNREACHABLE_CODE = 'FP7001'\n}\n","// FHIRPath Temporal Values - Functional Implementation\n// Following ADR-019: Refactor from Classes to Functions and Interfaces\nimport { Errors } from '../errors';\n\n// ============================================================================\n// Precision System\n// ============================================================================\n\nexport interface PrecisionInfo {\n level: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' | 'millisecond';\n value: number;\n}\n\nexport const PRECISION_VALUES = {\n year: 4,\n month: 6,\n day: 8,\n hour: 10,\n minute: 12,\n second: 14,\n millisecond: 17,\n} as const;\n\nexport const DATE_PRECISIONS = ['year', 'month', 'day'] as const;\nexport type DatePrecisionLevel = typeof DATE_PRECISIONS[number];\n\nexport const TIME_PRECISIONS = ['hour', 'minute', 'second', 'millisecond'] as const;\nexport type TimePrecisionLevel = typeof TIME_PRECISIONS[number];\n\nexport type DateTimePrecisionLevel = PrecisionInfo['level'];\n\n// ============================================================================\n// Time Quantity for Arithmetic\n// ============================================================================\n\nexport type TimeUnit = 'year' | 'month' | 'week' | 'day' | \n 'hour' | 'minute' | 'second' | 'millisecond';\n\nexport interface TimeQuantity {\n readonly value: number;\n readonly unit: TimeUnit;\n readonly isCalendarUnit: boolean;\n}\n\nexport function createTimeQuantity(value: number, unit: TimeUnit): TimeQuantity {\n const calendarUnits = new Set(['year', 'years', 'month', 'months', 'week', 'weeks', 'day', 'days']);\n return {\n value,\n unit,\n isCalendarUnit: calendarUnits.has(unit)\n };\n}\n\n// ============================================================================\n// Discriminated Union Types with Interfaces\n// ============================================================================\n\nexport interface FHIRDate {\n readonly kind: 'FHIRDate';\n readonly year: number;\n readonly month?: number;\n readonly day?: number;\n readonly precision: PrecisionInfo;\n}\n\nexport interface FHIRTime {\n readonly kind: 'FHIRTime';\n readonly hour: number;\n readonly minute?: number;\n readonly second?: number;\n readonly millisecond?: number;\n readonly precision: PrecisionInfo;\n}\n\nexport interface FHIRDateTime {\n readonly kind: 'FHIRDateTime';\n readonly year: number;\n readonly month?: number;\n readonly day?: number;\n readonly hour?: number;\n readonly minute?: number;\n readonly second?: number;\n readonly millisecond?: number;\n readonly timezoneOffset?: number;\n readonly precision: PrecisionInfo;\n}\n\nexport type TemporalValue = FHIRDate | FHIRTime | FHIRDateTime;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isFHIRDate(value: any): value is FHIRDate {\n return value && typeof value === 'object' && value.kind === 'FHIRDate';\n}\n\nexport function isFHIRTime(value: any): value is FHIRTime {\n return value && typeof value === 'object' && value.kind === 'FHIRTime';\n}\n\nexport function isFHIRDateTime(value: any): value is FHIRDateTime {\n return value && typeof value === 'object' && value.kind === 'FHIRDateTime';\n}\n\nexport function isTemporalValue(value: any): value is TemporalValue {\n return isFHIRDate(value) || isFHIRTime(value) || isFHIRDateTime(value);\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport function createDate(year: number, month?: number, day?: number): FHIRDate {\n // Validation\n if (day !== undefined && month === undefined) {\n throw new Error('Month must be present if day is present');\n }\n \n if (year < 1 || year > 9999) {\n throw new Error('Year must be between 1 and 9999');\n }\n if (month !== undefined && (month < 1 || month > 12)) {\n throw new Error('Month must be between 1 and 12');\n }\n if (day !== undefined && (day < 1 || day > 31)) {\n throw new Error('Day must be between 1 and 31');\n }\n \n // Determine precision\n let level: DatePrecisionLevel;\n if (day !== undefined) {\n level = 'day';\n } else if (month !== undefined) {\n level = 'month';\n } else {\n level = 'year';\n }\n \n return {\n kind: 'FHIRDate',\n year,\n month,\n day,\n precision: {\n level,\n value: PRECISION_VALUES[level]\n }\n };\n}\n\nexport function createTime(hour: number, minute?: number, second?: number, millisecond?: number): FHIRTime {\n // Validation\n if (second !== undefined && minute === undefined) {\n throw new Error('Minute must be present if second is present');\n }\n if (millisecond !== undefined && second === undefined) {\n throw new Error('Second must be present if millisecond is present');\n }\n \n if (hour < 0 || hour > 23) {\n throw new Error('Hour must be between 0 and 23');\n }\n if (minute !== undefined && (minute < 0 || minute > 59)) {\n throw new Error('Minute must be between 0 and 59');\n }\n if (second !== undefined && (second < 0 || second > 59)) {\n throw new Error('Second must be between 0 and 59');\n }\n if (millisecond !== undefined && (millisecond < 0 || millisecond > 999)) {\n throw new Error('Millisecond must be between 0 and 999');\n }\n \n // Determine precision\n let level: TimePrecisionLevel;\n if (millisecond !== undefined) {\n level = 'millisecond';\n } else if (second !== undefined) {\n level = 'second';\n } else if (minute !== undefined) {\n level = 'minute';\n } else {\n level = 'hour';\n }\n \n // Special case: Time precision values are different\n const timePrecisionValues: Record<TimePrecisionLevel, number> = {\n hour: 4,\n minute: 6,\n second: 8,\n millisecond: 11\n };\n \n return {\n kind: 'FHIRTime',\n hour,\n minute,\n second,\n millisecond,\n precision: {\n level,\n value: timePrecisionValues[level]\n }\n };\n}\n\nexport function createDateTime(\n year: number,\n month?: number,\n day?: number,\n hour?: number,\n minute?: number,\n second?: number,\n millisecond?: number,\n timezoneOffset?: number\n): FHIRDateTime {\n // Validation\n if (day !== undefined && month === undefined) {\n throw new Error('Month must be present if day is present');\n }\n if (hour !== undefined && day === undefined) {\n throw new Error('Day must be present if hour is present');\n }\n if (minute !== undefined && hour === undefined) {\n throw new Error('Hour must be present if minute is present');\n }\n if (second !== undefined && minute === undefined) {\n throw new Error('Minute must be present if second is present');\n }\n if (millisecond !== undefined && second === undefined) {\n throw new Error('Second must be present if millisecond is present');\n }\n \n if (year < 1 || year > 9999) {\n throw new Error('Year must be between 1 and 9999');\n }\n if (month !== undefined && (month < 1 || month > 12)) {\n throw new Error('Month must be between 1 and 12');\n }\n if (day !== undefined && (day < 1 || day > 31)) {\n throw new Error('Day must be between 1 and 31');\n }\n if (hour !== undefined && (hour < 0 || hour > 23)) {\n throw new Error('Hour must be between 0 and 23');\n }\n if (minute !== undefined && (minute < 0 || minute > 59)) {\n throw new Error('Minute must be between 0 and 59');\n }\n if (second !== undefined && (second < 0 || second > 59)) {\n throw new Error('Second must be between 0 and 59');\n }\n if (millisecond !== undefined && (millisecond < 0 || millisecond > 999)) {\n throw new Error('Millisecond must be between 0 and 999');\n }\n \n // Determine precision\n let level: DateTimePrecisionLevel;\n if (millisecond !== undefined) {\n level = 'millisecond';\n } else if (second !== undefined) {\n level = 'second';\n } else if (minute !== undefined) {\n level = 'minute';\n } else if (hour !== undefined) {\n level = 'hour';\n } else if (day !== undefined) {\n level = 'day';\n } else if (month !== undefined) {\n level = 'month';\n } else {\n level = 'year';\n }\n \n return {\n kind: 'FHIRDateTime',\n year,\n month,\n day,\n hour,\n minute,\n second,\n millisecond,\n timezoneOffset,\n precision: {\n level,\n value: PRECISION_VALUES[level]\n }\n };\n}\n\n// ============================================================================\n// Comparison Operations\n// ============================================================================\n\nexport function equals(a: TemporalValue, b: TemporalValue): boolean | null {\n // Different types are never equal\n if (a.kind !== b.kind) {\n return false;\n }\n \n if (isFHIRDate(a) && isFHIRDate(b)) {\n // Compare year (always present)\n if (a.year !== b.year) return false;\n \n // Compare month - if one has it and other doesn't, return null\n if (a.month !== undefined || b.month !== undefined) {\n if (a.month === undefined || b.month === undefined) return null;\n if (a.month !== b.month) return false;\n }\n \n // Compare day - if one has it and other doesn't, return null\n if (a.day !== undefined || b.day !== undefined) {\n if (a.day === undefined || b.day === undefined) return null;\n if (a.day !== b.day) return false;\n }\n \n return true;\n }\n \n if (isFHIRTime(a) && isFHIRTime(b)) {\n // Compare hour (always present)\n if (a.hour !== b.hour) return false;\n \n // Compare minute\n if (a.minute !== undefined || b.minute !== undefined) {\n if (a.minute === undefined || b.minute === undefined) return null;\n if (a.minute !== b.minute) return false;\n }\n \n // Compare second/millisecond as a single precision per spec\n if ((a.second !== undefined || a.millisecond !== undefined) ||\n (b.second !== undefined || b.millisecond !== undefined)) {\n const aHasSecondPrecision = a.second !== undefined || a.millisecond !== undefined;\n const bHasSecondPrecision = b.second !== undefined || b.millisecond !== undefined;\n\n if (!aHasSecondPrecision || !bHasSecondPrecision) return null;\n\n // Compare as integer milliseconds for exact decimal semantics\n const aMs = (a.second ?? 0) * 1000 + (a.millisecond ?? 0);\n const bMs = (b.second ?? 0) * 1000 + (b.millisecond ?? 0);\n if (aMs !== bMs) return false;\n }\n \n return true;\n }\n \n if (isFHIRDateTime(a) && isFHIRDateTime(b)) {\n // For DateTime with timezones, must normalize or both be naive\n if (a.timezoneOffset !== undefined && b.timezoneOffset !== undefined) {\n // Both have timezones - need to normalize to UTC for comparison\n const aUtc = normalizeToUTC(a);\n const bUtc = normalizeToUTC(b);\n \n // Compare year\n if (aUtc.year !== bUtc.year) return false;\n \n // Compare month\n if (aUtc.month !== undefined || bUtc.month !== undefined) {\n if (aUtc.month === undefined || bUtc.month === undefined) return null;\n if (aUtc.month !== bUtc.month) return false;\n }\n \n // Compare day\n if (aUtc.day !== undefined || bUtc.day !== undefined) {\n if (aUtc.day === undefined || bUtc.day === undefined) return null;\n if (aUtc.day !== bUtc.day) return false;\n }\n \n // Compare hour\n if (aUtc.hour !== undefined || bUtc.hour !== undefined) {\n if (aUtc.hour === undefined || bUtc.hour === undefined) return null;\n if (aUtc.hour !== bUtc.hour) return false;\n }\n \n // Compare minute\n if (aUtc.minute !== undefined || bUtc.minute !== undefined) {\n if (aUtc.minute === undefined || bUtc.minute === undefined) return null;\n if (aUtc.minute !== bUtc.minute) return false;\n }\n \n // Compare second/millisecond as single precision\n if ((aUtc.second !== undefined || aUtc.millisecond !== undefined) ||\n (bUtc.second !== undefined || bUtc.millisecond !== undefined)) {\n const aHasSecondPrecision = aUtc.second !== undefined || aUtc.millisecond !== undefined;\n const bHasSecondPrecision = bUtc.second !== undefined || bUtc.millisecond !== undefined;\n\n if (!aHasSecondPrecision || !bHasSecondPrecision) return null;\n\n const aMs = (aUtc.second ?? 0) * 1000 + (aUtc.millisecond ?? 0);\n const bMs = (bUtc.second ?? 0) * 1000 + (bUtc.millisecond ?? 0);\n if (aMs !== bMs) return false;\n }\n \n return true;\n } else if (a.timezoneOffset === undefined && b.timezoneOffset === undefined) {\n // Both naive - direct comparison\n // Compare year\n if (a.year !== b.year) return false;\n \n // Compare month\n if (a.month !== undefined || b.month !== undefined) {\n if (a.month === undefined || b.month === undefined) return null;\n if (a.month !== b.month) return false;\n }\n \n // Compare day\n if (a.day !== undefined || b.day !== undefined) {\n if (a.day === undefined || b.day === undefined) return null;\n if (a.day !== b.day) return false;\n }\n \n // Compare hour\n if (a.hour !== undefined || b.hour !== undefined) {\n if (a.hour === undefined || b.hour === undefined) return null;\n if (a.hour !== b.hour) return false;\n }\n \n // Compare minute\n if (a.minute !== undefined || b.minute !== undefined) {\n if (a.minute === undefined || b.minute === undefined) return null;\n if (a.minute !== b.minute) return false;\n }\n \n // Compare second/millisecond as single precision\n if ((a.second !== undefined || a.millisecond !== undefined) ||\n (b.second !== undefined || b.millisecond !== undefined)) {\n const aHasSecondPrecision = a.second !== undefined || a.millisecond !== undefined;\n const bHasSecondPrecision = b.second !== undefined || b.millisecond !== undefined;\n\n if (!aHasSecondPrecision || !bHasSecondPrecision) return null;\n\n const aMs = (a.second ?? 0) * 1000 + (a.millisecond ?? 0);\n const bMs = (b.second ?? 0) * 1000 + (b.millisecond ?? 0);\n if (aMs !== bMs) return false;\n }\n \n return true;\n } else {\n // One has timezone, one doesn't - can't determine equality\n return null;\n }\n }\n \n return false;\n}\n\nexport function equivalent(a: TemporalValue, b: TemporalValue): boolean {\n // Different types are never equivalent\n if (a.kind !== b.kind) {\n return false;\n }\n \n // Different precision is false for equivalent\n if (a.precision.value !== b.precision.value) {\n return false;\n }\n \n // For same type and precision, use equals logic\n const result = equals(a, b);\n return result === true; // Convert null to false\n}\n\nexport function compare(a: TemporalValue, b: TemporalValue): -1 | 0 | 1 | null {\n // Different types can't be compared\n if (a.kind !== b.kind) {\n return null;\n }\n \n if (isFHIRDate(a) && isFHIRDate(b)) {\n // Compare year (always present)\n if (a.year !== b.year) return a.year < b.year ? -1 : 1;\n \n // Compare month - if one has it and other doesn't, return null\n if (a.month !== undefined || b.month !== undefined) {\n if (a.month === undefined || b.month === undefined) return null;\n if (a.month !== b.month) return a.month < b.month ? -1 : 1;\n }\n \n // Compare day - if one has it and other doesn't, return null\n if (a.day !== undefined || b.day !== undefined) {\n if (a.day === undefined || b.day === undefined) return null;\n if (a.day !== b.day) return a.day < b.day ? -1 : 1;\n }\n \n return 0;\n }\n \n if (isFHIRTime(a) && isFHIRTime(b)) {\n // Compare hour (always present)\n if (a.hour !== b.hour) return a.hour < b.hour ? -1 : 1;\n \n // Compare minute - if one has it and other doesn't, return null\n if (a.minute !== undefined || b.minute !== undefined) {\n if (a.minute === undefined || b.minute === undefined) return null;\n if (a.minute !== b.minute) return a.minute < b.minute ? -1 : 1;\n }\n \n // Compare seconds+milliseconds as a single precision group\n if ((a.second !== undefined || a.millisecond !== undefined) ||\n (b.second !== undefined || b.millisecond !== undefined)) {\n const aHasSecondPrecision = a.second !== undefined || a.millisecond !== undefined;\n const bHasSecondPrecision = b.second !== undefined || b.millisecond !== undefined;\n if (!aHasSecondPrecision || !bHasSecondPrecision) return null;\n const aMs = (a.second ?? 0) * 1000 + (a.millisecond ?? 0);\n const bMs = (b.second ?? 0) * 1000 + (b.millisecond ?? 0);\n if (aMs !== bMs) return aMs < bMs ? -1 : 1;\n }\n \n return 0;\n }\n \n if (isFHIRDateTime(a) && isFHIRDateTime(b)) {\n // Handle timezone comparison\n if (a.timezoneOffset !== undefined && b.timezoneOffset !== undefined) {\n // Both have timezones - normalize to UTC\n const aUtc = normalizeToUTC(a);\n const bUtc = normalizeToUTC(b);\n \n // Compare year (always present)\n if (aUtc.year !== bUtc.year) return aUtc.year < bUtc.year ? -1 : 1;\n \n // Compare month\n if (aUtc.month !== undefined || bUtc.month !== undefined) {\n if (aUtc.month === undefined || bUtc.month === undefined) return null;\n if (aUtc.month !== bUtc.month) return aUtc.month < bUtc.month ? -1 : 1;\n }\n \n // Compare day\n if (aUtc.day !== undefined || bUtc.day !== undefined) {\n if (aUtc.day === undefined || bUtc.day === undefined) return null;\n if (aUtc.day !== bUtc.day) return aUtc.day < bUtc.day ? -1 : 1;\n }\n \n // Compare hour\n if (aUtc.hour !== undefined || bUtc.hour !== undefined) {\n if (aUtc.hour === undefined || bUtc.hour === undefined) return null;\n if (aUtc.hour !== bUtc.hour) return aUtc.hour < bUtc.hour ? -1 : 1;\n }\n \n // Compare minute\n if (aUtc.minute !== undefined || bUtc.minute !== undefined) {\n if (aUtc.minute === undefined || bUtc.minute === undefined) return null;\n if (aUtc.minute !== bUtc.minute) return aUtc.minute < bUtc.minute ? -1 : 1;\n }\n \n // Compare seconds+milliseconds as a single precision group\n if ((aUtc.second !== undefined || aUtc.millisecond !== undefined) ||\n (bUtc.second !== undefined || bUtc.millisecond !== undefined)) {\n const aHasSecondPrecision = aUtc.second !== undefined || aUtc.millisecond !== undefined;\n const bHasSecondPrecision = bUtc.second !== undefined || bUtc.millisecond !== undefined;\n if (!aHasSecondPrecision || !bHasSecondPrecision) return null;\n const aMs = (aUtc.second ?? 0) * 1000 + (aUtc.millisecond ?? 0);\n const bMs = (bUtc.second ?? 0) * 1000 + (bUtc.millisecond ?? 0);\n if (aMs !== bMs) return aMs < bMs ? -1 : 1;\n }\n \n return 0;\n } else if (a.timezoneOffset === undefined && b.timezoneOffset === undefined) {\n // Both naive - direct comparison\n // Compare year (always present)\n if (a.year !== b.year) return a.year < b.year ? -1 : 1;\n \n // Compare month\n if (a.month !== undefined || b.month !== undefined) {\n if (a.month === undefined || b.month === undefined) return null;\n if (a.month !== b.month) return a.month < b.month ? -1 : 1;\n }\n \n // Compare day\n if (a.day !== undefined || b.day !== undefined) {\n if (a.day === undefined || b.day === undefined) return null;\n if (a.day !== b.day) return a.day < b.day ? -1 : 1;\n }\n \n // Compare hour\n if (a.hour !== undefined || b.hour !== undefined) {\n if (a.hour === undefined || b.hour === undefined) return null;\n if (a.hour !== b.hour) return a.hour < b.hour ? -1 : 1;\n }\n \n // Compare minute\n if (a.minute !== undefined || b.minute !== undefined) {\n if (a.minute === undefined || b.minute === undefined) return null;\n if (a.minute !== b.minute) return a.minute < b.minute ? -1 : 1;\n }\n \n // Compare seconds+milliseconds as a single precision group\n if ((a.second !== undefined || a.millisecond !== undefined) ||\n (b.second !== undefined || b.millisecond !== undefined)) {\n const aHasSecondPrecision = a.second !== undefined || a.millisecond !== undefined;\n const bHasSecondPrecision = b.second !== undefined || b.millisecond !== undefined;\n if (!aHasSecondPrecision || !bHasSecondPrecision) return null;\n const aMs = (a.second ?? 0) * 1000 + (a.millisecond ?? 0);\n const bMs = (b.second ?? 0) * 1000 + (b.millisecond ?? 0);\n if (aMs !== bMs) return aMs < bMs ? -1 : 1;\n }\n \n return 0;\n } else {\n // Mixed timezone state - can't compare\n return null;\n }\n }\n \n return null;\n}\n\n// ============================================================================\n// String Formatting\n// ============================================================================\n\nexport function toTemporalString(value: TemporalValue): string {\n if (isFHIRDate(value)) {\n return formatDate(value);\n }\n if (isFHIRTime(value)) {\n return formatTime(value);\n }\n if (isFHIRDateTime(value)) {\n return formatDateTime(value);\n }\n return '';\n}\n\nexport function toFHIRPathLiteral(value: TemporalValue): string {\n if (isFHIRDate(value)) {\n return `@${formatDate(value)}`;\n }\n if (isFHIRTime(value)) {\n return `@T${formatTime(value)}`;\n }\n if (isFHIRDateTime(value)) {\n return `@${formatDateTime(value)}`;\n }\n return '';\n}\n\nfunction formatDate(date: FHIRDate): string {\n const yearStr = date.year >= 0 && date.year < 10000 ? \n String(date.year).padStart(4, '0') : \n String(date.year);\n \n if (date.precision.level === 'year') {\n return yearStr;\n } else if (date.precision.level === 'month') {\n return `${yearStr}-${String(date.month).padStart(2, '0')}`;\n } else {\n return `${yearStr}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`;\n }\n}\n\nfunction formatTime(time: FHIRTime): string {\n let result = String(time.hour).padStart(2, '0');\n \n if (time.minute !== undefined) {\n result += ':' + String(time.minute).padStart(2, '0');\n \n if (time.second !== undefined) {\n result += ':' + String(time.second).padStart(2, '0');\n \n if (time.millisecond !== undefined) {\n result += '.' + String(time.millisecond).padStart(3, '0');\n }\n }\n }\n \n return result;\n}\n\nfunction formatDateTime(dt: FHIRDateTime): string {\n const yearStr = dt.year >= 0 && dt.year < 10000 ? \n String(dt.year).padStart(4, '0') : \n String(dt.year);\n \n let result = yearStr;\n \n if (dt.month !== undefined) {\n result += '-' + String(dt.month).padStart(2, '0');\n \n if (dt.day !== undefined) {\n result += '-' + String(dt.day).padStart(2, '0');\n \n if (dt.hour !== undefined) {\n result += 'T' + String(dt.hour).padStart(2, '0');\n \n if (dt.minute !== undefined) {\n result += ':' + String(dt.minute).padStart(2, '0');\n \n if (dt.second !== undefined) {\n result += ':' + String(dt.second).padStart(2, '0');\n \n if (dt.millisecond !== undefined) {\n result += '.' + String(dt.millisecond).padStart(3, '0');\n }\n }\n }\n \n // Add timezone\n if (dt.timezoneOffset !== undefined) {\n if (dt.timezoneOffset === 0) {\n result += 'Z';\n } else {\n const sign = dt.timezoneOffset < 0 ? '-' : '+';\n const absOffset = Math.abs(dt.timezoneOffset);\n const hours = Math.floor(absOffset / 60);\n const minutes = absOffset % 60;\n result += sign + String(hours).padStart(2, '0') + ':' + String(minutes).padStart(2, '0');\n }\n }\n }\n // No T suffix when we have complete date (year-month-day) but no time\n } else {\n // Month precision with T suffix (partial date)\n result += 'T';\n }\n } else {\n // Year precision with T suffix (partial date)\n result += 'T';\n }\n \n return result;\n}\n\n// ============================================================================\n// Parsing\n// ============================================================================\n\nexport function parseTemporalLiteral(literal: string): TemporalValue {\n if (!literal.startsWith('@')) {\n throw new Error('Temporal literal must start with @');\n }\n \n const value = literal.substring(1);\n \n // Time literal: @T...\n if (value.startsWith('T')) {\n return parseTimeLiteral(value.substring(1));\n }\n \n // Check for DateTime vs Date\n const hasTimeComponent = /T\\d/.test(value);\n \n if (hasTimeComponent) {\n return parseDateTimeLiteral(value);\n } else if (value.endsWith('T')) {\n // DateTime with only date precision\n return parseDateTimeLiteral(value.slice(0, -1));\n } else {\n // Date literal\n return parseDateLiteral(value);\n }\n}\n\nfunction parseDateLiteral(value: string): FHIRDate {\n const match = value.match(/^(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?$/);\n if (!match) {\n throw new Error(`Invalid date literal: @${value}`);\n }\n \n const year = parseInt(match[1]!, 10);\n const month = match[2] ? parseInt(match[2]!, 10) : undefined;\n const day = match[3] ? parseInt(match[3]!, 10) : undefined;\n \n return createDate(year, month, day);\n}\n\nfunction parseTimeLiteral(value: string): FHIRTime {\n const match = value.match(/^(\\d{2})(?::(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?)?$/);\n if (!match) {\n throw new Error(`Invalid time literal: @T${value}`);\n }\n \n const hour = parseInt(match[1]!, 10);\n const minute = match[2] ? parseInt(match[2]!, 10) : undefined;\n const second = match[3] ? parseInt(match[3]!, 10) : undefined;\n const millisecond = match[4] ? parseInt(match[4]!, 10) : undefined;\n \n return createTime(hour, minute, second, millisecond);\n}\n\nfunction parseDateTimeLiteral(value: string): FHIRDateTime {\n // Remove trailing T if present (for date-only DateTime)\n const cleanValue = value.endsWith('T') ? value.slice(0, -1) : value;\n \n // Split into date and time parts\n const parts = cleanValue.split('T');\n const datePart = parts[0];\n const timePart = parts[1];\n \n // Parse date part\n const dateMatch = datePart?.match(/^(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?$/);\n if (!dateMatch) {\n throw new Error(`Invalid datetime literal: @${value}`);\n }\n \n const year = parseInt(dateMatch[1]!, 10);\n const month = dateMatch[2] ? parseInt(dateMatch[2]!, 10) : undefined;\n const day = dateMatch[3] ? parseInt(dateMatch[3]!, 10) : undefined;\n \n let hour: number | undefined;\n let minute: number | undefined;\n let second: number | undefined;\n let millisecond: number | undefined;\n let timezoneOffset: number | undefined;\n \n // Parse time part if present\n if (timePart) {\n // Extract timezone\n let timeWithoutTz = timePart;\n const tzMatch = timePart.match(/(Z|[+-]\\d{2}:\\d{2})$/);\n \n if (tzMatch) {\n timeWithoutTz = timePart.substring(0, timePart.length - tzMatch[0].length);\n const tz = tzMatch[0];\n \n if (tz === 'Z') {\n timezoneOffset = 0;\n } else {\n const tzParts = tz.match(/([+-])(\\d{2}):(\\d{2})/);\n if (tzParts) {\n const sign = tzParts[1] === '+' ? 1 : -1;\n const hours = parseInt(tzParts[2]!, 10);\n const minutes = parseInt(tzParts[3]!, 10);\n timezoneOffset = sign * (hours * 60 + minutes);\n }\n }\n }\n \n // Parse time components\n const timeMatch = timeWithoutTz.match(/^(\\d{2})(?::(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?)?$/);\n if (timeMatch) {\n hour = parseInt(timeMatch[1]!, 10);\n minute = timeMatch[2] ? parseInt(timeMatch[2]!, 10) : undefined;\n second = timeMatch[3] ? parseInt(timeMatch[3]!, 10) : undefined;\n millisecond = timeMatch[4] ? parseInt(timeMatch[4]!, 10) : undefined;\n }\n }\n \n return createDateTime(year, month, day, hour, minute, second, millisecond, timezoneOffset);\n}\n\n// ============================================================================\n// Arithmetic Operations\n// ============================================================================\n\nconst DAYS_PER_MONTH = 30;\nconst DAYS_PER_YEAR = 365;\nconst DAYS_PER_WEEK = 7;\nconst HOURS_PER_DAY = 24;\nconst MINUTES_PER_HOUR = 60;\nconst SECONDS_PER_MINUTE = 60;\nconst MILLISECONDS_PER_SECOND = 1000;\n\nfunction normalizeUnit(unit: string): string {\n // Handle UCUM units\n const ucumMap: Record<string, string> = {\n // 'a' (annum) is not supported for temporal arithmetic - use 'year' keyword\n 'mo': 'month', // month\n 'wk': 'week', // week\n 'd': 'day', // day\n 'h': 'hour', // hour\n 'min': 'minute', // minute\n 's': 'second', // second\n 'ms': 'millisecond' // millisecond\n };\n \n if (ucumMap[unit]) {\n return ucumMap[unit];\n }\n \n // Remove plurals for regular units\n if (unit.endsWith('s') && unit !== 's' && unit !== 'ms') {\n return unit.slice(0, -1);\n }\n \n return unit;\n}\n\nfunction convertAndTruncate(quantity: TimeQuantity, targetUnit: string): number {\n const normalizedQuantityUnit = normalizeUnit(quantity.unit);\n \n // Direct conversion for calendar units (year <-> month)\n if (normalizedQuantityUnit === 'month' && targetUnit === 'year') {\n return Math.trunc(quantity.value / 12);\n }\n if (normalizedQuantityUnit === 'year' && targetUnit === 'month') {\n return Math.trunc(quantity.value * 12);\n }\n \n let valueInDays = 0;\n \n // Convert to days first\n switch (normalizedQuantityUnit) {\n case 'year':\n valueInDays = quantity.value * DAYS_PER_YEAR;\n break;\n case 'month':\n valueInDays = quantity.value * DAYS_PER_MONTH;\n break;\n case 'week':\n valueInDays = quantity.value * DAYS_PER_WEEK;\n break;\n case 'day':\n valueInDays = quantity.value;\n break;\n case 'hour':\n valueInDays = quantity.value / HOURS_PER_DAY;\n break;\n case 'minute':\n valueInDays = quantity.value / (HOURS_PER_DAY * MINUTES_PER_HOUR);\n break;\n case 'second':\n valueInDays = quantity.value / (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);\n break;\n case 'millisecond':\n valueInDays = quantity.value / (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND);\n break;\n }\n \n // Convert from days to target unit - use Math.trunc for truncation towards zero\n switch (targetUnit) {\n case 'year':\n return Math.trunc(valueInDays / DAYS_PER_YEAR);\n case 'month':\n return Math.trunc(valueInDays / DAYS_PER_MONTH);\n case 'day':\n return Math.trunc(valueInDays);\n case 'hour':\n return Math.trunc(valueInDays * HOURS_PER_DAY);\n case 'minute':\n return Math.trunc(valueInDays * HOURS_PER_DAY * MINUTES_PER_HOUR);\n case 'second':\n return Math.trunc(valueInDays * HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);\n case 'millisecond':\n return Math.trunc(valueInDays * HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND);\n default:\n return 0;\n }\n}\n\nexport function add(temporal: TemporalValue, quantity: TimeQuantity): TemporalValue {\n if (isFHIRDate(temporal)) {\n return addToDate(temporal, quantity);\n }\n if (isFHIRTime(temporal)) {\n return addToTime(temporal, quantity);\n }\n if (isFHIRDateTime(temporal)) {\n return addToDateTime(temporal, quantity);\n }\n return temporal;\n}\n\nexport function subtract(temporal: TemporalValue, quantity: TimeQuantity): TemporalValue {\n const negativeQuantity = createTimeQuantity(-quantity.value, quantity.unit);\n return add(temporal, negativeQuantity);\n}\n\n// Helper to get the maximum day for a given month/year\nexport function getDaysInMonth(year: number, month: number): number {\n if (month === 2) {\n // February - check for leap year\n const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);\n return isLeapYear ? 29 : 28;\n } else if ([4, 6, 9, 11].includes(month)) {\n return 30;\n } else {\n return 31;\n }\n}\n\n// Helper to clamp a day to the valid range for a month\nfunction clampDay(year: number, month: number | undefined, day: number | undefined): number | undefined {\n if (day === undefined || month === undefined) {\n return day;\n }\n const maxDay = getDaysInMonth(year, month);\n return Math.min(day, maxDay);\n}\n\nfunction addToDate(date: FHIRDate, quantity: TimeQuantity): FHIRDate {\n // Check for unsupported UCUM units\n if ((quantity.unit as string) === 'a') {\n throw Errors.invalidTemporalUnit('Date', quantity.unit as string);\n }\n\n const normalizedUnit = normalizeUnit(quantity.unit);\n\n // Only year/month/week/day units allowed for Date per spec\n if (!['year', 'month', 'week', 'day'].includes(normalizedUnit)) {\n // Includes hour/minute/second/millisecond and any other non-calendar unit\n throw Errors.unsupportedTemporalUnitForType('Date', quantity.unit as string);\n }\n\n const cal = addCalendarParts(\n date.year,\n date.month,\n date.day,\n normalizedUnit as CalendarUnit,\n quantity.value\n );\n return createDate(cal.year, cal.month, cal.day);\n}\n\nfunction addToTime(time: FHIRTime, quantity: TimeQuantity): FHIRTime {\n // Check for unsupported UCUM units\n if ((quantity.unit as string) === 'a') {\n throw new Error(\"Cannot use variable-duration unit 'a' with Time - use calendar duration keywords instead\");\n }\n \n const normalizedUnit = normalizeUnit(quantity.unit);\n \n // Only time units allowed\n if (!['hour', 'minute', 'second', 'millisecond'].includes(normalizedUnit)) {\n throw new Error(`Cannot add ${quantity.unit} to Time`);\n }\n \n // Convert everything to milliseconds\n let totalMs = time.hour * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n \n if (time.minute !== undefined) {\n totalMs += time.minute * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n }\n if (time.second !== undefined) {\n totalMs += time.second * MILLISECONDS_PER_SECOND;\n }\n if (time.millisecond !== undefined) {\n totalMs += time.millisecond;\n }\n \n // Add the quantity in milliseconds\n let quantityMs = 0;\n switch (normalizedUnit) {\n case 'hour':\n // For precisions above seconds, ignore decimal portion per spec\n quantityMs = Math.trunc(quantity.value) * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n break;\n case 'minute':\n // For precisions above seconds, ignore decimal portion per spec\n quantityMs = Math.trunc(quantity.value) * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n break;\n case 'second':\n quantityMs = quantity.value * MILLISECONDS_PER_SECOND;\n break;\n case 'millisecond':\n quantityMs = quantity.value;\n break;\n }\n \n totalMs += quantityMs;\n \n // Wrap around 24 hours\n const dayMs = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n totalMs = totalMs % dayMs;\n if (totalMs < 0) {\n totalMs += dayMs;\n }\n \n // Convert back to components\n const newHour = Math.floor(totalMs / (MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND));\n totalMs %= MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n \n let newMinute: number | undefined;\n let newSecond: number | undefined;\n let newMillisecond: number | undefined;\n \n if (time.minute !== undefined) {\n newMinute = Math.floor(totalMs / (SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND));\n totalMs %= SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n }\n \n if (time.second !== undefined) {\n newSecond = Math.floor(totalMs / MILLISECONDS_PER_SECOND);\n totalMs %= MILLISECONDS_PER_SECOND;\n \n // Include milliseconds if original had them OR if we have fractional seconds\n if (time.millisecond !== undefined || totalMs > 0) {\n newMillisecond = Math.floor(totalMs);\n }\n } else if (time.millisecond !== undefined) {\n newMillisecond = Math.floor(totalMs);\n }\n \n return createTime(newHour, newMinute, newSecond, newMillisecond);\n}\n\nfunction addToDateTime(dt: FHIRDateTime, quantity: TimeQuantity): FHIRDateTime {\n // Check for unsupported UCUM units\n if ((quantity.unit as string) === 'a') {\n throw new Error(\"Cannot use variable-duration unit 'a' with DateTime - use calendar duration keywords instead\");\n }\n \n const normalizedUnit = normalizeUnit(quantity.unit);\n let newYear = dt.year;\n let newMonth = dt.month;\n let newDay = dt.day;\n let newHour = dt.hour;\n let newMinute = dt.minute;\n let newSecond = dt.second;\n let newMillisecond = dt.millisecond;\n\n // Calendar units: delegate to shared helper\n if (['year', 'month', 'week', 'day'].includes(normalizedUnit)) {\n const cal = addCalendarParts(newYear, newMonth, newDay, normalizedUnit as CalendarUnit, quantity.value);\n newYear = cal.year;\n newMonth = cal.month;\n newDay = cal.day;\n return createDateTime(newYear, newMonth, newDay, newHour, newMinute, newSecond, newMillisecond, dt.timezoneOffset);\n }\n\n // Time units: delegate to clock helper with precision preservation\n if (['hour', 'minute', 'second', 'millisecond'].includes(normalizedUnit)) {\n const clock = addClockParts(\n dt.hour,\n dt.minute,\n dt.second,\n dt.millisecond,\n normalizedUnit as ClockUnit,\n quantity.value,\n true\n );\n newHour = clock.hour;\n newMinute = clock.minute;\n newSecond = clock.second;\n newMillisecond = clock.millisecond;\n\n if (clock.dayDelta !== 0) {\n const cal = addCalendarParts(newYear, newMonth, newDay, 'day', clock.dayDelta);\n newYear = cal.year;\n newMonth = cal.month;\n newDay = cal.day;\n }\n return createDateTime(newYear, newMonth, newDay, newHour, newMinute, newSecond, newMillisecond, dt.timezoneOffset);\n }\n\n return createDateTime(newYear, newMonth, newDay, newHour, newMinute, newSecond, newMillisecond, dt.timezoneOffset);\n}\n\n// ============================================================================\n// Component Extraction\n// ============================================================================\n\nexport function yearOf(temporal: TemporalValue): number | null {\n if (isFHIRDate(temporal) || isFHIRDateTime(temporal)) {\n return temporal.year;\n }\n return null;\n}\n\nexport function monthOf(temporal: TemporalValue): number | null {\n if (isFHIRDate(temporal) || isFHIRDateTime(temporal)) {\n return temporal.month ?? null;\n }\n return null;\n}\n\nexport function dayOf(temporal: TemporalValue): number | null {\n if (isFHIRDate(temporal) || isFHIRDateTime(temporal)) {\n return temporal.day ?? null;\n }\n return null;\n}\n\nexport function hourOf(temporal: TemporalValue): number | null {\n if (isFHIRTime(temporal)) {\n return temporal.hour;\n }\n if (isFHIRDateTime(temporal)) {\n return temporal.hour ?? null;\n }\n return null;\n}\n\nexport function minuteOf(temporal: TemporalValue): number | null {\n if (isFHIRTime(temporal)) {\n return temporal.minute ?? null;\n }\n if (isFHIRDateTime(temporal)) {\n return temporal.minute ?? null;\n }\n return null;\n}\n\nexport function secondOf(temporal: TemporalValue): number | null {\n if (isFHIRTime(temporal)) {\n return temporal.second ?? null;\n }\n if (isFHIRDateTime(temporal)) {\n return temporal.second ?? null;\n }\n return null;\n}\n\nexport function millisecondOf(temporal: TemporalValue): number | null {\n if (isFHIRTime(temporal)) {\n return temporal.millisecond ?? null;\n }\n if (isFHIRDateTime(temporal)) {\n return temporal.millisecond ?? null;\n }\n return null;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// Shared helper scaffolding for refactor (TDD-first)\nexport type CalendarUnit = 'year' | 'month' | 'week' | 'day';\nexport type ClockUnit = 'hour' | 'minute' | 'second' | 'millisecond';\n\nexport interface CalendarPartsResult {\n year: number;\n month?: number;\n day?: number;\n}\n\nexport interface ClockPartsResult {\n hour?: number;\n minute?: number;\n second?: number;\n millisecond?: number;\n // +1 when time addition crosses midnight forward, -1 when backward, 0 otherwise\n dayDelta: number;\n}\n\n// Intentionally left unimplemented for now (tests drive implementation)\nexport function addCalendarParts(\n year: number,\n month: number | undefined,\n day: number | undefined,\n unit: CalendarUnit,\n amount: number\n): CalendarPartsResult {\n const normalizedUnit = normalizeUnit(unit);\n\n let newYear = year;\n let newMonth = month;\n let newDay = day;\n\n if (normalizedUnit === 'week') {\n // Convert weeks to days using calendar semantics (truncate fractional weeks)\n const weeksToAdd = Math.trunc(amount);\n return addCalendarParts(newYear, newMonth, newDay, 'day', weeksToAdd * 7);\n }\n\n if (normalizedUnit === 'year') {\n newYear += Math.trunc(amount);\n } else if (normalizedUnit === 'month') {\n const monthsToAdd = Math.trunc(amount);\n if (newMonth !== undefined) {\n let totalMonths = (newYear * 12) + (newMonth - 1) + monthsToAdd;\n newYear = Math.floor(totalMonths / 12);\n newMonth = (totalMonths % 12) + 1;\n if (newMonth <= 0) {\n newMonth += 12;\n newYear--;\n }\n } else {\n // Coerce months into years when only year precision\n const yearsToAdd = convertAndTruncate(createTimeQuantity(amount, 'month'), 'year');\n newYear += yearsToAdd;\n }\n } else if (normalizedUnit === 'day') {\n const daysToAdd = Math.trunc(amount);\n if (newDay !== undefined && newMonth !== undefined) {\n // Proper calendar day arithmetic\n let currentYear = newYear;\n let currentMonth = newMonth;\n let currentDay = newDay + daysToAdd;\n\n while (currentDay > getDaysInMonth(currentYear, currentMonth)) {\n currentDay -= getDaysInMonth(currentYear, currentMonth);\n currentMonth++;\n if (currentMonth > 12) {\n currentMonth = 1;\n currentYear++;\n }\n }\n\n while (currentDay < 1) {\n currentMonth--;\n if (currentMonth < 1) {\n currentMonth = 12;\n currentYear--;\n }\n currentDay += getDaysInMonth(currentYear, currentMonth);\n }\n\n newYear = currentYear;\n newMonth = currentMonth;\n newDay = currentDay;\n } else if (newMonth !== undefined) {\n // Convert days to months when month precision but no day\n const monthsToAdd = convertAndTruncate(createTimeQuantity(amount, 'day'), 'month');\n let totalMonths = (newYear * 12) + (newMonth - 1) + monthsToAdd;\n newYear = Math.floor(totalMonths / 12);\n newMonth = (totalMonths % 12) + 1;\n if (newMonth <= 0) {\n newMonth += 12;\n newYear--;\n }\n } else {\n // Convert days to years when only year precision\n const yearsToAdd = convertAndTruncate(createTimeQuantity(amount, 'day'), 'year');\n newYear += yearsToAdd;\n }\n }\n\n // Clamp day for validity when we have a day and month\n newDay = clampDay(newYear, newMonth, newDay);\n\n return { year: newYear, month: newMonth, day: newDay };\n}\n\n// Intentionally left unimplemented for now (tests drive implementation)\nexport function addClockParts(\n hour: number | undefined,\n minute: number | undefined,\n second: number | undefined,\n millisecond: number | undefined,\n unit: ClockUnit,\n amount: number,\n preservePrecision: boolean = true\n): ClockPartsResult {\n const HOUR_MS = MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n const MINUTE_MS = SECONDS_PER_MINUTE * MILLISECONDS_PER_SECOND;\n const SECOND_MS = MILLISECONDS_PER_SECOND;\n const DAY_MS = HOURS_PER_DAY * HOUR_MS;\n\n // Build original total milliseconds from time-of-day\n let totalMs = (hour ?? 0) * HOUR_MS;\n if (minute !== undefined) totalMs += minute * MINUTE_MS;\n if (second !== undefined) totalMs += second * SECOND_MS;\n if (millisecond !== undefined) totalMs += millisecond;\n\n // Compute quantity in milliseconds honoring truncation rules\n let deltaMs = 0;\n if (unit === 'hour') {\n deltaMs = Math.trunc(amount) * HOUR_MS;\n } else if (unit === 'minute') {\n // precision-preserving: we'll add minutes as milliseconds, but reconstruction preserves precision\n deltaMs = Math.trunc(amount) * MINUTE_MS;\n } else if (unit === 'second') {\n deltaMs = amount * SECOND_MS; // fractions become milliseconds\n } else if (unit === 'millisecond') {\n deltaMs = amount;\n }\n\n const newTotal = totalMs + deltaMs;\n // Compute dayDelta via floor division and get a non-negative wrapped remainder\n let dayDelta = Math.floor(newTotal / DAY_MS);\n let wrapped = newTotal - dayDelta * DAY_MS;\n\n // Reconstruct time parts with precision preservation\n // Preserve hour precision: if hour was undefined, don't materialize it\n let newHour: number | undefined =\n hour !== undefined ? Math.floor(wrapped / HOUR_MS) : undefined;\n if (hour !== undefined) {\n wrapped %= HOUR_MS;\n }\n\n let newMinute: number | undefined = undefined;\n let newSecond: number | undefined = undefined;\n let newMillisecond: number | undefined = undefined;\n\n if (minute !== undefined) {\n newMinute = Math.floor(wrapped / MINUTE_MS);\n wrapped %= MINUTE_MS;\n }\n\n if (second !== undefined) {\n newSecond = Math.floor(wrapped / SECOND_MS);\n wrapped %= SECOND_MS;\n }\n\n if (millisecond !== undefined) {\n newMillisecond = Math.floor(wrapped);\n wrapped = 0;\n } else if (!preservePrecision && (second !== undefined || minute !== undefined)) {\n // Only when explicitly allowed to introduce finer precision\n newMillisecond = Math.floor(wrapped);\n wrapped = 0;\n }\n\n return {\n hour: newHour,\n minute: newMinute,\n second: newSecond,\n millisecond: newMillisecond,\n dayDelta\n };\n}\n\n// Cache for UTC-normalized DateTimes to avoid repeated conversions\nconst utcNormalizationCache = new WeakMap<FHIRDateTime, FHIRDateTime>();\n\nfunction normalizeToUTC(dt: FHIRDateTime): FHIRDateTime {\n if (dt.timezoneOffset === undefined || dt.timezoneOffset === 0) {\n return dt;\n }\n \n // Check cache first\n const cached = utcNormalizationCache.get(dt);\n if (cached) {\n return cached;\n }\n \n // Convert to total minutes and adjust\n let totalMinutes = (dt.hour ?? 0) * 60 + (dt.minute ?? 0) - dt.timezoneOffset;\n \n // Handle day boundary crossing\n let dayAdjust = 0;\n if (totalMinutes < 0) {\n dayAdjust = -Math.ceil(Math.abs(totalMinutes) / (24 * 60));\n totalMinutes += Math.abs(dayAdjust) * 24 * 60;\n } else if (totalMinutes >= 24 * 60) {\n dayAdjust = Math.floor(totalMinutes / (24 * 60));\n totalMinutes %= 24 * 60;\n }\n \n const newHour = Math.floor(totalMinutes / 60);\n const newMinute = totalMinutes % 60;\n \n // Adjust day if needed\n let newDay = dt.day;\n let newMonth = dt.month;\n let newYear = dt.year;\n \n if (dayAdjust !== 0 && newDay !== undefined && newMonth !== undefined) {\n // Use proper calendar arithmetic for day adjustment\n const tempDate = createDate(newYear, newMonth, newDay);\n const dayQuantity = createTimeQuantity(dayAdjust, 'day');\n const adjustedDate = addToDate(tempDate, dayQuantity);\n newYear = adjustedDate.year;\n newMonth = adjustedDate.month;\n newDay = adjustedDate.day;\n }\n \n const result: FHIRDateTime = {\n kind: 'FHIRDateTime',\n year: newYear,\n month: newMonth,\n day: newDay,\n hour: dt.hour !== undefined ? newHour : undefined,\n minute: dt.minute !== undefined ? newMinute : undefined,\n second: dt.second,\n millisecond: dt.millisecond,\n timezoneOffset: 0,\n precision: dt.precision\n };\n \n // Store in cache for future lookups\n utcNormalizationCache.set(dt, result);\n \n return result;\n}\n\n// ============================================================================\n// Backwards Compatibility Exports (temporary during migration)\n// ============================================================================\n\n// Export classes that map to factory functions\nexport const FHIRDate = {\n new: createDate,\n create: createDate\n};\n\nexport const FHIRTime = {\n new: createTime,\n create: createTime\n};\n\nexport const FHIRDateTime = {\n new: createDateTime,\n create: createDateTime\n};\n\n// ============================================================================\n// Boundary Functions\n// ============================================================================\n\n/**\n * Calculate the low boundary for a Date value\n */\nexport function getDateLowBoundary(date: FHIRDate, precision?: number): FHIRDate | null {\n // Validate precision\n if (precision !== undefined) {\n if (precision < 0 || precision > 8) {\n return null;\n }\n } else {\n // Default precision for Date is 8 (day)\n precision = 8;\n }\n \n // Build the boundary date based on precision\n let year = date.year;\n let month: number | undefined;\n let day: number | undefined;\n \n if (precision >= 6) {\n month = date.month ?? 1;\n }\n \n if (precision >= 8) {\n day = date.day ?? 1;\n }\n \n return createDate(year, month, day);\n}\n\n/**\n * Calculate the high boundary for a Date value\n */\nexport function getDateHighBoundary(date: FHIRDate, precision?: number): FHIRDate | null {\n // Validate precision\n if (precision !== undefined) {\n if (precision < 0 || precision > 8) {\n return null;\n }\n } else {\n // Default precision for Date is 8 (day)\n precision = 8;\n }\n \n // Build the boundary date based on precision\n let year = date.year;\n let month: number | undefined;\n let day: number | undefined;\n \n if (precision >= 6) {\n month = date.month ?? 12;\n }\n \n if (precision >= 8) {\n if (date.day !== undefined) {\n day = date.day;\n } else {\n // Need to calculate last day of month\n const actualMonth = month ?? 12;\n day = getDaysInMonth(year, actualMonth);\n }\n }\n \n return createDate(year, month, day);\n}\n\n/**\n * Calculate the low boundary for a DateTime value\n */\nexport function getDateTimeLowBoundary(dateTime: FHIRDateTime, precision?: number): FHIRDateTime | null {\n // Validate precision\n if (precision !== undefined) {\n if (precision < 0 || precision > 17) {\n return null;\n }\n } else {\n // Default precision for DateTime is 17 (millisecond)\n precision = 17;\n }\n \n // Build the boundary datetime based on precision\n let year = dateTime.year;\n let month: number | undefined;\n let day: number | undefined;\n let hour: number | undefined;\n let minute: number | undefined;\n let second: number | undefined;\n let millisecond: number | undefined;\n let timezoneOffset: number | undefined = dateTime.timezoneOffset;\n \n if (precision >= 6) {\n month = dateTime.month ?? 1;\n }\n \n if (precision >= 8) {\n day = dateTime.day ?? 1;\n }\n \n if (precision >= 10) {\n hour = dateTime.hour ?? 0;\n }\n \n if (precision >= 12) {\n minute = dateTime.minute ?? 0;\n }\n \n if (precision >= 14) {\n second = dateTime.second ?? 0;\n }\n \n if (precision >= 17) {\n millisecond = dateTime.millisecond ?? 0;\n \n // If no timezone was specified and we're at millisecond precision,\n // use the maximum positive offset (+14:00 = 840 minutes)\n if (timezoneOffset === undefined && dateTime.hour !== undefined) {\n timezoneOffset = 840; // +14:00\n }\n }\n \n return createDateTime(year, month, day, hour, minute, second, millisecond, timezoneOffset);\n}\n\n/**\n * Calculate the high boundary for a DateTime value\n */\nexport function getDateTimeHighBoundary(dateTime: FHIRDateTime, precision?: number): FHIRDateTime | null {\n // Validate precision\n if (precision !== undefined) {\n if (precision < 0 || precision > 17) {\n return null;\n }\n } else {\n // Default precision for DateTime is 17 (millisecond)\n precision = 17;\n }\n \n // Build the boundary datetime based on precision\n let year = dateTime.year;\n let month: number | undefined;\n let day: number | undefined;\n let hour: number | undefined;\n let minute: number | undefined;\n let second: number | undefined;\n let millisecond: number | undefined;\n let timezoneOffset: number | undefined = dateTime.timezoneOffset;\n \n if (precision >= 6) {\n month = dateTime.month ?? 12;\n }\n \n if (precision >= 8) {\n if (dateTime.day !== undefined) {\n day = dateTime.day;\n } else {\n // Need to calculate last day of month\n const actualMonth = month ?? 12;\n day = getDaysInMonth(year, actualMonth);\n }\n }\n \n if (precision >= 10) {\n hour = dateTime.hour ?? 23;\n }\n \n if (precision >= 12) {\n minute = dateTime.minute ?? 59;\n }\n \n if (precision >= 14) {\n second = dateTime.second ?? 59;\n }\n \n if (precision >= 17) {\n millisecond = dateTime.millisecond ?? 999;\n \n // If no timezone was specified and we're at millisecond precision,\n // use the maximum negative offset (-12:00 = -720 minutes)\n if (timezoneOffset === undefined && dateTime.hour !== undefined) {\n timezoneOffset = -720; // -12:00\n }\n }\n \n return createDateTime(year, month, day, hour, minute, second, millisecond, timezoneOffset);\n}\n\n/**\n * Calculate the low boundary for a Time value\n */\nexport function getTimeLowBoundary(time: FHIRTime, precision?: number): FHIRTime | null {\n // Validate precision\n if (precision !== undefined) {\n if (precision < 0 || precision > 9) {\n return null;\n }\n } else {\n // Default precision for Time is 9 (millisecond)\n precision = 9;\n }\n \n // Build the boundary time based on precision\n let hour = time.hour;\n let minute: number | undefined;\n let second: number | undefined;\n let millisecond: number | undefined;\n \n if (precision >= 5) {\n minute = time.minute ?? 0;\n }\n \n if (precision >= 7) {\n second = time.second ?? 0;\n }\n \n if (precision >= 9) {\n millisecond = time.millisecond ?? 0;\n }\n \n return createTime(hour, minute, second, millisecond);\n}\n\n/**\n * Calculate the high boundary for a Time value\n */\nexport function getTimeHighBoundary(time: FHIRTime, precision?: number): FHIRTime | null {\n // Validate precision\n if (precision !== undefined) {\n if (precision < 0 || precision > 9) {\n return null;\n }\n } else {\n // Default precision for Time is 9 (millisecond)\n precision = 9;\n }\n \n // Build the boundary time based on precision\n let hour = time.hour;\n let minute: number | undefined;\n let second: number | undefined;\n let millisecond: number | undefined;\n \n if (precision >= 5) {\n minute = time.minute ?? 59;\n }\n \n if (precision >= 7) {\n second = time.second ?? 59;\n }\n \n if (precision >= 9) {\n millisecond = time.millisecond ?? 999;\n }\n \n return createTime(hour, minute, second, millisecond);\n}\n","/**\n * Simplified FHIRPath Lexer\n * \n * This lexer only recognizes:\n * - Symbol operators: +, -, *, /, <, >, =, etc. (all as OPERATOR tokens)\n * - Structural tokens: (, ), [, ], {, }, ., ,\n * - Literals: numbers, strings, datetime, time\n * - Identifiers: any alphabetic sequence (including all keywords)\n * - Special identifiers: $... (context variables like $this, $index)\n * - Environment variables: %identifier, %`delimited`, %'string'\n * \n * The parser is responsible for determining which identifiers are keyword operators.\n */\n\nexport enum TokenType {\n // Special\n EOF = 0,\n \n // Literals\n IDENTIFIER = 1,\n NUMBER = 2,\n STRING = 3,\n DATETIME = 4,\n TIME = 5,\n QUANTITY = 6, // Quantity literals like 5 'mg'\n DATE = 7, // Date literals like @2020-01-01\n \n // Operators (all symbol operators consolidated)\n OPERATOR = 10, // +, -, *, /, <, >, <=, >=, =, !=, ~, !~, |, &\n \n // Structural\n DOT = 50, // .\n COMMA = 51, // ,\n LPAREN = 52, // (\n RPAREN = 53, // )\n LBRACKET = 54, // [\n RBRACKET = 55, // ]\n LBRACE = 56, // {\n RBRACE = 57, // }\n \n // Special tokens\n SPECIAL_IDENTIFIER = 60, // $...\n ENVIRONMENT_VARIABLE = 70, // %identifier, %`delimited`, %'string'\n CURSOR = 71, // Virtual cursor token for LSP support\n \n // Trivia tokens\n WHITESPACE = 80,\n LINE_COMMENT = 81,\n BLOCK_COMMENT = 82,\n}\n\nexport enum Channel {\n DEFAULT = 0,\n HIDDEN = 1,\n}\n\nimport type { Position, Range } from './types';\n\nexport interface Token {\n type: TokenType;\n value: string;\n start: number;\n end: number;\n line: number;\n column: number;\n range?: Range; // LSP-compatible range\n channel?: Channel;\n}\n\nexport interface LexerOptions {\n trackPosition?: boolean;\n preserveTrivia?: boolean;\n}\n\nexport class Lexer {\n private input: string;\n private position: number = 0;\n private line: number = 1; // Legacy: 1-based for backward compatibility\n private column: number = 1; // Legacy: 1-based for backward compatibility\n private options: LexerOptions;\n private lineOffsets: number[] = [0]; // Start positions of each line\n \n constructor(input: string, options: LexerOptions = {}) {\n this.input = input;\n this.options = {\n trackPosition: options.trackPosition ?? true,\n preserveTrivia: options.preserveTrivia ?? false,\n };\n if (this.options.trackPosition) {\n this.buildLineOffsets();\n }\n }\n \n /**\n * Build line offset map for efficient position conversions\n */\n private buildLineOffsets(): void {\n this.lineOffsets = [0];\n \n for (let i = 0; i < this.input.length; i++) {\n const char = this.input[i];\n if (char === '\\n') {\n this.lineOffsets.push(i + 1);\n } else if (char === '\\r') {\n // Handle \\r\\n as single line ending\n if (i + 1 < this.input.length && this.input[i + 1] === '\\n') {\n i++; // Skip the \\n\n }\n this.lineOffsets.push(i + 1);\n }\n }\n }\n \n tokenize(): Token[] {\n const tokens: Token[] = [];\n \n while (this.position < this.input.length) {\n const token = this.nextToken();\n if (token) {\n tokens.push(token);\n }\n }\n \n // Always add EOF token\n tokens.push(this.createToken(TokenType.EOF, '', this.position, this.position));\n \n return tokens;\n }\n \n private nextToken(): Token | null {\n // Handle whitespace if preserveTrivia is enabled\n if (this.options.preserveTrivia && this.position < this.input.length) {\n const wsStart = this.position;\n const wsStartLine = this.line;\n const wsStartColumn = this.column;\n \n if (this.isWhitespace(this.current())) {\n this.skipWhitespace();\n const wsToken = this.createToken(\n TokenType.WHITESPACE, \n this.input.substring(wsStart, this.position),\n wsStart, \n this.position, \n wsStartLine, \n wsStartColumn\n );\n wsToken.channel = Channel.HIDDEN;\n return wsToken;\n }\n } else {\n // Skip whitespace normally\n this.skipWhitespace();\n }\n \n if (this.position >= this.input.length) {\n return null;\n }\n \n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n const char = this.input[this.position]!;\n const charCode = this.input.charCodeAt(this.position);\n \n // Single character tokens\n switch (char) {\n case '/':\n // Handle comments first; otherwise treat as operator\n if (this.peek() === '/') {\n if (this.options.preserveTrivia) {\n const commentStart = this.position;\n this.skipLineComment();\n const token = this.createToken(\n TokenType.LINE_COMMENT,\n this.input.substring(commentStart, this.position),\n commentStart,\n this.position,\n startLine,\n startColumn\n );\n token.channel = Channel.HIDDEN;\n return token;\n } else {\n this.skipLineComment();\n return null;\n }\n }\n if (this.peek() === '*') {\n if (this.options.preserveTrivia) {\n const commentStart = this.position;\n this.skipBlockComment();\n const token = this.createToken(\n TokenType.BLOCK_COMMENT,\n this.input.substring(commentStart, this.position),\n commentStart,\n this.position,\n startLine,\n startColumn\n );\n token.channel = Channel.HIDDEN;\n return token;\n } else {\n this.skipBlockComment();\n return null;\n }\n }\n // Fall through to operator matching after comment checks\n return this.readOperator(start, startLine, startColumn);\n\n case '.':\n this.advance();\n return this.createToken(TokenType.DOT, '.', start, this.position, startLine, startColumn);\n \n case ',':\n this.advance();\n return this.createToken(TokenType.COMMA, ',', start, this.position, startLine, startColumn);\n \n case '(':\n this.advance();\n return this.createToken(TokenType.LPAREN, '(', start, this.position, startLine, startColumn);\n \n case ')':\n this.advance();\n return this.createToken(TokenType.RPAREN, ')', start, this.position, startLine, startColumn);\n \n case '[':\n this.advance();\n return this.createToken(TokenType.LBRACKET, '[', start, this.position, startLine, startColumn);\n \n case ']':\n this.advance();\n return this.createToken(TokenType.RBRACKET, ']', start, this.position, startLine, startColumn);\n \n case '{':\n this.advance();\n return this.createToken(TokenType.LBRACE, '{', start, this.position, startLine, startColumn);\n \n case '}':\n this.advance();\n return this.createToken(TokenType.RBRACE, '}', start, this.position, startLine, startColumn);\n \n case '%':\n return this.readEnvironmentVariable();\n \n case \"'\":\n return this.readString(\"'\");\n \n case '\"':\n // Not in spec but often supported\n return this.readString('\"');\n \n case '`':\n return this.readDelimitedIdentifier();\n \n case '@':\n return this.readDateTimeOrTime();\n \n case '$':\n return this.readSpecialIdentifier();\n }\n\n // Greedy operator matching for other operator starters\n if (this.isOperatorStarter(char)) {\n return this.readOperator(start, startLine, startColumn);\n }\n\n // Numbers\n if (charCode >= 48 && charCode <= 57) { // 0-9\n return this.readNumber();\n }\n \n // Identifiers (including all keywords)\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n charCode === 95) { // _\n return this.readIdentifier();\n }\n \n throw this.error(`Unexpected character '${char}' at position ${this.position}`);\n }\n \n private readIdentifier(): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n // First character is already validated\n this.advance();\n \n // Continue with alphanumeric or underscore\n this.scanIdentifierBody();\n \n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.IDENTIFIER, value, start, this.position, startLine, startColumn);\n }\n \n private readDelimitedIdentifier(): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n // Current must be opening backtick\n this.scanQuoted('`', 'Unterminated delimited identifier');\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.IDENTIFIER, value, start, this.position, startLine, startColumn);\n }\n \n private readSpecialIdentifier(): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n this.advance(); // Skip $\n \n // Read the identifier part (may be empty)\n this.scanIdentifierBody();\n \n const value = this.input.substring(start, this.position);\n \n // All $... tokens are SPECIAL_IDENTIFIER\n return this.createToken(TokenType.SPECIAL_IDENTIFIER, value, start, this.position, startLine, startColumn);\n }\n \n private readEnvironmentVariable(): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n this.advance(); // Skip %\n \n // Check what follows %\n const char = this.current();\n \n if (char === '`') {\n // Delimited identifier: %`identifier`\n this.scanQuoted('`', 'Unterminated environment variable');\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.ENVIRONMENT_VARIABLE, value, start, this.position, startLine, startColumn);\n } else if (char === \"'\") {\n // String format (backwards compatibility): %'identifier'\n this.scanQuoted(\"'\", 'Unterminated environment variable');\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.ENVIRONMENT_VARIABLE, value, start, this.position, startLine, startColumn);\n } else {\n // Simple identifier: %identifier\n const charCode = this.input.charCodeAt(this.position);\n if (!this.isIdentifierHead(charCode)) {\n throw this.error('Invalid environment variable name');\n }\n // Consume head and the rest of identifier\n this.advance();\n this.scanIdentifierBody();\n \n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.ENVIRONMENT_VARIABLE, value, start, this.position, startLine, startColumn);\n }\n }\n \n private readString(quote: \"'\" | '\"'): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n this.scanQuoted(quote, 'Unterminated string');\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.STRING, value, start, this.position, startLine, startColumn);\n }\n \n private readNumber(): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n // Read integer part\n while (this.position < this.input.length && this.isDigit(this.current())) {\n this.advance();\n }\n \n // Check for decimal part\n if (this.current() === '.' && this.position + 1 < this.input.length && this.input[this.position + 1] && this.isDigit(this.input[this.position + 1]!)) {\n this.advance(); // Skip .\n while (this.position < this.input.length && this.isDigit(this.current())) {\n this.advance();\n }\n }\n \n // Look ahead for a single-quoted unit to form a Quantity literal\n // Pattern: <number>[ \\t]?'<unit>' (no newline between number and unit)\n const i = this.position;\n let j = i;\n // allow spaces/tabs only; do not cross lines\n while (j < this.input.length) {\n const ch = this.input[j]!;\n if (ch === ' ' || ch === '\\t') {\n j++;\n continue;\n }\n break;\n }\n\n if (j < this.input.length && this.input[j] === \"'\") {\n // We will consume optional spaces/tabs and the quoted unit, then emit QUANTITY token\n while (this.position < j) {\n this.advance();\n }\n // Current is the opening quote; scan quoted unit including escapes\n this.scanQuoted(\"'\", 'Unterminated string');\n const quantityValue = this.input.substring(start, this.position);\n return this.createToken(TokenType.QUANTITY, quantityValue, start, this.position, startLine, startColumn);\n }\n\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.NUMBER, value, start, this.position, startLine, startColumn);\n }\n \n private readDateTimeOrTime(): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n this.advance(); // Skip @\n \n // Check if it's a time (starts with T)\n if (this.current() === 'T') {\n return this.readTime(start, startLine, startColumn);\n }\n \n // Otherwise it's a datetime\n return this.readDateTime(start, startLine, startColumn);\n }\n \n private readDateTime(start: number, startLine: number, startColumn: number): Token {\n // Year (4 digits required)\n for (let i = 0; i < 4; i++) {\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid datetime format');\n }\n this.advance();\n }\n \n let hasTime = false;\n \n // Optional month, day, time parts\n if (this.current() === '-') {\n this.advance();\n // Month (2 digits)\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid datetime format');\n }\n this.advance();\n }\n \n if (this.current() === '-') {\n this.advance();\n // Day (2 digits)\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid datetime format');\n }\n this.advance();\n }\n }\n }\n \n // Check for time part or T suffix\n if (this.current() === 'T') {\n hasTime = true;\n this.advance();\n // Check if there's actual time content after T\n if (this.isDigit(this.current())) {\n this.readTimeFormat();\n }\n // else: it's just a T suffix like @2020T or @2020-01T\n }\n \n // Optional timezone (only if we have time component with actual time values)\n if (hasTime && this.position > 0 && this.input[this.position - 1] !== 'T') {\n // Only read timezone if there's actual time content after T\n this.readTimezone();\n }\n \n const value = this.input.substring(start, this.position);\n \n // Determine token type based on content\n // DateTime: has 'T' anywhere\n // Date: no 'T' at all\n const tokenType = hasTime ? TokenType.DATETIME : TokenType.DATE;\n \n return this.createToken(tokenType, value, start, this.position, startLine, startColumn);\n }\n \n private readTime(start: number, startLine: number, startColumn: number): Token {\n this.advance(); // Skip T\n this.readTimeFormat();\n \n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.TIME, value, start, this.position, startLine, startColumn);\n }\n \n private readTimeFormat(): void {\n // Hour (2 digits)\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n return; // Time format is optional in datetime\n }\n this.advance();\n }\n \n // Optional minutes\n if (this.current() === ':') {\n this.advance();\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid time format');\n }\n this.advance();\n }\n \n // Optional seconds\n if (this.current() === ':') {\n this.advance();\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid time format');\n }\n this.advance();\n }\n \n // Optional milliseconds\n // Only consume the period if it's followed by a digit\n // This prevents consuming periods that are method calls like .toDate()\n if (this.current() === '.' && this.position + 1 < this.input.length && \n this.isDigit(this.input[this.position + 1]!)) {\n this.advance();\n while (this.isDigit(this.current())) {\n this.advance();\n }\n }\n }\n }\n }\n \n private readTimezone(): void {\n const char = this.current();\n if (char === 'Z') {\n this.advance();\n } else if (char === '+' || char === '-') {\n this.advance();\n // Hour (2 digits)\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n return; // Timezone is optional\n }\n this.advance();\n }\n if (this.current() === ':') {\n this.advance();\n // Minutes (2 digits)\n for (let i = 0; i < 2; i++) {\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid timezone format');\n }\n this.advance();\n }\n }\n }\n }\n\n // Operator utilities\n private static readonly OPERATORS: readonly string[] = [\n '!=', '!~', '<=', '>=',\n '+', '-', '*', '/', '<', '>', '=', '~', '|', '&',\n ];\n\n private isOperatorStarter(ch: string): boolean {\n switch (ch) {\n case '+':\n case '-':\n case '*':\n case '/':\n case '<':\n case '>':\n case '=':\n case '!':\n case '~':\n case '|':\n case '&':\n return true;\n default:\n return false;\n }\n }\n\n private readOperator(start: number, startLine: number, startColumn: number): Token {\n // Try longest-first\n for (const op of Lexer.OPERATORS) {\n const end = start + op.length;\n if (this.input.startsWith(op, start)) {\n // Advance to end and emit\n while (this.position < end) {\n this.advance();\n }\n return this.createToken(TokenType.OPERATOR, op, start, this.position, startLine, startColumn);\n }\n }\n // Special-case: lone '!'\n if (this.input[start] === '!') {\n // consume '!' to keep position consistent with old behavior before throwing?\n // Old code threw without consuming, but tests only assert message content.\n // Preserve position by not advancing.\n throw this.error(`Unexpected character '!' at position ${start}`);\n }\n // Fallback: treat as unexpected\n const ch = this.input[start] ?? '';\n throw this.error(`Unexpected character '${ch}' at position ${start}`);\n }\n\n // Generic quoted scanner used by strings, delimited identifiers, env vars, and quantity units\n private scanQuoted(quote: \"'\" | '\"' | '`', unterminatedMessage: string): void {\n if (this.current() !== quote) {\n throw this.error('Internal error: scanQuoted called at non-quote');\n }\n // Skip opening quote\n this.advance();\n while (this.position < this.input.length) {\n const ch = this.current();\n if (ch === quote) {\n this.advance(); // Skip closing quote\n return;\n }\n if (ch === '\\\\') {\n this.advance();\n if (this.position >= this.input.length) {\n throw this.error(unterminatedMessage);\n }\n // Skip escaped character\n this.advance();\n continue;\n }\n this.advance();\n }\n throw this.error(unterminatedMessage);\n }\n \n private skipWhitespace(): void {\n while (this.position < this.input.length) {\n const char = this.current();\n if (char === ' ' || char === '\\t' || char === '\\r' || char === '\\n') {\n this.advance();\n } else {\n break;\n }\n }\n }\n \n private skipLineComment(): void {\n // Skip //\n this.advance();\n this.advance();\n \n // Skip until end of line\n while (this.position < this.input.length && this.current() !== '\\n') {\n this.advance();\n }\n }\n \n private skipBlockComment(): void {\n // Skip /*\n this.advance();\n this.advance();\n \n // Skip until */\n while (this.position < this.input.length) {\n if (this.current() === '*' && this.peek() === '/') {\n this.advance(); // Skip *\n this.advance(); // Skip /\n break;\n }\n this.advance();\n }\n }\n \n private advance(): void {\n if (this.position < this.input.length) {\n const char = this.input[this.position]!;\n \n if (this.options.trackPosition) {\n if (char === '\\n') {\n this.line++;\n this.column = 1;\n } else if (char === '\\r') {\n // Handle \\r\\n as single line ending\n if (this.position + 1 < this.input.length && this.input[this.position + 1] === '\\n') {\n // Don't update line yet, wait for \\n\n } else {\n // Standalone \\r\n this.line++;\n this.column = 1;\n }\n } else {\n this.column++;\n }\n }\n this.position++;\n }\n }\n \n private current(): string {\n return this.position < this.input.length ? this.input[this.position]! : '';\n }\n \n private peek(): string {\n return this.position + 1 < this.input.length ? this.input[this.position + 1]! : '';\n }\n \n private isDigit(char: string): boolean {\n if (!char) return false;\n const code = char.charCodeAt(0);\n return code >= 48 && code <= 57; // 0-9\n }\n \n private isWhitespace(char: string): boolean {\n if (!char) return false;\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n }\n\n // Identifier helpers (ASCII-based)\n private isIdentifierHead(code: number): boolean {\n return (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n code === 95; // _\n }\n\n private isIdentifierPart(code: number): boolean {\n return this.isIdentifierHead(code) || (code >= 48 && code <= 57); // 0-9\n }\n\n private scanIdentifierBody(): void {\n while (this.position < this.input.length) {\n const code = this.input.charCodeAt(this.position);\n if (this.isIdentifierPart(code)) {\n this.advance();\n } else {\n break;\n }\n }\n }\n \n /**\n * Convert absolute offset to LSP Position\n */\n private offsetToPosition(offset: number): Position {\n if (!this.options.trackPosition) {\n return { line: 0, character: 0, offset };\n }\n \n // Binary search for the line\n let low = 0;\n let high = this.lineOffsets.length - 1;\n \n while (low < high) {\n const mid = Math.floor((low + high + 1) / 2);\n if (this.lineOffsets[mid]! <= offset) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n \n const line = low;\n const lineStart = this.lineOffsets[line]!;\n const character = offset - lineStart;\n \n return { line, character, offset };\n }\n \n private createToken(\n type: TokenType,\n value: string,\n start: number,\n end: number,\n line: number = this.line,\n column: number = this.column\n ): Token {\n const token: Token = {\n type,\n value,\n start,\n end,\n line: this.options.trackPosition ? line : 0,\n column: this.options.trackPosition ? column : 0,\n };\n \n // Add LSP-compatible range if tracking positions\n if (this.options.trackPosition) {\n const startPos = this.offsetToPosition(start);\n const endPos = this.offsetToPosition(end);\n token.range = {\n start: startPos,\n end: endPos\n };\n }\n \n return token;\n }\n \n private error(message: string): Error {\n if (this.options.trackPosition) {\n const pos = this.offsetToPosition(this.position);\n const line = pos.line + 1; // present as 1-based\n const col = pos.character + 1; // present as 1-based\n return new Error(`Lexer error at ${line}:${col}: ${message}`);\n }\n return new Error(`Lexer error: ${message}`);\n }\n \n // Public methods for parser use\n \n /**\n * Get the text value for a token\n */\n getTokenText(token: Token): string {\n return token.value;\n }\n \n /**\n * Check if a token is an identifier (including keyword operators)\n */\n static isIdentifier(token: Token): boolean {\n return token.type === TokenType.IDENTIFIER;\n }\n \n /**\n * Check if a token could be a keyword operator (parser decides)\n */\n static couldBeKeywordOperator(token: Token): boolean {\n return token.type === TokenType.IDENTIFIER;\n }\n}\n\n// Export a type-safe token type checker\nexport function isTokenType(token: Token, type: TokenType): boolean {\n return token.type === type;\n}\n\n// Helper to check if a token is an operator\nexport function isOperator(token: Token): boolean {\n return token.type === TokenType.OPERATOR;\n}\n\n// Helper to check if a token is a specific operator\nexport function isOperatorValue(token: Token, value: string): boolean {\n return token.type === TokenType.OPERATOR && token.value === value;\n}\n\n// Helper to check if a token is an environment variable\nexport function isEnvironmentVariable(token: Token): boolean {\n return token.type === TokenType.ENVIRONMENT_VARIABLE;\n}\n","import type { \n TypeName, \n TypeInfo, \n OperatorSignature, \n OperatorDefinition, \n RegisteredOperator, \n FunctionDefinition \n} from './types';\n\n// Re-export types\nexport type { \n TypeName, \n TypeInfo, \n OperatorSignature, \n OperatorDefinition, \n RegisteredOperator, \n FunctionDefinition \n} from './types';\n\n// Re-export precedence for backwards compatibility\nexport { PRECEDENCE } from './types';\n\nimport * as operations from './operations';\n\nexport class Registry {\n private symbolOperators = new Map<string, OperatorDefinition>();\n private keywordOperators = new Map<string, OperatorDefinition>();\n private unaryOperators = new Map<string, OperatorDefinition>();\n private functions = new Map<string, FunctionDefinition>();\n \n constructor() {\n this.registerDefaultOperators();\n }\n \n private registerDefaultOperators(): void {\n // Register all operators and functions from the operations module\n const allOperations = Object.values(operations);\n \n for (const operation of allOperations) {\n if (typeof operation === 'object') {\n if ('symbol' in operation) {\n // It's an operator\n this.registerOperator(operation);\n } else if ('signatures' in operation && !('symbol' in operation)) {\n // It's a function (has signatures but no symbol)\n this.registerFunction(operation as FunctionDefinition);\n }\n }\n }\n }\n \n private registerOperator(operator: OperatorDefinition): void {\n const symbol = operator.symbol.toLowerCase();\n \n // Check if it's a unary operator first\n if (operator.name.startsWith('unary') || operator.name === 'not') {\n this.unaryOperators.set(operator.symbol, operator);\n \n // 'not' is only unary, don't register as binary\n if (operator.name === 'not') {\n this.keywordOperators.set(symbol, operator);\n return;\n }\n }\n \n // Check if it's a keyword operator (contains only letters)\n if (/^[a-z]+$/.test(symbol)) {\n this.keywordOperators.set(symbol, operator);\n } else {\n // For symbol operators, only register non-unary versions in symbolOperators\n if (!operator.name.startsWith('unary')) {\n this.symbolOperators.set(operator.symbol, operator);\n }\n }\n }\n \n // Operator methods\n isSymbolOperator(symbol: string): boolean {\n return this.symbolOperators.has(symbol);\n }\n \n isKeywordOperator(keyword: string): boolean {\n return this.keywordOperators.has(keyword.toLowerCase());\n }\n \n isUnaryOperator(op: string): boolean {\n return this.unaryOperators.has(op);\n }\n \n isBinaryOperator(op: string): boolean {\n // 'not' is only unary, not binary\n if (op.toLowerCase() === 'not') {\n return false;\n }\n return this.isSymbolOperator(op) || this.isKeywordOperator(op);\n }\n \n getOperatorDefinition(op: string): OperatorDefinition | undefined {\n return this.symbolOperators.get(op) || \n this.keywordOperators.get(op.toLowerCase()) ||\n this.unaryOperators.get(op);\n }\n \n getPrecedence(op: string): number {\n const def = this.getOperatorDefinition(op);\n return def ? def.precedence : 0;\n }\n \n getAssociativity(op: string): 'left' | 'right' {\n const def = this.getOperatorDefinition(op);\n return def ? def.associativity : 'left';\n }\n \n // Get all keyword operators (useful for parser)\n getKeywordOperators(): string[] {\n return Array.from(this.keywordOperators.keys());\n }\n \n // Function methods\n registerFunction(def: FunctionDefinition): void {\n this.functions.set(def.name, def);\n }\n \n getFunction(name: string): FunctionDefinition | undefined {\n return this.functions.get(name);\n }\n \n isFunction(name: string): boolean {\n return this.functions.has(name);\n }\n \n // List methods for registry-lookup tool\n listFunctions(): string[] {\n return Array.from(this.functions.keys()).sort();\n }\n \n listOperators(): string[] {\n const operators = new Set<string>();\n this.symbolOperators.forEach((_, key) => operators.add(key));\n this.keywordOperators.forEach((_, key) => operators.add(key));\n this.unaryOperators.forEach((_, key) => operators.add(key));\n return Array.from(operators).sort();\n }\n \n listAllOperations(): string[] {\n return [...this.listOperators(), ...this.listFunctions()].sort();\n }\n \n // Get operation info for registry-lookup tool\n getOperationInfo(name: string): OperatorDefinition | FunctionDefinition | undefined {\n // Try as operator first\n const operator = this.getOperatorDefinition(name);\n if (operator) return operator;\n \n // Try as function\n return this.getFunction(name);\n }\n \n // Type-aware methods for completion provider\n \n /**\n * Get functions applicable to a specific type\n */\n getFunctionsForType = (typeName: TypeName | string): FunctionDefinition[] => {\n const results: FunctionDefinition[] = [];\n \n for (const [_, func] of this.functions) {\n if (this.isFunctionApplicableToType(func.name, typeName)) {\n results.push(func);\n }\n }\n \n return results;\n }\n \n /**\n * Get operators applicable to a specific type\n */\n getOperatorsForType(typeName: TypeName | string): OperatorDefinition[] {\n const results: OperatorDefinition[] = [];\n const seen = new Set<string>();\n \n // Check all operator maps\n const allOps = [\n ...Array.from(this.symbolOperators.values()),\n ...Array.from(this.keywordOperators.values()),\n ...Array.from(this.unaryOperators.values())\n ];\n \n for (const op of allOps) {\n if (!seen.has(op.symbol) && this.isOperatorApplicableToType(op.symbol, typeName)) {\n results.push(op);\n seen.add(op.symbol);\n }\n }\n \n return results;\n }\n \n /**\n * Check if a function is applicable to a type\n */\n private getTypeInfoFromString(type: string): TypeInfo {\n const isCollection = type.endsWith('[]');\n const typeName = isCollection ? type.slice(0, -2) : type;\n return {\n type: typeName as TypeName,\n singleton: !isCollection,\n };\n }\n\n public isTypeCompatible(inputType: TypeInfo, requiredType: TypeInfo): boolean {\n // Check singleton compatibility\n if (requiredType.singleton && !inputType.singleton) {\n return false;\n }\n\n const numericTypes: TypeName[] = ['Integer', 'Decimal'];\n const temporalTypes: TypeName[] = ['Date', 'DateTime', 'Time'];\n\n // 'Any' type is always compatible\n if (requiredType.type === 'Any') {\n return true;\n }\n\n // Direct type match\n if (inputType.type === requiredType.type) {\n return true;\n }\n\n // Numeric types are compatible with each other\n if (numericTypes.includes(inputType.type) && numericTypes.includes(requiredType.type)) {\n return true;\n }\n\n // Temporal types are compatible with each other\n if (temporalTypes.includes(inputType.type) && temporalTypes.includes(requiredType.type)) {\n return true;\n }\n\n // TODO: Add model-aware subtype checking here\n // For now, we only handle the above cases.\n // A full implementation would require a ModelProvider to check subtype relationships.\n\n return false;\n }\n\n isFunctionApplicableToType(functionName: string, type: string): boolean {\n const func = this.getFunction(functionName);\n if (!func) return false;\n\n // New logic: check all signatures\n for (const signature of func.signatures) {\n if (!signature.input) {\n // No input constraint, so it's applicable\n return true;\n }\n \n const inputType = this.getTypeInfoFromString(type);\n if (this.isTypeCompatible(inputType, signature.input)) {\n return true;\n }\n }\n \n return false;\n }\n \n /**\n * Check if an operator is applicable to a type\n */\n isOperatorApplicableToType(operatorSymbol: string, typeName: TypeName | string): boolean {\n const op = this.getOperatorDefinition(operatorSymbol);\n if (!op) return false;\n \n // If no signatures, operator works with any type\n if (!op.signatures || op.signatures.length === 0) return true;\n \n // Check if any signature matches the type\n for (const sig of op.signatures) {\n if (!sig.left) continue;\n \n const leftType = sig.left.type;\n \n // 'Any' type accepts all inputs\n if (leftType === 'Any') return true;\n \n // Direct type match\n if (leftType === typeName) return true;\n \n // For collection types, check item type\n if (typeof typeName === 'string' && typeName.endsWith('[]')) {\n const itemType = typeName.slice(0, -2);\n if (leftType === itemType) return true;\n }\n \n // Check numeric type compatibility\n const numericTypes = ['Integer', 'Decimal', 'Number'];\n if (numericTypes.includes(typeName as string) && numericTypes.includes(leftType as string)) {\n return true;\n }\n \n // Check temporal type compatibility\n const temporalTypes = ['Date', 'DateTime', 'Time', 'Instant'];\n if (temporalTypes.includes(typeName as string) && temporalTypes.includes(leftType as string)) {\n return true;\n }\n }\n \n return false;\n }\n}\n\n// Export singleton instance\nexport const registry = new Registry();","// Arithmetic operators\nexport { plusOperator } from './plus-operator';\nexport { unaryPlusOperator } from './unary-plus-operator';\nexport { minusOperator } from './minus-operator';\nexport { unaryMinusOperator } from './unary-minus-operator';\nexport { multiplyOperator } from './multiply-operator';\nexport { divideOperator } from './divide-operator';\nexport { divOperator } from './div-operator';\nexport { modOperator } from './mod-operator';\n\n// Comparison operators\nexport { lessOperator } from './less-operator';\nexport { greaterOperator } from './greater-operator';\nexport { lessOrEqualOperator } from './less-or-equal-operator';\nexport { greaterOrEqualOperator } from './greater-or-equal-operator';\n\n// Equality operators\nexport { equalOperator } from './equal-operator';\nexport { notEqualOperator } from './not-equal-operator';\nexport { equivalentOperator } from './equivalent-operator';\nexport { notEquivalentOperator } from './not-equivalent-operator';\n\n// Logical operators\nexport { andOperator } from './and-operator';\nexport { orOperator } from './or-operator';\nexport { xorOperator } from './xor-operator';\nexport { impliesOperator } from './implies-operator';\n\n// Membership operators\nexport { inOperator } from './in-operator';\nexport { containsOperator } from './contains-operator';\n\n// Type operators\nexport { isOperator } from './is-operator';\nexport { asOperator } from './as-operator';\nexport { ofTypeFunction } from './ofType-function';\nexport { isFunction } from './is-function';\nexport { asFunction } from './as-function';\n\n// Other operators\nexport { unionOperator } from './union-operator';\nexport { combineOperator } from './combine-operator';\nexport { dotOperator } from './dot-operator';\n\n// Functions\nexport { whereFunction } from './where-function';\nexport { selectFunction } from './select-function';\nexport { repeatFunction } from './repeat-function';\nexport { firstFunction } from './first-function';\nexport { lastFunction } from './last-function';\nexport { childrenFunction } from './children-function';\nexport { descendantsFunction } from './descendants-function';\nexport { skipFunction } from './skip-function';\nexport { takeFunction } from './take-function';\nexport { tailFunction } from './tail-function';\nexport { singleFunction } from './single-function';\nexport { countFunction } from './count-function';\nexport { existsFunction } from './exists-function';\nexport { allFunction } from './all-function';\nexport { emptyFunction } from './empty-function';\nexport { notFunction } from './not-function';\nexport { distinctFunction } from './distinct-function';\nexport { isDistinctFunction } from './isDistinct-function';\nexport { iifFunction } from './iif-function';\nexport { defineVariableFunction } from './defineVariable-function';\n\n// Temporal functions\nexport { \n nowFunction, \n todayFunction, \n timeOfDayFunction,\n toDateFunction,\n toDateTimeFunction,\n toTimeFunction,\n convertsToDateFunction,\n convertsToDateTimeFunction,\n convertsToTimeFunction\n} from './temporal-functions';\nexport { joinFunction } from './join-function';\nexport { replaceFunction } from './replace-function';\nexport { unionFunction } from './union-function';\nexport { combineFunction } from './combine-function';\nexport { intersectFunction } from './intersect-function';\nexport { excludeFunction } from './exclude-function';\nexport { indexOfFunction } from './indexOf-function';\nexport { lastIndexOfFunction } from './lastIndexOf-function';\nexport { substringFunction } from './substring-function';\nexport { matchesFunction } from './matches-function';\nexport { matchesFullFunction } from './matchesFull-function';\nexport { replaceMatchesFunction } from './replaceMatches-function';\nexport { toCharsFunction } from './toChars-function';\nexport { containsFunction } from './contains-function';\nexport { startsWithFunction } from './startsWith-function';\nexport { endsWithFunction } from './endsWith-function';\nexport { lengthFunction } from './length-function';\nexport { trimFunction } from './trim-function';\nexport { allTrueFunction } from './allTrue-function';\nexport { splitFunction } from './split-function';\nexport { upperFunction } from './upper-function';\nexport { lowerFunction } from './lower-function';\nexport { allFalseFunction } from './allFalse-function';\nexport { anyTrueFunction } from './anyTrue-function';\nexport { anyFalseFunction } from './anyFalse-function';\nexport { subsetOfFunction } from './subsetOf-function';\nexport { supersetOfFunction } from './supersetOf-function';\n\n// Type conversion functions\nexport { toIntegerFunction } from './toInteger-function';\nexport { toDecimalFunction } from './toDecimal-function';\nexport { toStringFunction } from './toString-function';\nexport { toBooleanFunction } from './toBoolean-function';\nexport { toQuantityFunction } from './toQuantity-function';\nexport { toLongFunction } from './toLong-function';\nexport { convertsToBooleanFunction } from './convertsToBoolean-function';\nexport { convertsToIntegerFunction } from './convertsToInteger-function';\nexport { convertsToDecimalFunction } from './convertsToDecimal-function';\nexport { convertsToStringFunction } from './convertsToString-function';\nexport { convertsToQuantityFunction } from './convertsToQuantity-function';\nexport { convertsToLongFunction } from './convertsToLong-function';\n\n// Utility functions\nexport { traceFunction } from './trace-function';\nexport { dateOfFunction } from './dateOf-function';\nexport { timeOfFunction } from './timeOf-function';\nexport { yearOfFunction } from './yearOf-function';\nexport { monthOfFunction } from './monthOf-function';\nexport { dayOfFunction } from './dayOf-function';\nexport { hourOfFunction } from './hourOf-function';\nexport { minuteOfFunction } from './minuteOf-function';\nexport { secondOfFunction } from './secondOf-function';\nexport { millisecondOfFunction } from './millisecondOf-function';\nexport { timezoneOffsetOfFunction } from './timezoneOffsetOf-function';\nexport { lowBoundaryFunction } from './lowBoundary-function';\nexport { highBoundaryFunction } from './highBoundary-function';\n\n// Aggregate functions\nexport { aggregateFunction } from './aggregate-function';\n\n// Math functions\nexport { absFunction } from './abs-function';\nexport { ceilingFunction } from './ceiling-function';\nexport { floorFunction } from './floor-function';\nexport { roundFunction } from './round-function';\nexport { truncateFunction } from './truncate-function';\nexport { sqrtFunction } from './sqrt-function';\nexport { powerFunction } from './power-function';\n","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { addQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedL = left[0];\n const boxedR = right[0];\n \n if (!boxedL || !boxedR) {\n return { value: [], context };\n }\n \n const l = unbox(boxedL);\n const r = unbox(boxedR);\n \n // Check for temporal arithmetic using boxed type information\n const leftType = boxedL?.typeInfo?.type;\n const rightType = boxedR?.typeInfo?.type;\n \n if ((leftType === 'Date' || leftType === 'DateTime' || leftType === 'Time') && rightType === 'Quantity') {\n // Left is temporal, right is quantity\n const temporalType = leftType;\n const temporal = l;\n const quantity = r as QuantityValue;\n \n // Import temporal utilities and create TimeQuantity\n const { createTimeQuantity, add } = await import('../complex-types/temporal');\n \n // Calendar duration units (allowed for temporal arithmetic)\n const calendarUnits = ['year', 'years', 'month', 'months', 'week', 'weeks', \n 'day', 'days', 'hour', 'hours', 'minute', 'minutes', \n 'second', 'seconds', 'millisecond', 'milliseconds'];\n \n // Variable duration UCUM units (not allowed for temporal arithmetic - they have calendar-dependent durations)\n const variableDurationUnits = ['a', 'mo'];\n \n // Fixed duration UCUM units (allowed - they map directly to calendar units)\n const fixedDurationUnitMap: Record<string, string> = {\n 'd': 'day',\n 'wk': 'week', \n 'h': 'hour',\n 'min': 'minute',\n 's': 'second',\n 'ms': 'millisecond'\n };\n \n // Check if this is a variable duration unit (not allowed)\n if (variableDurationUnits.includes(quantity.unit)) {\n // Variable duration units like 'a' and 'mo' cannot be added to temporal values\n // because they don't have fixed durations\n const { Errors } = await import('../errors');\n throw Errors.invalidTemporalUnit(temporalType, quantity.unit);\n }\n \n // Map fixed duration UCUM units to calendar units\n let mappedUnit = fixedDurationUnitMap[quantity.unit] || quantity.unit;\n \n // Check if this is a valid calendar duration unit (after mapping)\n if (!calendarUnits.includes(mappedUnit)) {\n // Non-time units with temporal values return empty per FHIRPath spec\n return { value: [], context };\n }\n \n const timeQuantity = createTimeQuantity(quantity.value, mappedUnit as any);\n \n // Use the functional add operation\n const result = add(temporal as any, timeQuantity);\n \n if (temporalType === 'Date') {\n return { value: [box(result, { type: 'Date', singleton: true })], context };\n } else if (temporalType === 'DateTime') {\n return { value: [box(result, { type: 'DateTime', singleton: true })], context };\n } else if (temporalType === 'Time') {\n // Let the error propagate - adding calendar units to Time should throw\n return { value: [box(result, { type: 'Time', singleton: true })], context };\n }\n }\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = addQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result ? [box(result, { type: 'Quantity', singleton: true })] : [], context };\n }\n \n // String concatenation only works for string + string\n if (typeof l === 'string' && typeof r === 'string') {\n return { value: [box(l + r, { type: 'String', singleton: true })], context };\n }\n \n if (typeof l === 'number' && typeof r === 'number') {\n const result = l + r;\n const typeInfo = Number.isInteger(result) ? \n { type: 'Integer' as const, singleton: true } : \n { type: 'Decimal' as const, singleton: true };\n return { value: [box(result, typeInfo)], context };\n }\n \n // For incompatible types, return empty per FHIRPath spec\n return { value: [], context };\n};\n\nexport const plusOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '+',\n name: 'plus',\n category: ['arithmetic'],\n precedence: PRECEDENCE.ADDITIVE,\n associativity: 'left',\n description: 'For Integer, Decimal, and Quantity, adds the operands. For strings, concatenates the right operand to the left operand. For Date/DateTime/Time, increments by time-valued quantity.',\n examples: ['2 + 3', '\"Hello\" + \" \" + \"World\"', '@2018-03-01 + 1 day', '3 \\'m\\' + 3 \\'cm\\''],\n signatures: [\n {\n name: 'integer-plus',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Integer', singleton: true },\n },\n {\n name: 'decimal-plus',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Decimal', singleton: true },\n },\n {\n name: 'string-plus',\n left: { type: 'String', singleton: true },\n right: { type: 'String', singleton: true },\n result: { type: 'String', singleton: true },\n },\n {\n name: 'quantity-plus',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Quantity', singleton: true },\n },\n {\n name: 'date-plus',\n left: { type: 'Date', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Date', singleton: true },\n },\n {\n name: 'datetime-plus',\n left: { type: 'DateTime', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'DateTime', singleton: true },\n },\n {\n name: 'time-plus',\n left: { type: 'Time', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Time', singleton: true },\n }\n ],\n evaluate\n};","import { ucum } from '@atomic-ehr/ucum';\nimport type { Quantity } from '@atomic-ehr/ucum';\n\n/**\n * Wrapper for FHIRPath quantity values with UCUM integration\n */\nexport interface QuantityValue {\n value: number;\n unit: string;\n _ucumQuantity?: Quantity; // Lazy-initialized\n}\n\n/**\n * Calendar duration units used in FHIRPath\n * These are NOT UCUM units and should not be converted\n */\nexport const CALENDAR_DURATION_UNITS = new Set([\n 'year', 'years',\n 'month', 'months',\n 'week', 'weeks',\n 'day', 'days',\n 'hour', 'hours',\n 'minute', 'minutes',\n 'second', 'seconds',\n 'millisecond', 'milliseconds'\n]);\n\n/**\n * Create a quantity value\n */\nexport function createQuantity(value: number, unit: string): QuantityValue {\n return {\n value,\n unit\n };\n}\n\n/**\n * Get or create the UCUM quantity for a QuantityValue\n */\nexport function getUcumQuantity(quantity: QuantityValue): Quantity | null {\n // Calendar duration units are not UCUM units\n if (CALENDAR_DURATION_UNITS.has(quantity.unit)) {\n return null;\n }\n \n if (!quantity._ucumQuantity) {\n try {\n quantity._ucumQuantity = ucum.quantity(quantity.value, quantity.unit);\n } catch (e) {\n // Invalid unit - return null\n return null;\n }\n }\n return quantity._ucumQuantity || null;\n}\n\n/**\n * Check if a quantity has a valid unit\n * Valid units are either UCUM units or calendar duration units\n */\nexport function isValidQuantity(quantity: QuantityValue): boolean {\n // Calendar duration units are valid FHIRPath quantities\n if (CALENDAR_DURATION_UNITS.has(quantity.unit)) {\n return true;\n }\n // Otherwise check if it's a valid UCUM unit\n return getUcumQuantity(quantity) !== null;\n}\n\n/**\n * Add two quantities\n */\nexport function addQuantities(left: QuantityValue, right: QuantityValue): QuantityValue | null {\n // Special case: adding calendar durations with the same unit\n if (CALENDAR_DURATION_UNITS.has(left.unit) && left.unit === right.unit) {\n return {\n value: left.value + right.value,\n unit: left.unit\n };\n }\n \n // Different calendar units cannot be added\n if (CALENDAR_DURATION_UNITS.has(left.unit) || CALENDAR_DURATION_UNITS.has(right.unit)) {\n return null;\n }\n \n const leftUcum = getUcumQuantity(left);\n const rightUcum = getUcumQuantity(right);\n \n if (!leftUcum || !rightUcum) {\n return null;\n }\n \n try {\n const result = ucum.add(leftUcum, rightUcum);\n return {\n value: result.value,\n unit: result.unit\n };\n } catch (e) {\n // Incompatible dimensions\n return null;\n }\n}\n\n/**\n * Subtract two quantities\n */\nexport function subtractQuantities(left: QuantityValue, right: QuantityValue): QuantityValue | null {\n // Special case: subtracting calendar durations with the same unit\n if (CALENDAR_DURATION_UNITS.has(left.unit) && left.unit === right.unit) {\n return {\n value: left.value - right.value,\n unit: left.unit\n };\n }\n \n // Different calendar units cannot be subtracted\n if (CALENDAR_DURATION_UNITS.has(left.unit) || CALENDAR_DURATION_UNITS.has(right.unit)) {\n return null;\n }\n \n const leftUcum = getUcumQuantity(left);\n const rightUcum = getUcumQuantity(right);\n \n if (!leftUcum || !rightUcum) {\n return null;\n }\n \n try {\n const result = ucum.subtract(leftUcum, rightUcum);\n return {\n value: result.value,\n unit: result.unit\n };\n } catch (e) {\n // Incompatible dimensions\n return null;\n }\n}\n\n/**\n * Multiply two quantities\n */\nexport function multiplyQuantities(left: QuantityValue, right: QuantityValue): QuantityValue | null {\n // Special case: multiplying calendar duration by a dimensionless number\n // e.g., 1 year * 2 = 2 years, or 2 * 1 year = 2 years\n if (CALENDAR_DURATION_UNITS.has(left.unit) && right.unit === '1') {\n // Calendar duration * number\n return {\n value: left.value * right.value,\n unit: left.unit\n };\n }\n if (CALENDAR_DURATION_UNITS.has(right.unit) && left.unit === '1') {\n // Number * calendar duration\n return {\n value: left.value * right.value,\n unit: right.unit\n };\n }\n \n // Check if both are calendar duration units - this is not allowed\n if (CALENDAR_DURATION_UNITS.has(left.unit) && CALENDAR_DURATION_UNITS.has(right.unit)) {\n // Calendar duration units cannot be multiplied together - the result would be meaningless\n throw new Error(`Cannot multiply calendar duration units: ${left.unit} * ${right.unit}`);\n }\n \n // Mixed calendar and non-calendar units are not allowed\n if (CALENDAR_DURATION_UNITS.has(left.unit) || CALENDAR_DURATION_UNITS.has(right.unit)) {\n throw new Error(`Cannot multiply calendar duration with non-calendar units: ${left.unit} * ${right.unit}`);\n }\n \n const leftUcum = getUcumQuantity(left);\n const rightUcum = getUcumQuantity(right);\n \n if (!leftUcum || !rightUcum) {\n return null;\n }\n \n try {\n const result = ucum.multiply(leftUcum, rightUcum);\n return {\n value: result.value,\n unit: result.unit\n };\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Divide two quantities\n */\nexport function divideQuantities(left: QuantityValue, right: QuantityValue): QuantityValue | null {\n // Special case: dividing calendar duration by a dimensionless number\n // e.g., 10 months / 2 = 5 months\n if (CALENDAR_DURATION_UNITS.has(left.unit) && right.unit === '1') {\n // Calendar duration / number\n return {\n value: left.value / right.value,\n unit: left.unit\n };\n }\n \n // Division of number by calendar duration is not allowed\n // Division of two calendar durations is not allowed\n if (CALENDAR_DURATION_UNITS.has(left.unit) || CALENDAR_DURATION_UNITS.has(right.unit)) {\n // Calendar duration units cannot be divided except by dimensionless numbers\n throw new Error(`Cannot divide calendar duration units: ${left.unit} / ${right.unit}`);\n }\n \n const leftUcum = getUcumQuantity(left);\n const rightUcum = getUcumQuantity(right);\n \n if (!leftUcum || !rightUcum) {\n return null;\n }\n \n try {\n const result = ucum.divide(leftUcum, rightUcum);\n return {\n value: result.value,\n unit: result.unit\n };\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Compare two quantities\n * Returns -1 if left < right, 0 if equal, 1 if left > right, null if incomparable\n */\nexport function compareQuantities(left: QuantityValue, right: QuantityValue): number | null {\n // Special case: comparing calendar durations with the same unit\n if (CALENDAR_DURATION_UNITS.has(left.unit) && left.unit === right.unit) {\n if (left.value < right.value) {\n return -1;\n } else if (left.value > right.value) {\n return 1;\n } else {\n return 0;\n }\n }\n \n // Different calendar units cannot be compared\n if (CALENDAR_DURATION_UNITS.has(left.unit) || CALENDAR_DURATION_UNITS.has(right.unit)) {\n return null;\n }\n \n const leftUcum = getUcumQuantity(left);\n const rightUcum = getUcumQuantity(right);\n \n if (!leftUcum || !rightUcum) {\n return null;\n }\n \n try {\n // Try to convert right to left's unit for comparison\n const rightValue = ucum.convert(rightUcum.value, rightUcum.unit, leftUcum.unit);\n if (leftUcum.value < rightValue) {\n return -1;\n } else if (leftUcum.value > rightValue) {\n return 1;\n } else {\n return 0;\n }\n } catch (e) {\n // Incompatible dimensions\n return null;\n }\n}\n\n/**\n * Check if two quantities are equal\n */\nexport function equalQuantities(left: QuantityValue, right: QuantityValue): boolean {\n return compareQuantities(left, right) === 0;\n}\n\n/**\n * Convert quantity to string representation\n */\nexport function quantityToString(quantity: QuantityValue): string {\n return `${quantity.value} '${quantity.unit}'`;\n}","import type {TypeInfo} from '../types';\nexport type {TypeInfo};\n\n/**\n * Symbol to mark boxed values\n */\nconst BOXED_SYMBOL = Symbol('FHIRPathBoxedValue');\n\n/**\n * Extension structure for FHIR primitive elements\n */\nexport interface Extension {\n url: string;\n [key: string]: any;\n}\n\n/**\n * Metadata for FHIR primitive elements (e.g., _gender for gender property)\n */\nexport interface PrimitiveElement {\n id?: string;\n extension?: Extension[];\n}\n\n/**\n * Boxed FHIRPath value with metadata\n */\nexport interface FHIRPathValue<T = any> {\n /** The actual value */\n value: T;\n \n /** Type information from ModelProvider */\n typeInfo?: TypeInfo;\n \n /** Primitive element extension (for primitives only) */\n primitiveElement?: PrimitiveElement;\n \n /** Internal marker to identify boxed values */\n [BOXED_SYMBOL]: true;\n}\n\n/**\n * Box a value with optional metadata\n */\nexport function box<T>(\n value: T, \n typeInfo?: TypeInfo, \n primitiveElement?: PrimitiveElement\n): FHIRPathValue<T> {\n return {\n value,\n typeInfo,\n primitiveElement,\n [BOXED_SYMBOL]: true\n };\n}\n\n/**\n * Unbox a value to get the raw value\n */\nexport function unbox<T>(boxedValue: FHIRPathValue<T>): T {\n return boxedValue.value;\n}\n\n/**\n * Check if a value is already boxed\n */\nexport function isBoxed(value: any): value is FHIRPathValue {\n return value !== null && \n value !== undefined && \n typeof value === 'object' && \n BOXED_SYMBOL in value &&\n value[BOXED_SYMBOL] === true;\n}\n\n/**\n * Ensure a value is boxed, boxing it if necessary\n */\nexport function ensureBoxed(value: any, typeInfo?: TypeInfo): FHIRPathValue {\n if (isBoxed(value)) {\n return value;\n }\n return box(value, typeInfo);\n}\n\n/**\n * Map over an array of boxed values, preserving boxing\n */\nexport function mapBoxed<T, U>(\n values: FHIRPathValue<T>[], \n fn: (value: T, index: number) => U,\n typeInfo?: TypeInfo\n): FHIRPathValue<U>[] {\n return values.map((boxedValue, index) => \n box(fn(boxedValue.value, index), typeInfo)\n );\n}\n\n/**\n * Filter an array of boxed values, preserving boxing\n */\nexport function filterBoxed<T>(\n values: FHIRPathValue<T>[], \n predicate: (value: T, index: number) => boolean\n): FHIRPathValue<T>[] {\n return values.filter((boxedValue, index) => \n predicate(boxedValue.value, index)\n );\n}\n\n/**\n * Flatten an array of boxed arrays into a single array of boxed values\n */\nexport function flattenBoxed<T>(values: FHIRPathValue<T[]>[]): FHIRPathValue<T>[] {\n const result: FHIRPathValue<T>[] = [];\n for (const boxedArray of values) {\n if (Array.isArray(boxedArray.value)) {\n for (const item of boxedArray.value) {\n result.push(box(item, boxedArray.typeInfo));\n }\n }\n }\n return result;\n}","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, operand) => {\n // Unary plus returns the operand as-is\n return { value: operand, context };\n};\n\nexport const unaryPlusOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '+',\n name: 'unaryPlus',\n category: ['arithmetic'],\n precedence: PRECEDENCE.UNARY,\n associativity: 'right',\n description: 'Unary plus operator',\n examples: ['+5'],\n signatures: [],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { subtractQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check for temporal arithmetic using boxed type information\n const leftType = boxedl?.typeInfo?.type;\n const rightType = boxedr?.typeInfo?.type;\n \n if ((leftType === 'Date' || leftType === 'DateTime' || leftType === 'Time') && rightType === 'Quantity') {\n // Left is temporal, right is quantity\n const temporalType = leftType;\n const quantity = r as QuantityValue;\n \n // Import temporal utilities and create TimeQuantity\n const { createTimeQuantity, subtract } = await import('../complex-types/temporal');\n \n // Calendar duration units (allowed for temporal arithmetic)\n const calendarUnits = ['year', 'years', 'month', 'months', 'week', 'weeks', \n 'day', 'days', 'hour', 'hours', 'minute', 'minutes', \n 'second', 'seconds', 'millisecond', 'milliseconds'];\n \n // Variable duration UCUM units (not allowed for temporal arithmetic - they have calendar-dependent durations)\n const variableDurationUnits = ['a', 'mo'];\n \n // Fixed duration UCUM units (allowed - they map directly to calendar units)\n const fixedDurationUnitMap: Record<string, string> = {\n 'd': 'day',\n 'wk': 'week', \n 'h': 'hour',\n 'min': 'minute',\n 's': 'second',\n 'ms': 'millisecond'\n };\n \n // Check if this is a variable duration unit (not allowed)\n if (variableDurationUnits.includes(quantity.unit)) {\n // Variable duration units like 'a' and 'mo' cannot be subtracted from temporal values\n // because they don't have fixed durations\n const { Errors } = await import('../errors');\n throw Errors.invalidTemporalUnit(temporalType, quantity.unit);\n }\n \n // Map fixed duration UCUM units to calendar units\n let mappedUnit = fixedDurationUnitMap[quantity.unit] || quantity.unit;\n \n // Check if this is a valid calendar duration unit (after mapping)\n if (!calendarUnits.includes(mappedUnit)) {\n // Non-time units with temporal values return empty per FHIRPath spec\n return { value: [], context };\n }\n \n const timeQuantity = createTimeQuantity(quantity.value, mappedUnit as any);\n \n // Use the functional subtract operation\n const result = subtract(l as any, timeQuantity);\n \n if (temporalType === 'Date') {\n return { value: [box(result, { type: 'Date', singleton: true })], context };\n } else if (temporalType === 'DateTime') {\n return { value: [box(result, { type: 'DateTime', singleton: true })], context };\n } else if (temporalType === 'Time') {\n return { value: [box(result, { type: 'Time', singleton: true })], context };\n }\n }\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = subtractQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result ? [box(result, { type: 'Quantity', singleton: true })] : [], context };\n }\n \n // Handle numeric subtraction\n if (typeof l === 'number' && typeof r === 'number') {\n const result = l - r;\n const typeInfo = Number.isInteger(result) ? \n { type: 'Integer' as const, singleton: true } : \n { type: 'Decimal' as const, singleton: true };\n return { value: [box(result, typeInfo)], context };\n }\n \n // For other types, return empty\n return { value: [], context };\n};\n\nexport const minusOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '-',\n name: 'minus',\n category: ['arithmetic'],\n precedence: PRECEDENCE.ADDITIVE,\n associativity: 'left',\n description: 'Subtracts the right operand from the left operand (supported for Integer, Decimal, and Quantity). For Date/DateTime/Time, decrements by time-valued quantity.',\n examples: ['5 - 3', '10.5 - 2.5', '3 \\'m\\' - 3 \\'cm\\'', '@2019-03-01 - 24 months'],\n signatures: [\n {\n name: 'integer-minus',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Integer', singleton: true },\n },\n {\n name: 'decimal-minus',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Decimal', singleton: true },\n },\n {\n name: 'quantity-minus',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Quantity', singleton: true },\n },\n {\n name: 'date-minus',\n left: { type: 'Date', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Date', singleton: true },\n },\n {\n name: 'datetime-minus',\n left: { type: 'DateTime', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'DateTime', singleton: true },\n },\n {\n name: 'time-minus',\n left: { type: 'Time', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Time', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, operand) => {\n // Unary minus negates each boxed value\n const results: any[] = [];\n \n for (const boxedValue of operand) {\n const v = unbox(boxedValue);\n \n if (v && typeof v === 'object' && 'unit' in v) {\n // Handle quantity\n const q = v as QuantityValue;\n results.push(box({ value: -q.value, unit: q.unit }, { type: 'Quantity', singleton: true }));\n } else if (typeof v === 'number') {\n const result = -v;\n const typeInfo = Number.isInteger(result) ? \n { type: 'Integer' as const, singleton: true } : \n { type: 'Decimal' as const, singleton: true };\n results.push(box(result, typeInfo));\n }\n // For non-numeric values, skip (return empty)\n }\n \n return { value: results, context };\n};\n\nexport const unaryMinusOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '-',\n name: 'unaryMinus',\n category: ['arithmetic'],\n precedence: PRECEDENCE.UNARY,\n associativity: 'right',\n description: 'Unary minus operator',\n examples: ['-5'],\n signatures: [],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { multiplyQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = multiplyQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result ? [box(result, { type: 'Quantity', singleton: true })] : [], context };\n }\n \n // Handle quantity * number\n if (l && typeof l === 'object' && 'unit' in l && typeof r === 'number') {\n const q = l as QuantityValue;\n return { value: [box({ value: q.value * r, unit: q.unit }, { type: 'Quantity', singleton: true })], context };\n }\n \n // Handle number * quantity\n if (typeof l === 'number' && r && typeof r === 'object' && 'unit' in r) {\n const q = r as QuantityValue;\n return { value: [box({ value: l * q.value, unit: q.unit }, { type: 'Quantity', singleton: true })], context };\n }\n \n // Handle numeric multiplication\n if (typeof l === 'number' && typeof r === 'number') {\n return { value: [box(l * r, { type: 'Any', singleton: true })], context };\n }\n \n // For other types, return empty\n return { value: [], context };\n};\n\nexport const multiplyOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '*',\n name: 'multiply',\n category: ['arithmetic'],\n precedence: PRECEDENCE.MULTIPLICATIVE,\n associativity: 'left',\n description: 'Multiplies both arguments (supported for Integer, Decimal, and Quantity). For multiplication involving quantities, the resulting quantity will have the appropriate unit',\n examples: ['2 * 3', '5.5 * 2', '12 \\'cm\\' * 3 \\'cm\\'', '3 \\'cm\\' * 12 \\'cm2\\''],\n signatures: [\n {\n name: 'integer-multiply',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Integer', singleton: true },\n },\n {\n name: 'decimal-multiply',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Decimal', singleton: true },\n },\n {\n name: 'quantity-multiply',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Quantity', singleton: true },\n },\n {\n name: 'quantity-integer-multiply',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Quantity', singleton: true },\n },\n {\n name: 'integer-quantity-multiply',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Quantity', singleton: true },\n },\n {\n name: 'quantity-decimal-multiply',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Quantity', singleton: true },\n },\n {\n name: 'decimal-quantity-multiply',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Quantity', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { divideQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\nimport { Errors } from '../errors';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const rightQuantity = r as QuantityValue;\n if (rightQuantity.value === 0) {\n throw Errors.divisionByZero();\n }\n const result = divideQuantities(l as QuantityValue, rightQuantity);\n return { value: result ? [box(result, { type: 'Quantity', singleton: true })] : [], context };\n }\n \n // Handle quantity / number\n if (l && typeof l === 'object' && 'unit' in l && typeof r === 'number') {\n if (r === 0) {\n throw Errors.divisionByZero();\n }\n const q = l as QuantityValue;\n return { value: [box({ value: q.value / r, unit: q.unit }, { type: 'Quantity', singleton: true })], context };\n }\n \n // Handle numeric division\n if (typeof l === 'number' && typeof r === 'number') {\n if (r === 0) {\n throw Errors.divisionByZero();\n }\n return { value: [box(l / r, { type: 'Any', singleton: true })], context };\n }\n \n // For other types, return empty\n return { value: [], context };\n};\n\nexport const divideOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '/',\n name: 'divide',\n category: ['arithmetic'],\n precedence: PRECEDENCE.MULTIPLICATIVE,\n associativity: 'left',\n description: 'Divides the left operand by the right operand (supported for Integer, Decimal, and Quantity). The result is always Decimal, even if inputs are both Integer. Division by zero throws an error.',\n examples: ['10 / 2', '7.5 / 1.5', '12 \\'cm2\\' / 3 \\'cm\\'', '12 / 0'],\n signatures: [\n {\n name: 'integer-divide',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Decimal', singleton: true },\n },\n {\n name: 'decimal-divide',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Decimal', singleton: true },\n },\n {\n name: 'quantity-divide',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Quantity', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedLeft = left[0];\n const boxedRight = right[0];\n if (!boxedLeft || !boxedRight) {\n return { value: [], context };\n }\n \n const leftValue = unbox(boxedLeft);\n const rightValue = unbox(boxedRight);\n \n if (rightValue === 0) {\n return { value: [], context };\n }\n \n const result = Math.floor((leftValue as any) / (rightValue as any));\n return { value: [box(result, { type: 'Integer', singleton: true })], context };\n};\n\nexport const divOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'div',\n name: 'div',\n category: ['arithmetic'],\n precedence: PRECEDENCE.MULTIPLICATIVE,\n associativity: 'left',\n description: 'Performs truncated division (integer division) of the left operand by the right operand, ignoring any remainder. Always returns an Integer, even if operands are Decimal. Division by zero returns empty.',\n examples: ['5 div 2', '5.5 div 0.7', '10 div 3', '5 div 0'],\n signatures: [\n {\n name: 'integer-div',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Integer', singleton: true },\n },\n {\n name: 'decimal-div',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Integer', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedLeft = left[0];\n const boxedRight = right[0];\n if (!boxedLeft || !boxedRight) {\n return { value: [], context };\n }\n \n const leftValue = unbox(boxedLeft);\n const rightValue = unbox(boxedRight);\n \n if (rightValue === 0) {\n return { value: [], context };\n }\n \n const result = (leftValue as any) % (rightValue as any);\n \n // Determine result type based on input types\n const resultType = Number.isInteger(leftValue) && Number.isInteger(rightValue) ? 'Integer' : 'Decimal';\n \n return { value: [box(result, { type: resultType, singleton: true })], context };\n};\n\nexport const modOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'mod',\n name: 'mod',\n category: ['arithmetic'],\n precedence: PRECEDENCE.MULTIPLICATIVE,\n associativity: 'left',\n description: 'Computes the remainder of the truncated division of its arguments. Supported for Integer and Decimal types. Division by zero returns empty.',\n examples: ['5 mod 2', '5.5 mod 0.7', '5 mod 0'],\n signatures: [\n {\n name: 'integer-mod',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Integer', singleton: true },\n },\n {\n name: 'decimal-mod',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Decimal', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { compareQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = compareQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result !== null ? [box(result < 0, { type: 'Boolean', singleton: true })] : [], context };\n }\n \n // Check if both are temporal values (Date, DateTime, Time)\n if (l && typeof l === 'object' && 'kind' in l &&\n r && typeof r === 'object' && 'kind' in r) {\n const temporalL = l as any;\n const temporalR = r as any;\n const kinds = ['FHIRDate', 'FHIRDateTime', 'FHIRTime'];\n if (kinds.includes(temporalL.kind) && kinds.includes(temporalR.kind)) {\n const { compare } = await import('../complex-types/temporal');\n const result = compare(temporalL, temporalR);\n // null means incomparable (different precisions), returns empty\n if (result === null) {\n return { value: [], context };\n }\n return { value: [box(result < 0, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box((l as any) < (r as any), { type: 'Boolean', singleton: true })], context };\n};\n\nexport const lessOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '<',\n name: 'less',\n category: ['comparison'],\n precedence: PRECEDENCE.COMPARISON,\n associativity: 'left',\n description: 'Returns true if the first operand is strictly less than the second. The operands must be of the same type, or convertible to the same type using implicit conversion.',\n examples: ['age < 18', '10 < 5', '@2018-03-01 < @2018-01-01', '\"abc\" < \"ABC\"'],\n signatures: [\n {\n name: 'string-less',\n left: { type: 'String', singleton: true },\n right: { type: 'String', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'integer-less',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'decimal-less',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'quantity-less',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'date-less',\n left: { type: 'Date', singleton: true },\n right: { type: 'Date', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'datetime-less',\n left: { type: 'DateTime', singleton: true },\n right: { type: 'DateTime', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'time-less',\n left: { type: 'Time', singleton: true },\n right: { type: 'Time', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { compareQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = compareQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result !== null ? [box(result > 0, { type: 'Boolean', singleton: true })] : [], context };\n }\n \n // Check if both are temporal values (Date, DateTime, Time)\n if (l && typeof l === 'object' && 'kind' in l &&\n r && typeof r === 'object' && 'kind' in r) {\n const temporalL = l as any;\n const temporalR = r as any;\n const kinds = ['FHIRDate', 'FHIRDateTime', 'FHIRTime'];\n if (kinds.includes(temporalL.kind) && kinds.includes(temporalR.kind)) {\n const { compare } = await import('../complex-types/temporal');\n const result = compare(temporalL, temporalR);\n // null means incomparable (different precisions), returns empty\n if (result === null) {\n return { value: [], context };\n }\n return { value: [box(result > 0, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box((l as any) > (r as any), { type: 'Boolean', singleton: true })], context };\n};\n\nexport const greaterOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '>',\n name: 'greater',\n category: ['comparison'],\n precedence: PRECEDENCE.COMPARISON,\n associativity: 'left',\n description: 'Returns true if the first operand is strictly greater than the second. The operands must be of the same type, or convertible to the same type using implicit conversion',\n examples: ['age > 18', '10 > 5', '\"abc\" > \"ABC\"', '@2018-03-01 > @2018-01-01'],\n signatures: [\n {\n name: 'string-greater',\n left: { type: 'String', singleton: true },\n right: { type: 'String', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'integer-greater',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'decimal-greater',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'quantity-greater',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'date-greater',\n left: { type: 'Date', singleton: true },\n right: { type: 'Date', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'datetime-greater',\n left: { type: 'DateTime', singleton: true },\n right: { type: 'DateTime', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'time-greater',\n left: { type: 'Time', singleton: true },\n right: { type: 'Time', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { compareQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = compareQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result !== null ? [box(result <= 0, { type: 'Boolean', singleton: true })] : [], context };\n }\n \n // Check if both are temporal values (Date, DateTime, Time)\n if (l && typeof l === 'object' && 'kind' in l &&\n r && typeof r === 'object' && 'kind' in r) {\n const temporalL = l as any;\n const temporalR = r as any;\n const kinds = ['FHIRDate', 'FHIRDateTime', 'FHIRTime'];\n if (kinds.includes(temporalL.kind) && kinds.includes(temporalR.kind)) {\n const { compare } = await import('../complex-types/temporal');\n const result = compare(temporalL, temporalR);\n // null means incomparable (different precisions), returns empty\n if (result === null) {\n return { value: [], context };\n }\n return { value: [box(result <= 0, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box((l as any) <= (r as any), { type: 'Boolean', singleton: true })], context };\n};\n\nexport const lessOrEqualOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '<=',\n name: 'lessOrEqual',\n category: ['comparison'],\n precedence: PRECEDENCE.COMPARISON,\n associativity: 'left',\n description: 'Returns true if the first operand is less than or equal to the second. The operands must be of the same type, or convertible to the same type using implicit conversion. For partial precision dates/times, returns empty if precision differs.',\n examples: [\n '10 <= 5',\n \"'abc' <= 'ABC'\",\n '4 <= 4.0',\n '@2018-03-01 <= @2018-01-01',\n '@T10:30:00 <= @T10:00:00'\n ],\n signatures: [\n {\n name: 'integer-lessOrEqual',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'decimal-lessOrEqual',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'string-lessOrEqual',\n left: { type: 'String', singleton: true },\n right: { type: 'String', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'date-lessOrEqual',\n left: { type: 'Date', singleton: true },\n right: { type: 'Date', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'datetime-lessOrEqual',\n left: { type: 'DateTime', singleton: true },\n right: { type: 'DateTime', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'time-lessOrEqual',\n left: { type: 'Time', singleton: true },\n right: { type: 'Time', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'quantity-lessOrEqual',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { compareQuantities } from '../complex-types/quantity-value';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n \n // Check if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const result = compareQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result !== null ? [box(result >= 0, { type: 'Boolean', singleton: true })] : [], context };\n }\n \n // Check if both are temporal values (Date, DateTime, Time)\n if (l && typeof l === 'object' && 'kind' in l &&\n r && typeof r === 'object' && 'kind' in r) {\n const temporalL = l as any;\n const temporalR = r as any;\n const kinds = ['FHIRDate', 'FHIRDateTime', 'FHIRTime'];\n if (kinds.includes(temporalL.kind) && kinds.includes(temporalR.kind)) {\n const { compare } = await import('../complex-types/temporal');\n const result = compare(temporalL, temporalR);\n // null means incomparable (different precisions), returns empty\n if (result === null) {\n return { value: [], context };\n }\n return { value: [box(result >= 0, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box((l as any) >= (r as any), { type: 'Boolean', singleton: true })], context };\n};\n\nexport const greaterOrEqualOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '>=',\n name: 'greaterOrEqual',\n category: ['comparison'],\n precedence: PRECEDENCE.COMPARISON,\n associativity: 'left',\n description: 'Returns true if the first operand is greater than or equal to the second. The operands must be of the same type, or convertible to the same type using implicit conversion. For partial precision dates/times, returns empty if precision differs.',\n examples: [\n '10 >= 5',\n \"'abc' >= 'ABC'\",\n '10 >= 5.0',\n '@2018-03-01 >= @2018-01-01',\n '@T10:30:00 >= @T10:00:00'\n ],\n signatures: [\n {\n name: 'integer-greaterOrEqual',\n left: { type: 'Integer', singleton: true },\n right: { type: 'Integer', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'decimal-greaterOrEqual',\n left: { type: 'Decimal', singleton: true },\n right: { type: 'Decimal', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'string-greaterOrEqual',\n left: { type: 'String', singleton: true },\n right: { type: 'String', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'date-greaterOrEqual',\n left: { type: 'Date', singleton: true },\n right: { type: 'Date', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'datetime-greaterOrEqual',\n left: { type: 'DateTime', singleton: true },\n right: { type: 'DateTime', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'time-greaterOrEqual',\n left: { type: 'Time', singleton: true },\n right: { type: 'Time', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'quantity-greaterOrEqual',\n left: { type: 'Quantity', singleton: true },\n right: { type: 'Quantity', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition, OperationEvaluator } from '../types';\nimport { PRECEDENCE } from '../types';\nimport { box } from '../interpreter/boxing';\nimport { collectionsEqual } from './comparison';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Use the unified comparison system\n const result = collectionsEqual(left, right);\n \n // null means incomparable (returns empty)\n if (result === null) {\n return { value: [], context };\n }\n \n // Return the boolean result\n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const equalOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '=',\n name: 'equal',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\n description: 'Returns true if the left collection is equal to the right collection. For single items, comparison is type-specific. For collections, comparison is order-dependent.',\n examples: ['name = \"John\"', 'Patient.name.given = \"John\"', '5 = 5', '@2018-03-01 = @2018-03-01'],\n signatures: [\n {\n name: 'equal',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'equal',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: false },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { FHIRPathValue } from '../interpreter/boxing';\nimport { unbox } from '../interpreter/boxing';\nimport type { QuantityValue } from '../complex-types/quantity-value';\nimport { compareQuantities } from '../complex-types/quantity-value';\nimport type { TemporalValue } from '../complex-types/temporal';\nimport { equals as temporalEquals, compare as temporalCompare, isFHIRDate, isFHIRDateTime, isFHIRTime } from '../complex-types/temporal';\n\n/**\n * Result of comparing two values\n */\nexport type ComparisonResult = \n | { kind: 'equal' }\n | { kind: 'less' }\n | { kind: 'greater' }\n | { kind: 'incomparable'; reason?: string };\n\n/**\n * Compare two FHIRPath values\n * Returns a ComparisonResult indicating the relationship between the values\n */\nexport function compare(a: unknown, b: unknown): ComparisonResult {\n // Early exit: reference equality\n if (a === b) {\n return { kind: 'equal' };\n }\n \n // Handle null/undefined\n if (a === null || a === undefined || b === null || b === undefined) {\n return { kind: 'incomparable', reason: 'null or undefined value' };\n }\n \n // Early exit: type mismatch for primitives\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB && typeA !== 'object' && typeB !== 'object') {\n return { kind: 'incomparable', reason: 'type mismatch' };\n }\n\n // Check if values are temporal types\n if (isTemporalValue(a) && isTemporalValue(b)) {\n return compareTemporal(a, b);\n }\n\n // Check if values are quantities\n if (isQuantity(a) && isQuantity(b)) {\n return compareQuantityValues(a, b);\n }\n\n // Handle mixed quantity and number comparison\n if (isQuantity(a) && typeof b === 'number') {\n return compareQuantityToNumber(a, b);\n }\n if (typeof a === 'number' && isQuantity(b)) {\n const result = compareQuantityToNumber(b, a);\n // Flip the comparison result\n if (result.kind === 'less') return { kind: 'greater' };\n if (result.kind === 'greater') return { kind: 'less' };\n return result;\n }\n\n // Check if values are complex types (objects/arrays)\n if (isComplex(a) && isComplex(b)) {\n return compareComplex(a, b);\n }\n\n // Primitive comparison\n return comparePrimitive(a, b);\n}\n\n/**\n * Compare collections (arrays of values)\n * Collections are compared element-by-element in order\n */\nexport function compareCollections(left: FHIRPathValue[], right: FHIRPathValue[]): ComparisonResult {\n // Empty collections\n if (left.length === 0 || right.length === 0) {\n return { kind: 'incomparable', reason: 'empty collection' };\n }\n\n // Single value collections\n if (left.length === 1 && right.length === 1) {\n const leftItem = left[0];\n const rightItem = right[0];\n if (!leftItem || !rightItem) {\n return { kind: 'incomparable', reason: 'undefined element in collection' };\n }\n const leftValue = unbox(leftItem);\n const rightValue = unbox(rightItem);\n return compare(leftValue, rightValue);\n }\n\n // Multiple value collections - must be same length for comparison\n if (left.length !== right.length) {\n // For ordering comparison, different lengths are incomparable\n // But the helper functions handle equality specially\n return { kind: 'incomparable', reason: 'different collection lengths' };\n }\n\n // Compare element by element\n for (let i = 0; i < left.length; i++) {\n const leftItem = left[i];\n const rightItem = right[i];\n if (!leftItem || !rightItem) {\n return { kind: 'incomparable', reason: 'undefined element in collection' };\n }\n const leftValue = unbox(leftItem);\n const rightValue = unbox(rightItem);\n const result = compare(leftValue, rightValue);\n \n if (result.kind !== 'equal') {\n // First non-equal element determines the result\n return result;\n }\n }\n\n return { kind: 'equal' };\n}\n\n/**\n * Check if collections are equal\n */\nexport function collectionsEqual(left: FHIRPathValue[], right: FHIRPathValue[]): boolean | null {\n // Early exit: reference equality\n if (left === right) {\n return true;\n }\n \n // Empty collections return null (incomparable)\n if (left.length === 0 || right.length === 0) {\n return null;\n }\n \n // Early exit: different lengths are definitively not equal\n if (left.length !== right.length) {\n return false;\n }\n \n // Compare elements\n const result = compareCollections(left, right);\n if (result.kind === 'incomparable') {\n // Special case: if the reason is \"complex types not equal\", we know they're not equal\n if (result.reason === 'complex types not equal') {\n return false;\n }\n return null;\n }\n return result.kind === 'equal';\n}\n\n/**\n * Check if collections are not equal\n */\nexport function collectionsNotEqual(left: FHIRPathValue[], right: FHIRPathValue[]): boolean | null {\n // Early exit: reference equality means definitely equal (so not not-equal)\n if (left === right && left.length > 0) {\n return false;\n }\n \n // Empty collections return null (incomparable)\n if (left.length === 0 || right.length === 0) {\n return null;\n }\n \n // Early exit: different lengths are definitively not equal\n if (left.length !== right.length) {\n return true;\n }\n \n // Compare elements\n const result = compareCollections(left, right);\n if (result.kind === 'incomparable') {\n // Special case: if the reason is \"complex types not equal\", we know they're not equal\n if (result.reason === 'complex types not equal') {\n return true;\n }\n return null;\n }\n return result.kind !== 'equal';\n}\n\n// Type guards\nfunction isTemporalValue(value: unknown): value is TemporalValue {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return isFHIRDate(v) || isFHIRDateTime(v) || isFHIRTime(v);\n}\n\nfunction isQuantity(value: unknown): value is QuantityValue {\n if (!value || typeof value !== 'object') return false;\n const v = value as any;\n return 'unit' in v && 'value' in v && typeof v.value === 'number' && typeof v.unit === 'string';\n}\n\nfunction isComplex(value: unknown): value is object {\n return value !== null && typeof value === 'object' && !isTemporalValue(value) && !isQuantity(value);\n}\n\n// Type-specific comparison functions\n\nfunction compareTemporal(a: TemporalValue, b: TemporalValue): ComparisonResult {\n // Use existing temporal comparison logic\n const compareResult = temporalCompare(a, b);\n \n if (compareResult === null) {\n return { kind: 'incomparable', reason: 'incomparable temporal values' };\n }\n if (compareResult === 0) {\n return { kind: 'equal' };\n }\n if (compareResult < 0) {\n return { kind: 'less' };\n }\n return { kind: 'greater' };\n}\n\nfunction compareQuantityValues(a: QuantityValue, b: QuantityValue): ComparisonResult {\n const result = compareQuantities(a, b);\n \n if (result === null) {\n return { kind: 'incomparable', reason: 'incompatible quantity dimensions' };\n }\n if (result === 0) {\n return { kind: 'equal' };\n }\n if (result < 0) {\n return { kind: 'less' };\n }\n return { kind: 'greater' };\n}\n\nfunction compareQuantityToNumber(quantity: QuantityValue, number: number): ComparisonResult {\n // Dimensionless quantities can be compared to numbers\n if (quantity.unit === '1' || quantity.unit === '') {\n if (quantity.value === number) {\n return { kind: 'equal' };\n }\n if (quantity.value < number) {\n return { kind: 'less' };\n }\n return { kind: 'greater' };\n }\n // Non-dimensionless quantity cannot be compared to a number\n return { kind: 'incomparable', reason: 'cannot compare dimensioned quantity to number' };\n}\n\nfunction compareComplex(a: any, b: any): ComparisonResult {\n // Use deep equality for complex types\n if (deepEqual(a, b)) {\n return { kind: 'equal' };\n }\n // Complex types are not orderable, so we can't say less or greater\n // But for equality purposes, we know they're not equal\n return { kind: 'incomparable', reason: 'complex types not equal' };\n}\n\nfunction comparePrimitive(a: unknown, b: unknown): ComparisonResult {\n // String comparison\n if (typeof a === 'string' && typeof b === 'string') {\n if (a === b) return { kind: 'equal' };\n if (a < b) return { kind: 'less' };\n return { kind: 'greater' };\n }\n\n // Number comparison\n if (typeof a === 'number' && typeof b === 'number') {\n if (a === b) return { kind: 'equal' };\n if (a < b) return { kind: 'less' };\n return { kind: 'greater' };\n }\n\n // Boolean comparison\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n if (a === b) return { kind: 'equal' };\n // false < true in FHIRPath\n if (!a && b) return { kind: 'less' };\n return { kind: 'greater' };\n }\n\n // Type mismatch\n if (typeof a !== typeof b) {\n return { kind: 'incomparable', reason: 'type mismatch' };\n }\n\n // Fallback to strict equality\n if (a === b) {\n return { kind: 'equal' };\n }\n return { kind: 'incomparable', reason: 'incomparable values' };\n}\n\n/**\n * Deep equality comparison for complex types\n * Handles arrays, objects, and nested structures\n */\nexport function deepEqual(a: any, b: any): boolean {\n // Early exit: same reference\n if (a === b) return true;\n\n // Early exit: different types\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB) return false;\n \n // Early exit: primitives\n if (typeA !== 'object') return false; // We already checked a === b\n \n // Null or undefined\n if (a == null || b == null) return a === b;\n\n // Arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n // Objects\n if (typeof a === 'object' && typeof b === 'object') {\n // Special handling for temporal and quantity types\n if (isTemporalValue(a) && isTemporalValue(b)) {\n return temporalEquals(a, b) === true;\n }\n if (isQuantity(a) && isQuantity(b)) {\n return compareQuantities(a, b) === 0;\n }\n\n // General object comparison\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n \n if (keysA.length !== keysB.length) return false;\n \n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n\n // Primitives\n return a === b;\n}\n\n// Performance optimization: Caching for repeated comparisons\nconst comparisonCache = new WeakMap<any, WeakMap<any, ComparisonResult>>();\n\n/**\n * Compare with caching for performance\n * Uses WeakMap to avoid memory leaks and automatically clean up when objects are garbage collected\n */\nexport function compareWithCache(a: unknown, b: unknown): ComparisonResult {\n // Only cache object comparisons (primitives are fast enough)\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n let aCache = comparisonCache.get(a);\n if (aCache) {\n const cached = aCache.get(b);\n if (cached) return cached;\n } else {\n aCache = new WeakMap();\n comparisonCache.set(a, aCache);\n }\n \n const result = compare(a, b);\n aCache.set(b, result);\n return result;\n }\n \n return compare(a, b);\n}\n\n// ============================================================================\n// Equivalence Implementation\n// ============================================================================\n\n/**\n * Check if two values are equivalent according to FHIRPath semantics\n * Equivalence is more permissive than equality:\n * - Strings are compared case-insensitively with normalized whitespace\n * - Decimals ignore trailing zeros (2.0 ~ 2.00)\n * - Quantities use UCUM semantic equivalence\n * - Collections are compared without considering order\n * - null/empty are considered equivalent\n */\nexport function equivalent(a: unknown, b: unknown): boolean | null {\n // Handle null/empty equivalence\n if (isEmpty(a) && isEmpty(b)) return true;\n if (isEmpty(a) || isEmpty(b)) return false;\n \n // String equivalence - case insensitive, normalized whitespace\n if (typeof a === 'string' && typeof b === 'string') {\n return stringEquivalent(a, b);\n }\n \n // Number/Decimal equivalence - semantic value comparison\n if (typeof a === 'number' && typeof b === 'number') {\n return decimalEquivalent(a, b);\n }\n \n // Quantity equivalence\n if (isQuantity(a) && isQuantity(b)) {\n return quantityEquivalent(a, b);\n }\n \n // Temporal types use equality semantics\n // But for equivalence, incomparable (null) means not equivalent (false)\n if (isTemporalValue(a) && isTemporalValue(b)) {\n const result = temporalEquals(a, b);\n // If temporal values are incomparable (different precision), they're not equivalent\n return result === null ? false : result;\n }\n \n // Boolean equivalence is same as equality\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b;\n }\n \n // Complex types need deep equivalence\n if (isComplex(a) && isComplex(b)) {\n return deepEquivalent(a, b);\n }\n \n // Type mismatch\n if (typeof a !== typeof b) {\n return false;\n }\n \n // Default to strict equality\n return a === b;\n}\n\n/**\n * Check if a value is empty (null, undefined, or empty array/object)\n */\nfunction isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (Array.isArray(value) && value.length === 0) return true;\n if (typeof value === 'object' && Object.keys(value).length === 0) return true;\n return false;\n}\n\n/**\n * String equivalence with case-insensitive comparison and whitespace normalization\n */\nfunction stringEquivalent(a: string, b: string): boolean {\n // Normalize whitespace: collapse multiple spaces, trim ends\n const normalize = (s: string) => \n s.replace(/\\s+/g, ' ').trim().toLowerCase();\n \n return normalize(a) === normalize(b);\n}\n\n/**\n * Decimal equivalence for FHIRPath\n * \n * Per spec: \"comparison is done on values rounded to the precision of the \n * least precise operand. Trailing zeroes after the decimal are ignored in \n * determining precision.\"\n * \n * Since JavaScript loses literal precision (1.0 becomes 1), we deduce precision:\n * - Numbers with no fractional part (1, 2.0 -> 2) have 0 decimal places\n * - Numbers with fractional parts use their actual decimal places\n */\nfunction decimalEquivalent(a: number, b: number): boolean {\n // Handle special cases\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\n if (Number.isNaN(a) || Number.isNaN(b)) return false;\n \n // Infinite values must match exactly\n if (!Number.isFinite(a) || !Number.isFinite(b)) {\n return a === b;\n }\n \n // Deduce precision from the numeric values\n const aPrecision = getDecimalPrecision(a);\n const bPrecision = getDecimalPrecision(b);\n \n // Round both to the minimum precision\n const minPrecision = Math.min(aPrecision, bPrecision);\n \n // Round both numbers to the minimum precision\n const factor = Math.pow(10, minPrecision);\n const aRounded = Math.round(a * factor) / factor;\n const bRounded = Math.round(b * factor) / factor;\n \n return aRounded === bRounded;\n}\n\n/**\n * Get the effective decimal precision of a number.\n * Numbers with no fractional part (like 1.0 which becomes 1) have 0 precision.\n * Numbers with fractional parts have precision based on significant decimal places.\n */\nfunction getDecimalPrecision(n: number): number {\n // If it's effectively an integer (no fractional part), precision is 0\n if (Number.isInteger(n)) {\n return 0;\n }\n \n // Convert to string to count decimal places\n // Use a reasonable maximum precision to avoid floating point artifacts\n const str = n.toFixed(8).replace(/0+$/, '').replace(/\\.$/, '');\n const decimalIndex = str.indexOf('.');\n \n if (decimalIndex === -1) {\n return 0;\n }\n \n return str.length - decimalIndex - 1;\n}\n\n// Calendar to UCUM duration mappings for equivalence\nconst CALENDAR_TO_UCUM_MAP: Record<string, string> = {\n 'year': 'a',\n 'years': 'a',\n 'month': 'mo',\n 'months': 'mo',\n 'week': 'wk',\n 'weeks': 'wk',\n 'day': 'd',\n 'days': 'd',\n 'hour': 'h',\n 'hours': 'h',\n 'minute': 'min',\n 'minutes': 'min',\n 'second': 's',\n 'seconds': 's',\n 'millisecond': 'ms',\n 'milliseconds': 'ms'\n};\n\n/**\n * Quantity equivalence with UCUM semantic comparison and calendar mappings\n */\nfunction quantityEquivalent(a: QuantityValue, b: QuantityValue): boolean | null {\n // Check for calendar to UCUM equivalence\n const aIsCalendar = CALENDAR_TO_UCUM_MAP[a.unit] !== undefined;\n const bIsCalendar = CALENDAR_TO_UCUM_MAP[b.unit] !== undefined;\n \n // Calendar to UCUM mapping\n if (aIsCalendar && !bIsCalendar) {\n const ucumUnit = CALENDAR_TO_UCUM_MAP[a.unit];\n return ucumUnit === b.unit && a.value === b.value;\n }\n if (!aIsCalendar && bIsCalendar) {\n const ucumUnit = CALENDAR_TO_UCUM_MAP[b.unit];\n return ucumUnit === a.unit && a.value === b.value;\n }\n \n // Both calendar units - must be same unit and value\n if (aIsCalendar && bIsCalendar) {\n // Normalize to singular/plural\n const aNorm = CALENDAR_TO_UCUM_MAP[a.unit];\n const bNorm = CALENDAR_TO_UCUM_MAP[b.unit];\n return aNorm === bNorm && a.value === b.value;\n }\n \n // Standard UCUM semantic equivalence (1000 mg ~ 1 g)\n const result = compareQuantities(a, b);\n return result === 0;\n}\n\n/**\n * Deep equivalence for complex objects\n * Similar to deep equality but uses equivalence rules for nested values\n */\nfunction deepEquivalent(a: any, b: any): boolean {\n // Early exit: same reference\n if (a === b) return true;\n \n // Arrays - compare elements using equivalence\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const equiv = equivalent(a[i], b[i]);\n if (equiv !== true) return false;\n }\n return true;\n }\n \n // Objects - compare properties using equivalence\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n \n if (keysA.length !== keysB.length) return false;\n \n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n const equiv = equivalent(a[key], b[key]);\n if (equiv !== true) return false;\n }\n return true;\n }\n \n return false;\n}\n\n/**\n * Compare collections for equivalence\n * Collections are equivalent if they contain the same elements regardless of order\n */\nexport function collectionsEquivalent(left: FHIRPathValue[], right: FHIRPathValue[]): boolean | null {\n // Empty collections are equivalent\n if (left.length === 0 && right.length === 0) return true;\n \n // One empty, one not - not equivalent\n if (left.length === 0 || right.length === 0) return false;\n \n // Different lengths = not equivalent\n if (left.length !== right.length) return false;\n \n // Single element collections\n if (left.length === 1 && right.length === 1) {\n const leftValue = unbox(left[0]!);\n const rightValue = unbox(right[0]!);\n return equivalent(leftValue, rightValue);\n }\n \n // Sort both collections for comparison\n // We need a stable sort that groups equivalent elements together\n const sortedLeft = [...left].sort((a, b) => sortCompareForEquivalence(unbox(a), unbox(b)));\n const sortedRight = [...right].sort((a, b) => sortCompareForEquivalence(unbox(a), unbox(b)));\n \n // Compare sorted elements using equivalence\n for (let i = 0; i < sortedLeft.length; i++) {\n const leftValue = unbox(sortedLeft[i]!);\n const rightValue = unbox(sortedRight[i]!);\n const equiv = equivalent(leftValue, rightValue);\n \n if (equiv === null) return null;\n if (equiv === false) return false;\n }\n \n return true;\n}\n\n/**\n * Compare collections for non-equivalence\n */\nexport function collectionsNotEquivalent(left: FHIRPathValue[], right: FHIRPathValue[]): boolean | null {\n const result = collectionsEquivalent(left, right);\n if (result === null) return null;\n return !result;\n}\n\n/**\n * Comparison function for sorting collections for equivalence comparison\n * Groups equivalent items together\n */\nfunction sortCompareForEquivalence(a: unknown, b: unknown): number {\n // Handle null/undefined\n if (a === null || a === undefined) return b === null || b === undefined ? 0 : -1;\n if (b === null || b === undefined) return 1;\n \n // Type-based ordering\n const typeOrder = ['boolean', 'number', 'string', 'object'];\n const typeA = typeof a;\n const typeB = typeof b;\n const orderA = typeOrder.indexOf(typeA);\n const orderB = typeOrder.indexOf(typeB);\n \n if (orderA !== orderB) {\n return orderA - orderB;\n }\n \n // Same type comparison\n switch (typeA) {\n case 'boolean':\n return (a as boolean) === (b as boolean) ? 0 : (a as boolean) ? 1 : -1;\n \n case 'number':\n return (a as number) - (b as number);\n \n case 'string':\n // Use normalized comparison for sorting\n const aNorm = (a as string).toLowerCase().trim();\n const bNorm = (b as string).toLowerCase().trim();\n return aNorm < bNorm ? -1 : aNorm > bNorm ? 1 : 0;\n \n case 'object':\n // For objects, use a stable stringification\n // This is not perfect but works for sorting purposes\n const aStr = JSON.stringify(a);\n const bStr = JSON.stringify(b);\n return aStr < bStr ? -1 : aStr > bStr ? 1 : 0;\n \n default:\n return 0;\n }\n}","import type { OperatorDefinition, OperationEvaluator } from '../types';\nimport { PRECEDENCE } from '../types';\nimport { box } from '../interpreter/boxing';\nimport { collectionsNotEqual } from './comparison';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Use the unified comparison system\n const result = collectionsNotEqual(left, right);\n \n // null means incomparable (returns empty)\n if (result === null) {\n return { value: [], context };\n }\n \n // Return the boolean result\n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const notEqualOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '!=',\n name: 'notEqual',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\n description: 'The converse of the equals operator, returning true if equal returns false; false if equal returns true; and empty ({ }) if equal returns empty',\n examples: ['name != \"John\"', 'Patient.gender != \"male\"', '5 != 3'],\n signatures: [\n {\n name: 'not-equal',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true },\n },\n {\n name: 'not-equal',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: false },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box } from '../interpreter/boxing';\nimport { collectionsEquivalent } from './comparison';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Use the new collectionsEquivalent function from comparison.ts\n const result = collectionsEquivalent(left, right);\n \n // null result means incomparable - return empty collection\n if (result === null) {\n return { value: [], context };\n }\n \n // Return boolean result\n return {\n value: [box(result, { type: 'Boolean', singleton: true })],\n context\n };\n};\n\nexport const equivalentOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '~',\n name: 'equivalent',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\n doesNotPropagateEmpty: true, // Empty collections are valid operands for equivalence\n description: 'Returns true if the collections are the same. For single items: strings are compared case-insensitive with normalized whitespace, decimals are rounded to least precision, dates with different precision return false. For collections: order-independent comparison. Empty ~ empty returns true (unlike =)',\n examples: [\n \"'abc' ~ 'ABC'\",\n \"1.0 ~ 1.00\",\n \"{ } ~ { }\",\n \"(1 | 2 | 3) ~ (3 | 2 | 1)\",\n \"@2012-01-01 ~ @2012-01\"\n ],\n signatures: [\n {\n name: 'equivalent',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: false },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box } from '../interpreter/boxing';\nimport { collectionsNotEquivalent } from './comparison';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Use the new collectionsNotEquivalent function from comparison.ts\n const result = collectionsNotEquivalent(left, right);\n \n // null result means incomparable - return empty collection\n if (result === null) {\n return { value: [], context };\n }\n \n // Return boolean result\n return {\n value: [box(result, { type: 'Boolean', singleton: true })],\n context\n };\n};\n\nexport const notEquivalentOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '!~',\n name: 'notEquivalent',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\n doesNotPropagateEmpty: true, // Empty collections are valid operands for not-equivalence\n description: 'The converse of the equivalent operator, returning true if equivalent returns false and false if equivalent returns true. In other words, A !~ B is short-hand for (A ~ B).not()',\n examples: [\n \"'abc' !~ 'ABC'\",\n \"1.0 !~ 1.01\",\n \"{ } !~ { }\",\n \"(1 | 2 | 3) !~ (3 | 2 | 1)\",\n \"@2012-01-01 !~ @2012-01\"\n ],\n signatures: [\n {\n name: 'notEquivalent',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: false },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Three-valued logic implementation\n \n // Get values safely\n const leftBoxed = left.length > 0 ? left[0] : null;\n const rightBoxed = right.length > 0 ? right[0] : null;\n \n const leftValue = leftBoxed ? unbox(leftBoxed) : null;\n const rightValue = rightBoxed ? unbox(rightBoxed) : null;\n \n // If either operand is false, result is false\n if (leftValue === false || rightValue === false) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // If both operands are true, result is true\n if (leftValue === true && rightValue === true) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Otherwise (empty or non-boolean), result is empty\n return { value: [], context };\n};\n\nexport const andOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'and',\n name: 'and',\n doesNotPropagateEmpty: true, // Three-valued logic: false and empty = false\n category: ['logical'],\n precedence: PRECEDENCE.AND,\n associativity: 'left',\n description: 'Returns true if both operands evaluate to true, false if either operand evaluates to false, and the empty collection ({ }) otherwise',\n examples: ['active and verified', 'Patient.active and Patient.gender = \"male\"'],\n signatures: [\n {\n name: 'and',\n left: { type: 'Boolean', singleton: true },\n right: { type: 'Boolean', singleton: true },\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Three-valued logic implementation\n \n // Get values safely\n const leftBoxed = left.length > 0 ? left[0] : null;\n const rightBoxed = right.length > 0 ? right[0] : null;\n \n const leftValue = leftBoxed ? unbox(leftBoxed) : null;\n const rightValue = rightBoxed ? unbox(rightBoxed) : null;\n \n // If either operand is true, result is true\n if (leftValue === true || rightValue === true) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // If both operands are false, result is false\n if (leftValue === false && rightValue === false) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Otherwise (empty or non-boolean), result is empty\n return { value: [], context };\n};\n\nexport const orOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'or',\n name: 'or',\n doesNotPropagateEmpty: true, // Three-valued logic: true or empty = true\n category: ['logical'],\n precedence: PRECEDENCE.OR,\n associativity: 'left',\n description: 'Returns false if both operands evaluate to false, true if either operand evaluates to true, and empty ({ }) otherwise',\n examples: ['true or false', 'Patient.active or Patient.gender = \"female\"'],\n signatures: [{\n name: 'or',\n left: { type: 'Boolean', singleton: true },\n right: { type: 'Boolean', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Three-valued logic for XOR\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n const boxedl = left[0];\n if (!boxedl) return { value: [], context };\n const l = unbox(boxedl);\n const boxedr = right[0];\n if (!boxedr) return { value: [], context };\n const r = unbox(boxedr);\n if (typeof l === 'boolean' && typeof r === 'boolean') {\n return { value: [box(l !== r, { type: 'Boolean', singleton: true })], context };\n }\n return { value: [], context };\n};\n\nexport const xorOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'xor',\n name: 'xor',\n category: ['logical'],\n precedence: PRECEDENCE.XOR,\n associativity: 'left',\n description: 'Returns true if exactly one of the operands evaluates to true, false if either both operands evaluate to true or both operands evaluate to false, and empty ({ }) otherwise',\n examples: ['true xor false', 'Patient.active xor Patient.deceased.exists()'],\n signatures: [{\n name: 'xor',\n left: { type: 'Boolean', singleton: true },\n right: { type: 'Boolean', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Three-valued logic for implies per spec truth table\n \n // Handle empty left operand\n if (left.length === 0) {\n if (right.length === 0) {\n return { value: [], context }; // empty implies empty = empty\n }\n const boxedRight = right[0];\n if (boxedRight && unbox(boxedRight) === false) {\n return { value: [], context }; // empty implies false = empty\n }\n return { value: [box(true, { type: 'Boolean', singleton: true })], context }; // empty implies true = true\n }\n \n const boxedLeft = left[0];\n if (!boxedLeft) {\n return { value: [], context };\n }\n \n const leftValue = unbox(boxedLeft);\n \n // Handle false left operand\n if (leftValue === false) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context }; // false implies anything = true\n }\n \n // Handle true left operand\n if (leftValue === true) {\n if (right.length === 0) {\n return { value: [], context }; // true implies empty = empty\n }\n \n // true implies y = y (pass through the boxed right value)\n return { value: [right[0]!], context };\n }\n \n // Non-boolean left value returns empty\n return { value: [], context };\n};\n\nexport const impliesOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'implies',\n name: 'implies',\n category: ['logical'],\n precedence: PRECEDENCE.IMPLIES,\n associativity: 'right',\n description: 'If the left operand evaluates to true, returns the boolean evaluation of the right operand. If the left operand evaluates to false, returns true. Otherwise, returns true if the right operand evaluates to true, and empty ({ }) otherwise',\n examples: [\n 'Patient.name.given.exists() implies Patient.name.family.exists()',\n 'CareTeam.onBehalfOf.exists() implies (CareTeam.member.resolve() is Practitioner)',\n 'StructureDefinition.contextInvariant.exists() implies StructureDefinition.type = \\'Extension\\''\n ],\n signatures: [{\n name: 'implies',\n left: { type: 'Boolean', singleton: true },\n right: { type: 'Boolean', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // If left is empty, result is empty\n if (left.length === 0) {\n return { value: [], context };\n }\n \n // Left must have single item\n if (left.length > 1) {\n throw Errors.invalidOperation('in operator: left operand must be a single item');\n }\n \n // If right is empty, result is false\n if (right.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check if the single left item is in right using equality\n const boxedLeftItem = left[0];\n if (!boxedLeftItem) {\n return { value: [], context };\n }\n \n const leftItem = unbox(boxedLeftItem);\n \n for (const boxedRightItem of right) {\n const rightItem = unbox(boxedRightItem);\n // Use deep equality for comparison\n if (JSON.stringify(leftItem) === JSON.stringify(rightItem)) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const inOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'in',\n name: 'in',\n category: ['membership'],\n precedence: PRECEDENCE.IN_CONTAINS,\n associativity: 'left',\n doesNotPropagateEmpty: true, // Has custom empty handling per spec\n description: 'If the left operand is a collection with a single item, returns true if the item is in the right operand using equality semantics. If the left is empty, the result is empty. If the right is empty, the result is false.',\n examples: ['\\'Joe\\' in Patient.name.given', '5 in (1 | 2 | 3 | 4 | 5)', 'code in terminologyServer.valueset(\\'my-valueset\\').code'],\n signatures: [\n {\n name: 'in',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', singleton: false },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // If right is empty, result is empty\n if (right.length === 0) {\n return { value: [], context };\n }\n \n // Right must have single item\n if (right.length > 1) {\n throw Errors.invalidOperation('contains operator: right operand must be a single item');\n }\n \n // If left is empty, result is false\n if (left.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check if the single right item is in left using equality\n const boxedRightItem = right[0];\n if (!boxedRightItem) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n const rightItem = unbox(boxedRightItem);\n \n for (const boxedLeftItem of left) {\n const leftItem = unbox(boxedLeftItem);\n if (leftItem === rightItem) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const containsOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'contains',\n name: 'contains',\n doesNotPropagateEmpty: true, // Empty left operand returns false\n category: ['membership'],\n precedence: PRECEDENCE.IN_CONTAINS,\n associativity: 'left',\n description: 'If the right operand is a collection with a single item, returns true if the item is in the left operand using equality semantics. If the right is empty, the result is empty. If the left is empty, the result is false',\n examples: ['Patient.name.given contains \\'Joe\\'', '(1 | 2 | 3 | 4 | 5) contains 5', 'valueset.code contains code'],\n signatures: [\n {\n name: 'contains',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition, TypeName } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRDate, isFHIRDateTime, isFHIRTime } from '../complex-types/temporal';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Right operand should be a type identifier\n // Empty collection returns empty (not false)\n if (left.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = left[0];\n const item = unbox(boxedItem);\n const typeName = right[0] as string; // Should be a type name like 'String', 'Integer', etc.\n \n // If we have a ModelProvider and typeInfo, use it for accurate type checking (handles subtypes)\n if (context.modelProvider && boxedItem?.typeInfo) {\n const matchingType = context.modelProvider.ofType(boxedItem.typeInfo, typeName as TypeName);\n return { \n value: [box(matchingType !== undefined, { type: 'Boolean', singleton: true })], \n context \n };\n }\n \n // Check if the box has type information (without ModelProvider, just check exact match)\n if (boxedItem?.typeInfo) {\n return { \n value: [box(boxedItem.typeInfo.type === typeName, { type: 'Boolean', singleton: true })], \n context \n };\n }\n \n // For FHIR resources without typeInfo, try to get it from modelProvider\n if (context.modelProvider && item && typeof item === 'object' && 'resourceType' in item && typeof item.resourceType === 'string') {\n // Use cached type if available\n const typeInfo = await context.modelProvider.getType(item.resourceType);\n if (typeInfo) {\n const matchingType = context.modelProvider.ofType(typeInfo, typeName as TypeName);\n return { \n value: [box(matchingType !== undefined, { type: 'Boolean', singleton: true })], \n context \n };\n }\n // If we can't get type info, fall back to exact resourceType match\n return { \n value: [box(item.resourceType === typeName, { type: 'Boolean', singleton: true })], \n context \n };\n }\n \n // Check primitive types\n switch (typeName) {\n case 'String':\n return { value: [box(typeof item === 'string', { type: 'Boolean', singleton: true })], context };\n case 'Boolean':\n return { value: [box(typeof item === 'boolean', { type: 'Boolean', singleton: true })], context };\n case 'Integer':\n return { value: [box(typeof item === 'number' && Number.isInteger(item), { type: 'Boolean', singleton: true })], context };\n case 'Decimal':\n return { value: [box(typeof item === 'number', { type: 'Boolean', singleton: true })], context };\n case 'Date':\n // Check if it's a FHIRDate instance or has Date type\n if (item && typeof item === 'object') {\n return { value: [box(isFHIRDate(item) || (item as any).kind === 'FHIRDate', { type: 'Boolean', singleton: true })], context };\n }\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n case 'DateTime':\n // Check if it's a FHIRDateTime instance or has DateTime type\n if (item && typeof item === 'object') {\n return { value: [box(isFHIRDateTime(item) || (item as any).kind === 'FHIRDateTime', { type: 'Boolean', singleton: true })], context };\n }\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n case 'Time':\n // Check if it's a FHIRTime instance or has Time type\n if (item && typeof item === 'object') {\n return { value: [box(isFHIRTime(item) || (item as any).kind === 'FHIRTime', { type: 'Boolean', singleton: true })], context };\n }\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n default:\n // For complex types, check resourceType\n if (item && typeof item === 'object' && 'resourceType' in item) {\n return { value: [box(item.resourceType === typeName, { type: 'Boolean', singleton: true })], context };\n }\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n};\n\nexport const isOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'is',\n name: 'is',\n category: ['type'],\n precedence: PRECEDENCE.AS_IS,\n associativity: 'left',\n description: 'Type test operator',\n examples: ['value is String'],\n signatures: [],\n evaluate\n};\n\n// TypeInfo unionType of all attribute types on current level:\n// gender: {type: code}\n// \n// children() -> ","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRDate, isFHIRDateTime, isFHIRTime } from '../complex-types/temporal';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // 'as' operator performs type casting/filtering\n // Returns items that match the type, empty if no match\n if (left.length === 0) {\n return { value: [], context };\n }\n \n const results: any[] = [];\n const typeName = right[0] as string; // Should be a type name\n \n for (const boxedItem of left) {\n const item = unbox(boxedItem);\n let matches = false;\n \n // Check typeInfo first if available\n if (boxedItem?.typeInfo) {\n // If we have a ModelProvider, use it for accurate type checking (handles subtypes)\n if (context.modelProvider) {\n const matchingType = context.modelProvider.ofType(boxedItem.typeInfo, typeName as any);\n matches = matchingType !== undefined;\n } else {\n // Without ModelProvider, just check exact match\n matches = boxedItem.typeInfo.type === typeName;\n }\n } else {\n // Fallback to primitive type checking\n switch (typeName) {\n case 'String':\n matches = typeof item === 'string';\n break;\n case 'Boolean':\n matches = typeof item === 'boolean';\n break;\n case 'Integer':\n matches = typeof item === 'number' && Number.isInteger(item);\n break;\n case 'Decimal':\n matches = typeof item === 'number';\n break;\n case 'Date':\n // Check if it's a FHIRDate instance or has Date typeInfo\n if (item && typeof item === 'object') {\n matches = isFHIRDate(item) || (item as any).kind === 'FHIRDate';\n }\n break;\n case 'DateTime':\n // Check if it's a FHIRDateTime instance or has DateTime typeInfo\n if (item && typeof item === 'object') {\n matches = isFHIRDateTime(item) || (item as any).kind === 'FHIRDateTime';\n }\n break;\n case 'Time':\n // Check if it's a FHIRTime instance or has Time typeInfo\n if (item && typeof item === 'object') {\n matches = isFHIRTime(item) || (item as any).kind === 'FHIRTime';\n }\n break;\n default:\n // For complex types, check resourceType\n if (item && typeof item === 'object' && 'resourceType' in item) {\n matches = item.resourceType === typeName;\n }\n }\n }\n \n if (matches) {\n results.push(boxedItem);\n }\n }\n \n return { value: results, context };\n};\n\nexport const asOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'as',\n name: 'as',\n category: ['type'],\n precedence: PRECEDENCE.AS_IS,\n associativity: 'left',\n description: 'Type cast operator',\n examples: ['value as String'],\n signatures: [],\n evaluate\n};","import type { FunctionDefinition, RuntimeContext, ASTNode, TypeInfo, NodeEvaluator, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport type { FHIRPathValue } from '../interpreter/boxing';\nimport { unbox } from '../interpreter/boxing';\nimport { isIdentifierNode, isFunctionNode } from '../types';\n\nexport const ofTypeFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'ofType',\n category: ['type'],\n description: 'Filters input collection to include only items of the specified type',\n examples: [\n 'Observation.value.ofType(Quantity)',\n 'Patient.deceased.ofType(Boolean)'\n ],\n signatures: [{\n\n name: 'ofType',\n input: { type: 'Any', singleton: false },\n parameters: [\n { \n name: 'type', \n type: { type: 'Any', singleton: true },\n expression: true,\n typeReference: true // This parameter expects a type name\n }\n ],\n result: 'inputType'\n }],\n async evaluate(input: FHIRPathValue[], context: RuntimeContext, args: ASTNode[], evaluator: NodeEvaluator) {\n if (args.length !== 1) {\n throw Errors.invalidOperation('ofType requires exactly one argument');\n }\n\n const typeArg = args[0]!;\n \n // Extract type name from the argument\n let targetTypeName: string;\n if (isIdentifierNode(typeArg)) {\n targetTypeName = typeArg.name;\n } else if (isFunctionNode(typeArg) && isIdentifierNode(typeArg.name)) {\n // Handle cases like ofType(Patient())\n targetTypeName = typeArg.name.name;\n } else {\n throw Errors.invalidOperation(`ofType() requires a type name as argument, got ${typeArg.type}`);\n }\n\n // If we have typeInfo from the analyzer (with ModelProvider), use it\n // NOTE: This optimization is currently disabled because currentNode refers to the ofType\n // function node, not the input navigation node. The correct type checking happens below\n // using the boxed items' typeInfo.\n /*\n const currentNode = context.currentNode;\n if (currentNode?.typeInfo?.modelContext) {\n // Type-aware filtering with model context\n const modelContext = currentNode.typeInfo.modelContext as any;\n \n // For union types, check if the target type is a valid choice\n if (modelContext.isUnion && modelContext.choices) {\n const validChoice = modelContext.choices.find((c: any) => \n c.type === targetTypeName || c.elementType === targetTypeName\n );\n \n if (!validChoice) {\n // Type system knows this filter returns empty\n return { value: [], context };\n }\n \n // Filter based on the choice property\n const choiceProperty = validChoice.property;\n const filtered = input.filter(boxedItem => {\n const item = unbox(boxedItem);\n return item && typeof item === 'object' && choiceProperty in item;\n });\n \n return { value: filtered, context };\n }\n }\n */\n\n // Filter using ModelProvider if available, otherwise fall back to type info and runtime checks\n const filtered = await Promise.all(input.map(async boxedItem => {\n const item = unbox(boxedItem);\n \n // If we have a ModelProvider in context, use it for accurate type checking\n if (context.modelProvider && boxedItem.typeInfo) {\n const matchingType = context.modelProvider.ofType(boxedItem.typeInfo, targetTypeName as import('../types').TypeName);\n return matchingType !== undefined;\n }\n \n // Check if the box has specific type information (not just \"Any\")\n if (boxedItem.typeInfo && boxedItem.typeInfo.type !== 'Any') {\n // If we have specific type info, use it for accurate filtering\n return boxedItem.typeInfo.type === targetTypeName;\n }\n \n // For FHIR resources without typeInfo, try to get it from modelProvider\n if (context.modelProvider && item && typeof item === 'object' && 'resourceType' in item && typeof item.resourceType === 'string') {\n const typeInfo = await context.modelProvider.getType(item.resourceType);\n if (typeInfo) {\n const matchingType = context.modelProvider.ofType(typeInfo, targetTypeName as import('../types').TypeName);\n return matchingType !== undefined;\n }\n return false;\n }\n \n // Check primitive types\n switch (targetTypeName) {\n case 'String':\n return typeof item === 'string';\n case 'Boolean':\n return typeof item === 'boolean';\n case 'Integer':\n return typeof item === 'number' && Number.isInteger(item);\n case 'Decimal':\n return typeof item === 'number';\n case 'Date':\n case 'DateTime':\n case 'Time':\n // Simple check for date-like strings\n return typeof item === 'string' && !isNaN(Date.parse(item));\n default:\n // For complex types, check resourceType\n if (item && typeof item === 'object' && 'resourceType' in item) {\n return item.resourceType === targetTypeName;\n }\n return false;\n }\n }));\n \n // Filter out false results (map returns boolean for each item)\n const actualFiltered = input.filter((_, index) => filtered[index]);\n\n return { value: actualFiltered, context };\n }\n};\n","import type { FunctionDefinition, FunctionEvaluator, ASTNode, RuntimeContext, NodeEvaluator } from '../types';\nimport type { FHIRPathValue } from '../interpreter/boxing';\nimport { NodeType, isIdentifierNode } from '../types';\nimport { box } from '../interpreter/boxing';\nimport { evaluate as isOperatorEvaluate } from './is-operator';\n\nconst isEvaluator: FunctionEvaluator = async (\n input: FHIRPathValue[], \n context: RuntimeContext, \n args: ASTNode[],\n evaluator: NodeEvaluator\n) => {\n // is() function takes one argument - the type name\n if (args.length !== 1) {\n return { value: [], context };\n }\n \n const typeArg = args[0];\n if (!typeArg) {\n return { value: [], context };\n }\n \n // Extract type name from the argument AST node\n let typeName: string;\n \n if (isIdentifierNode(typeArg)) {\n typeName = typeArg.name;\n } else {\n // For other node types, try to get the name\n throw new Error(`is() requires a type name as argument, got ${typeArg.type}`);\n }\n \n // Use the is operator implementation with the type name\n return isOperatorEvaluate(input, context, input, [typeName]);\n};\n\nexport { isEvaluator };\n\nexport const isFunction: FunctionDefinition & { evaluate: typeof isEvaluator } = {\n name: 'is',\n category: ['type'],\n description: 'Tests if the input is of the specified type',\n examples: ['Patient.name.is(HumanName)', '\"hello\".is(String)', '5.is(Integer)'],\n signatures: [\n {\n name: 'is-type-check', \n parameters: [{ \n name: 'type', \n type: { type: 'Any', singleton: true },\n expression: true,\n typeReference: true \n }],\n input: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true }\n }\n ],\n doesNotPropagateEmpty: false,\n evaluate: isEvaluator\n};\n","import type { FunctionDefinition, FunctionEvaluator, ASTNode, RuntimeContext, NodeEvaluator } from '../types';\nimport type { FHIRPathValue } from '../interpreter/boxing';\nimport { NodeType, isIdentifierNode } from '../types';\nimport { evaluate as asOperatorEvaluate } from './as-operator';\n\nconst asEvaluator: FunctionEvaluator = async (\n input: FHIRPathValue[], \n context: RuntimeContext, \n args: ASTNode[],\n evaluator: NodeEvaluator\n) => {\n // as() function takes one argument - the type name\n if (args.length !== 1) {\n return { value: [], context };\n }\n \n const typeArg = args[0];\n if (!typeArg) {\n return { value: [], context };\n }\n \n // Extract type name from the argument AST node\n let typeName: string;\n \n if (isIdentifierNode(typeArg)) {\n typeName = typeArg.name;\n } else {\n // For other node types, try to get the name\n throw new Error(`as() requires a type name as argument, got ${typeArg.type}`);\n }\n \n // Use the as operator implementation with the type name\n return asOperatorEvaluate(input, context, input, [typeName]);\n};\n\nexport { asEvaluator };\n\nexport const asFunction: FunctionDefinition & { evaluate: typeof asEvaluator } = {\n name: 'as',\n category: ['type'],\n description: 'Casts the input to the specified type, returning empty if the cast fails',\n examples: ['Patient.name.as(HumanName)', '\"hello\".as(String)', '5.as(Integer)'],\n signatures: [\n {\n name: 'as-type-cast',\n parameters: [{ \n name: 'type', \n type: { type: 'Any', singleton: true },\n expression: true,\n typeReference: true\n }],\n input: { type: 'Any', singleton: false },\n result: { type: 'Any', singleton: false }\n }\n ],\n doesNotPropagateEmpty: false,\n evaluate: asEvaluator\n};\n","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { evaluate as equalsEvaluate } from './equal-operator';\nimport { Errors } from '../errors';\n\n// Note: The union operator is special and is typically handled directly in the interpreter\n// because it needs to preserve the original context for both operands\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // '|' deduplicates using equals (=) semantics\n const result: any[] = [];\n const isDup = async (candidate: any): Promise<boolean> => {\n for (const existing of result) {\n const eq = await equalsEvaluate(input, context, [existing], [candidate]);\n const v = eq.value[0];\n if (v && typeof v.value === 'boolean' && v.value === true) {\n return true;\n }\n }\n return false;\n };\n for (const item of left) {\n if (!(await isDup(item))) {\n result.push(item);\n }\n }\n for (const item of right) {\n if (!(await isDup(item))) {\n result.push(item);\n }\n }\n return { value: result, context };\n};\n\nexport const unionOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '|',\n name: 'union',\n category: ['collection'],\n precedence: PRECEDENCE.PIPE,\n associativity: 'left',\n description: 'Merges two collections into a single collection, eliminating duplicates using equals (=) semantics. Order is not guaranteed.',\n examples: [\n 'name.given | name.family',\n 'Patient.identifier | Patient.contact.identifier',\n '(1 | 2 | 3) | (2 | 3 | 4)',\n 'name.select(use | given)'\n ],\n signatures: [\n {\n name: 'union',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: false },\n result: 'leftType' as any,\n }\n ],\n evaluate\n};\n","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Combine operator concatenates all values as strings\n // Empty collections are treated as empty string\n const leftStr = left.length === 0 ? '' : left.map(v => String(unbox(v))).join('');\n const rightStr = right.length === 0 ? '' : right.map(v => String(unbox(v))).join('');\n \n // Always return a string, even if both are empty\n return { value: [box(leftStr + rightStr, { type: 'String', singleton: true })], context };\n};\n\nexport const combineOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '&',\n name: 'combine',\n doesNotPropagateEmpty: true, // Treats empty as empty string, always returns a string\n category: ['string'],\n precedence: PRECEDENCE.ADDITIVE,\n associativity: 'left',\n description: 'String concatenation operator',\n examples: ['first & \" \" & last'],\n signatures: [\n {\n name: 'string-combine',\n left: { type: 'String', singleton: true },\n right: { type: 'String', singleton: true },\n result: { type: 'String', singleton: true },\n },\n {\n name: 'any-combine',\n left: { type: 'Any' },\n right: { type: 'Any' },\n result: { type: 'String', singleton: true },\n }\n ],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\n// Note: The dot operator is special and is typically handled directly in the interpreter\n// because it needs to evaluate its operands in sequence, not in parallel\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // This should not be called directly - dot operator needs special handling\n // in the interpreter to properly sequence evaluation\n throw Errors.invalidOperation('Dot operator requires special handling in the interpreter');\n};\n\nexport const dotOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '.',\n name: 'dot',\n category: ['navigation'],\n precedence: PRECEDENCE.DOT,\n associativity: 'left',\n description: 'Navigation operator',\n examples: ['Patient.name.given'],\n signatures: [\n {\n name: 'navigation',\n left: { type: 'Any', singleton: false },\n right: { type: 'Any', singleton: false },\n result: { type: 'Any', singleton: false }\n },\n {\n name: 'navigation-singleton',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', singleton: false },\n result: { type: 'Any', singleton: false }\n }\n ],\n evaluate\n};","import { Errors } from '../errors';\nimport type { RuntimeContext } from '../types';\nimport { box } from './boxing';\n\n// Temporal creators used for deterministic caches\nimport { createDateTime, createDate, createTime } from '../complex-types/temporal';\n\nexport interface BootstrapOptions {\n modelProvider?: import('../types').ModelProvider;\n variables?: Record<string, unknown>;\n now?: Date; // provide deterministic time for tests\n}\n\n/**\n * Runtime context manager that provides efficient prototype-based context operations\n * for both interpreter and compiler.\n */\nexport class RuntimeContextManager {\n /**\n * Create a new runtime context\n */\n static create(input: any[], initialVariables?: Record<string, any>): RuntimeContext {\n const context = Object.create(null) as RuntimeContext;\n\n context.input = input;\n context.focus = input;\n\n // Create variables object with null prototype to avoid pollution\n context.variables = Object.create(null);\n\n // Set root context variables with % prefix\n context.variables['%context'] = input;\n context.variables['%resource'] = input;\n context.variables['%rootResource'] = input;\n\n // Add any initial variables (with % prefix for user-defined)\n if (initialVariables) {\n for (const [key, value] of Object.entries(initialVariables)) {\n // Add % prefix if not already present and not a special variable\n const varKey = key.startsWith('$') || key.startsWith('%') ? key : `%${key}`;\n context.variables[varKey] = value;\n }\n }\n\n return context;\n }\n\n /**\n * Create a child context using prototype inheritance\n * O(1) operation - no copying needed\n */\n static copy(context: RuntimeContext): RuntimeContext {\n // Create child context with parent as prototype\n const newContext = Object.create(context) as RuntimeContext;\n\n // Create child variables that inherit from parent's variables\n newContext.variables = Object.create(context.variables);\n\n // input and focus are inherited through prototype chain\n // Only set them if they need to change\n\n return newContext;\n }\n\n /**\n * Create a new context with updated input/focus\n */\n static withInput(context: RuntimeContext, input: any[], focus?: any[]): RuntimeContext {\n const newContext = this.copy(context);\n newContext.input = input;\n newContext.focus = focus ?? input;\n return newContext;\n }\n\n /**\n * Set iterator context ($this, $index)\n */\n static withIterator(\n context: RuntimeContext,\n item: any,\n index: number\n ): RuntimeContext {\n let newContext = this.setVariable(context, '$this', [item], true);\n newContext = this.setVariable(newContext, '$index', index, true);\n return newContext;\n }\n\n /**\n * Set a variable in the context (handles both special $ and user % variables)\n */\n static setVariable(context: RuntimeContext, name: string, value: any, allowRedefinition: boolean = false): RuntimeContext {\n // Ensure value is array for consistency (except for special variables like $index)\n const arrayValue = (name === '$index' || name === '$total') ? value :\n Array.isArray(value) ? value : [value];\n\n // Determine variable key based on prefix\n let varKey = name;\n if (!name.startsWith('$') && !name.startsWith('%')) {\n // No prefix - assume user-defined variable, add % prefix\n varKey = `%${name}`;\n }\n\n // Check for system variables (with or without % prefix)\n const systemVariables = ['context', 'resource', 'rootResource', 'ucum', 'sct', 'loinc'];\n const baseVarName = varKey.startsWith('%') ? varKey.substring(1) : varKey;\n if (systemVariables.includes(baseVarName)) {\n // Throw error when trying to override system variables\n throw Errors.invalidOperation(`Cannot override system variable: ${baseVarName}`);\n }\n\n // Check if variable already exists (unless redefinition is allowed)\n // Use 'in' operator to check prototype chain (inherited variables)\n // Exclude iteration variables ($this, $index, $total) which can be redefined in nested scopes\n const iterationVariables = ['$this', '$index', '$total'];\n if (!allowRedefinition && context.variables && varKey in context.variables && !iterationVariables.includes(varKey)) {\n // Per FHIRPath spec §1.5.10.3: throw error on variable redefinition\n throw Errors.variableAlreadyDefined(name);\n }\n\n // Create new context and set variable\n const newContext = this.copy(context);\n newContext.variables[varKey] = arrayValue;\n\n // Special handling for $this\n if (varKey === '$this' && Array.isArray(arrayValue) && arrayValue.length === 1) {\n newContext.input = arrayValue;\n newContext.focus = arrayValue;\n }\n\n return newContext;\n }\n\n /**\n * Get a variable from context\n */\n static getVariable(context: RuntimeContext, name: string): any | undefined {\n // Handle special cases\n if (name === '$this' || name === '$index' || name === '$total') {\n return context.variables[name];\n }\n\n // Handle environment variables (with or without % prefix)\n if (name === 'context' || name === '%context') {\n return context.variables['%context'];\n }\n if (name === 'resource' || name === '%resource') {\n return context.variables['%resource'];\n }\n if (name === 'rootResource' || name === '%rootResource') {\n return context.variables['%rootResource'];\n }\n\n // Handle user-defined variables (add % prefix if not present)\n const varKey = name.startsWith('%') ? name : `%${name}`;\n // Use 'in' operator to check prototype chain for inherited variables\n if (varKey in context.variables) {\n return context.variables[varKey];\n }\n return undefined;\n }\n\n /**\n * Bootstrap a runtime context with input, system variables, temporal caches,\n * optional model provider, and user variables. Applies boxing policy for\n * FHIR resources when a model provider is available.\n */\n static async bootstrapContext(\n rawInput: unknown | unknown[],\n options: BootstrapOptions = {}\n ): Promise<{ context: RuntimeContext; input: any[] }> {\n const { modelProvider, variables, now } = options;\n\n // Normalize input to array\n const inputArray = Array.isArray(rawInput)\n ? rawInput\n : rawInput === undefined || rawInput === null\n ? []\n : [rawInput];\n\n // Box input with typeInfo when possible (FHIR resources)\n let boxedInput = inputArray as any[];\n if (modelProvider) {\n boxedInput = await Promise.all(\n inputArray.map(async (item) => {\n if (\n item &&\n typeof item === 'object' &&\n 'resourceType' in (item as any) &&\n typeof (item as any).resourceType === 'string'\n ) {\n const ti = await modelProvider.getType((item as any).resourceType);\n return ti ? box(item, ti) : item;\n }\n return item;\n })\n );\n }\n\n // Create context with BOXED input so system vars keep typeInfo\n let context = RuntimeContextManager.create(boxedInput);\n\n // Set $this to the boxed input (expressions may rely on $this)\n context = RuntimeContextManager.setVariable(context, '$this', boxedInput);\n\n // Pre-cache temporal values (single timestamp for now/today/timeOfDay)\n const ts = now ?? new Date();\n const dateTime = createDateTime(\n ts.getFullYear(),\n ts.getMonth() + 1,\n ts.getDate(),\n ts.getHours(),\n ts.getMinutes(),\n ts.getSeconds(),\n ts.getMilliseconds(),\n -ts.getTimezoneOffset()\n );\n context = RuntimeContextManager.setVariable(\n context,\n '__fhirpath_now_cache__',\n box(dateTime, { type: 'DateTime', singleton: true })\n );\n\n const date = createDate(dateTime.year, dateTime.month, dateTime.day);\n context = RuntimeContextManager.setVariable(\n context,\n '__fhirpath_today_cache__',\n box(date, { type: 'Date', singleton: true })\n );\n\n const time = createTime(\n dateTime.hour!,\n dateTime.minute,\n dateTime.second,\n dateTime.millisecond\n );\n context = RuntimeContextManager.setVariable(\n context,\n '__fhirpath_timeOfDay_cache__',\n box(time, { type: 'Time', singleton: true })\n );\n\n // Attach model provider to context\n if (modelProvider) {\n context.modelProvider = modelProvider;\n }\n\n // Add user variables, boxing FHIR resources when modelProvider present\n if (variables) {\n for (const [key, rawVal] of Object.entries(variables)) {\n const values = Array.isArray(rawVal) ? rawVal : [rawVal];\n const maybeBoxed = modelProvider\n ? await Promise.all(\n values.map(async (v) => {\n if (\n v &&\n typeof v === 'object' &&\n 'resourceType' in (v as any) &&\n typeof (v as any).resourceType === 'string'\n ) {\n const ti = await modelProvider.getType((v as any).resourceType);\n return ti ? box(v, ti) : v;\n }\n return v;\n })\n )\n : values;\n context = RuntimeContextManager.setVariable(context, key, maybeBoxed);\n }\n }\n\n return { context, input: boxedInput };\n }\n}\n","import type { FunctionDefinition, ASTNode } from '../types';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // If no condition provided, return input as-is\n if (args.length === 0) {\n return { value: input, context };\n }\n\n const condition = args[0];\n const results: any[] = [];\n\n // Process each boxed item with modified context\n for (let i = 0; i < input.length; i++) {\n const boxedItem = input[i];\n if (!boxedItem) continue;\n \n const item = unbox(boxedItem);\n \n // Create iterator context with $this and $index\n let tempContext = RuntimeContextManager.withIterator(context, item, i);\n tempContext = RuntimeContextManager.setVariable(tempContext, '$total', input.length);\n\n if (!condition) {\n results.push(boxedItem);\n continue;\n }\n\n // Evaluate condition with temporary context (passing boxed item)\n const condResult = await evaluator(condition, [boxedItem], tempContext);\n \n // Include item if condition is true (unbox the boolean result)\n if (condResult.value.length > 0) {\n const condValue = unbox(condResult.value[0]!);\n if (condValue === true) {\n results.push(boxedItem);\n }\n }\n }\n\n return { value: results, context }; // Original context restored\n};\n\nexport const whereFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'where',\n category: ['logical'],\n description: 'Logical where operator',\n examples: ['a where b'],\n signatures: [{\n\n name: 'where',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'condition', type: { type: 'Boolean', singleton: false }, expression: true },\n ],\n result: 'inputType' as any,\n }],\n evaluate\n};\n","import type { FunctionDefinition, AnalysisContext, InternalAnalysisResult } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Select requires exactly one argument\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('select', 1, args.length);\n }\n\n const expression = args[0];\n if (!expression) {\n throw Errors.invalidOperation('select requires a projection expression');\n }\n \n const results: any[] = [];\n\n // Process each boxed item with modified context\n for (let i = 0; i < input.length; i++) {\n const boxedItem = input[i];\n if (!boxedItem) continue;\n \n const item = unbox(boxedItem);\n \n // Create iterator context with $this and $index\n let tempContext = RuntimeContextManager.withIterator(context, item, i);\n tempContext = RuntimeContextManager.setVariable(tempContext, '$total', input.length);\n\n // Evaluate expression with temporary context (passing boxed item)\n const exprResult = await evaluator(expression, [boxedItem], tempContext);\n // Results are already boxed\n results.push(...exprResult.value);\n }\n\n return { value: results, context }; // Original context restored\n};\n\nexport const selectFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'select',\n category: ['collection'],\n description: 'Evaluates the projection expression for each item in the input collection. The result of each evaluation is added to the output collection. If the evaluation results in a collection with multiple items, all items are added to the output collection (collections resulting from evaluation of projection are flattened). This means that if the evaluation for an element results in the empty collection ({ }), no element is added to the result, and that if the input collection is empty ({ }), the result is empty as well.',\n examples: [\n 'Bundle.entry.select(resource as Patient)',\n 'Bundle.entry.select((resource as Patient).telecom.where(system = \\'phone\\'))',\n 'Patient.name.where(use = \\'usual\\').select(given.first() + \\' \\' + family)'\n ],\n signatures: [{\n\n name: 'select',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'projection', type: { type: 'Any', singleton: false }, expression: true },\n ],\n result: 'parameterType' as any,\n }],\n evaluate,\n \n /**\n * Analysis-time behavior for select.\n * The projection expression needs to be analyzed with system variables in scope.\n */\n async analyze(context: AnalysisContext, args): Promise<InternalAnalysisResult> {\n const diagnostics: any[] = [];\n \n if (args.length !== 1) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: [{\n message: 'select expects exactly 1 argument',\n severity: 'error' as any,\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n }]\n };\n }\n \n // For select, we need to analyze the projection expression with:\n // 1. $this set to each element type\n // 2. $index available as Integer\n // 3. User variables from the outer context preserved\n \n // Get element type from input\n const elementType = context.inputType.singleton \n ? context.inputType \n : { ...context.inputType, singleton: true };\n \n // Create context for analyzing the projection\n // Add system variables but preserve user variables\n // IMPORTANT: Also update input type to the element type for property navigation\n const projectionContext = context\n .withInputType(elementType)\n .withSystemVariable('$this', elementType)\n .withSystemVariable('$index', { type: 'Integer', singleton: true })\n .withSystemVariable('$total', { type: 'Integer', singleton: true });\n \n // Analyze the projection expression\n const projectionArg = args[0];\n if (!projectionArg) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics,\n context\n };\n }\n const projectionResult = await projectionContext.analyzeNode(projectionArg);\n diagnostics.push(...projectionResult.diagnostics);\n \n // Result type is the type returned by the projection (as a collection)\n const resultType = projectionResult.type.singleton\n ? { ...projectionResult.type, singleton: false }\n : projectionResult.type;\n \n return {\n type: resultType,\n diagnostics,\n context // Return original context - select doesn't modify outer scope\n };\n }\n};\n","import type { FunctionDefinition, AnalysisContext, InternalAnalysisResult } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox, box } from '../interpreter/boxing';\nimport { collectionsEqual } from './comparison';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Repeat requires exactly one argument\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('repeat', 1, args.length);\n }\n\n const expression = args[0];\n if (!expression) {\n throw Errors.invalidOperation('repeat requires a projection expression');\n }\n \n // Result collection that will accumulate all unique items\n const result: any[] = [];\n \n // Track which items we've already seen to detect duplicates\n const seen = new Set<any>();\n \n // Helper to check if an item is already in the result\n const isInResult = (item: any): boolean => {\n for (const existing of result) {\n // Use equals comparison to determine if items are the same\n const equalResult = collectionsEqual([existing], [item]);\n if (equalResult === true) {\n return true;\n }\n }\n return false;\n };\n \n // Initial evaluation on input collection\n const initialResults: any[] = [];\n for (let i = 0; i < input.length; i++) {\n const boxedItem = input[i];\n if (!boxedItem) continue;\n \n const item = unbox(boxedItem);\n \n // Create iterator context with $this and $index\n let tempContext = RuntimeContextManager.withIterator(context, item, i);\n tempContext = RuntimeContextManager.setVariable(tempContext, '$total', input.length);\n \n // Evaluate expression with temporary context\n const exprResult = await evaluator(expression, [boxedItem], tempContext);\n \n // Add results from initial evaluation\n for (const newItem of exprResult.value) {\n if (newItem && !isInResult(newItem)) {\n result.push(newItem);\n initialResults.push(newItem);\n }\n }\n }\n \n // Now process the queue with items from the initial results\n let queue = [...initialResults];\n \n // Process items until queue is empty\n while (queue.length > 0) {\n const nextQueue: any[] = [];\n \n for (let i = 0; i < queue.length; i++) {\n const boxedItem = queue[i];\n if (!boxedItem) continue;\n \n const item = unbox(boxedItem);\n \n // Create iterator context with $this and $index\n let tempContext = RuntimeContextManager.withIterator(context, item, i);\n tempContext = RuntimeContextManager.setVariable(tempContext, '$total', queue.length);\n \n // Evaluate expression with temporary context\n const exprResult = await evaluator(expression, [boxedItem], tempContext);\n \n // Add new items to the result and next queue\n for (const newItem of exprResult.value) {\n if (newItem && !isInResult(newItem)) {\n result.push(newItem);\n nextQueue.push(newItem);\n }\n }\n }\n \n // Move to next iteration\n queue = nextQueue;\n }\n \n return { value: result, context };\n};\n\nexport const repeatFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'repeat',\n category: ['collection'],\n description: 'A version of select that will repeat the projection and add items to the output collection only if they are not already in the output collection as determined by the equals (=) operator. Can be used to traverse a tree by repeatedly selecting specific children.',\n examples: [\n 'ValueSet.expansion.repeat(contains)',\n 'Questionnaire.repeat(item)',\n 'Bundle.entry.repeat(resource.link)'\n ],\n signatures: [{\n name: 'repeat',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'projection', type: { type: 'Any', singleton: false }, expression: true },\n ],\n result: 'parameterType' as any,\n }],\n evaluate,\n \n /**\n * Analysis-time behavior for repeat.\n * Similar to select, but with repeated application.\n */\n async analyze(context: AnalysisContext, args): Promise<InternalAnalysisResult> {\n const diagnostics: any[] = [];\n \n if (args.length !== 1) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: [{\n message: 'repeat expects exactly 1 argument',\n severity: 'error' as any,\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n }]\n };\n }\n \n // Get element type from input\n const elementType = context.inputType.singleton \n ? context.inputType \n : { ...context.inputType, singleton: true };\n \n // Create context for analyzing the projection\n const projectionContext = context\n .withInputType(elementType)\n .withSystemVariable('$this', elementType)\n .withSystemVariable('$index', { type: 'Integer', singleton: true })\n .withSystemVariable('$total', { type: 'Integer', singleton: true });\n \n // Analyze the projection expression\n const projectionArg = args[0];\n if (!projectionArg) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics,\n context\n };\n }\n const projectionResult = await projectionContext.analyzeNode(projectionArg);\n diagnostics.push(...projectionResult.diagnostics);\n \n // Result type is the type returned by the projection (as a collection)\n const resultType = projectionResult.type.singleton\n ? { ...projectionResult.type, singleton: false }\n : projectionResult.type;\n \n return {\n type: resultType,\n diagnostics,\n context\n };\n }\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (input.length > 0) {\n const firstItem = input[0];\n // TypeScript knows firstItem is defined here\n return { value: [firstItem!], context };\n }\n return { value: [], context };\n};\n\nexport const firstFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'first',\n category: ['collection'],\n description: 'Returns the first item in the collection',\n examples: ['Patient.name.first()'],\n signatures: [{\n\n name: 'first',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: 'inputTypeSingleton' as any,\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (input.length > 0) {\n const lastItem = input[input.length - 1];\n // TypeScript knows lastItem is defined here\n return { value: [lastItem!], context };\n }\n return { value: [], context };\n};\n\nexport const lastFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'last',\n category: ['collection'],\n description: 'Returns the last item in the collection',\n examples: ['Patient.name.last()'],\n signatures: [{\n\n name: 'last',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: true },\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator, TypeInfo } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('children', 0, args.length);\n }\n \n const results: any[] = [];\n const modelProvider = context.modelProvider;\n \n // Process each item in the input collection\n // input is already an array, not an object with value property\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n \n if (item && typeof item === 'object') {\n // Get the parent type info if available\n let parentTypeInfo: TypeInfo | undefined;\n if (modelProvider && boxedItem.typeInfo) {\n parentTypeInfo = boxedItem.typeInfo;\n } else if (modelProvider && 'resourceType' in item && typeof item.resourceType === 'string') {\n // Try to get type info from resourceType (use cached version)\n parentTypeInfo = await modelProvider.getType(item.resourceType);\n }\n \n // Collect all child properties\n for (const propertyName in item) {\n // Skip resourceType as it's not a child element in FHIRPath\n if (propertyName === 'resourceType') {\n continue;\n }\n \n // Skip primitive element properties (those starting with _)\n if (propertyName.startsWith('_')) {\n continue;\n }\n \n const value = item[propertyName];\n \n // Skip null/undefined values\n if (value === null || value === undefined) {\n continue;\n }\n \n // Get type info for this element from model provider\n let elementTypeInfo: TypeInfo | undefined;\n if (modelProvider && parentTypeInfo) {\n elementTypeInfo = await modelProvider.getElementType(parentTypeInfo, propertyName);\n }\n \n // Get primitive element if it exists\n const primitiveElementName = `_${propertyName}`;\n const primitiveElement = (primitiveElementName in item) ? item[primitiveElementName] : undefined;\n \n if (Array.isArray(value)) {\n // Add each array element\n for (let i = 0; i < value.length; i++) {\n const elementValue = value[i];\n if (elementValue !== null && elementValue !== undefined) {\n const elementPrimitive = primitiveElement?.[i];\n // Make the type info singleton since it's a single element\n const singletonTypeInfo = elementTypeInfo ? { ...elementTypeInfo, singleton: true } : undefined;\n results.push(box(elementValue, singletonTypeInfo, elementPrimitive));\n }\n }\n } else {\n // Add single value - ensure it's marked as singleton\n const singletonTypeInfo = elementTypeInfo ? { ...elementTypeInfo, singleton: true } : undefined;\n results.push(box(value, singletonTypeInfo, primitiveElement));\n }\n }\n }\n }\n \n return { value: results, context };\n};\n\nexport const childrenFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'children',\n category: ['navigation'],\n description: 'Returns all immediate child nodes of all items in the input collection',\n examples: [\n 'Patient.children()',\n 'Observation.children().ofType(CodeableConcept)'\n ],\n signatures: [{\n\n name: 'children',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: false }\n }],\n evaluate,\n async inferResultType(analyzer, node, inputType) {\n const modelProvider = (analyzer as any).modelProvider;\n if (inputType && modelProvider && 'getChildrenType' in modelProvider) {\n const childrenType = await modelProvider.getChildrenType(inputType);\n if (childrenType) {\n return childrenType;\n }\n }\n // Fallback to Any collection\n return { type: 'Any', singleton: false };\n }\n};","import type { FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { childrenFunction } from './children-function';\n\n/**\n * descendants() - Returns all descendant nodes of items in the input collection\n * \n * Per FHIRPath spec:\n * - Returns all descendants at any depth\n * - Does NOT include the input nodes themselves\n * - Equivalent to repeat(children())\n * - Ordering is undefined\n * \n * Type analysis returns Any due to combinatorial explosion of possible types.\n * In practice, users filter with ofType() or where() to get specific types.\n */\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('descendants', 0, args.length);\n }\n \n const results: any[] = [];\n const queue: any[] = [...input];\n \n // Breadth-first traversal using queue\n while (queue.length > 0) {\n const current = queue.shift()!;\n \n // Get children through existing children() function\n const childrenResult = await childrenFunction.evaluate(\n [current], \n context, \n [], \n evaluator\n );\n \n // Add all children to results and queue for further processing\n for (const boxedChild of childrenResult.value) {\n results.push(boxedChild);\n queue.push(boxedChild);\n }\n }\n \n return { value: results, context };\n};\n\nexport const descendantsFunction = {\n name: 'descendants',\n category: ['navigation'],\n description: 'Returns all descendant nodes at any depth (not including input nodes)',\n examples: [\n 'Bundle.descendants().ofType(Reference)',\n 'Patient.descendants().ofType(CodeableConcept)',\n 'Questionnaire.descendants().linkId'\n ],\n signatures: [{\n\n name: 'descendants',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw Errors.invalidOperation('skip requires exactly one argument');\n }\n \n const numNode = args[0];\n if (!numNode) {\n throw Errors.invalidOperation('skip requires an argument');\n }\n \n // Evaluate the argument to get the number\n const numResult = await evaluator(numNode, input, context);\n \n if (numResult.value.length === 0) {\n throw Errors.invalidOperation('skip argument cannot be empty');\n }\n \n const boxedSkipValue = numResult.value[0];\n if (!boxedSkipValue) {\n throw Errors.invalidOperation('skip argument must be a single value');\n }\n \n const skipValue = unbox(boxedSkipValue);\n \n if (typeof skipValue !== 'number' || !Number.isInteger(skipValue)) {\n throw Errors.invalidOperation('skip argument must be an integer');\n }\n \n // If num <= 0, return the input collection as is\n if (skipValue <= 0) {\n return { value: input, context };\n }\n \n // Skip the first 'num' items\n return { \n value: input.slice(skipValue), \n context \n };\n};\n\nexport const skipFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'skip',\n category: ['collection'],\n description: 'Returns a collection containing all but the first num items in the input collection',\n examples: [\n '[1,2,3,4,5].skip(2)',\n 'Patient.name.skip(1)'\n ],\n signatures: [{\n\n name: 'skip',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'num', type: { type: 'Integer', singleton: true } }\n ],\n result: { type: 'Any', singleton: false },\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Validate arguments\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('take', 1, args.length);\n }\n\n // If input is empty, return empty collection\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // Evaluate the num argument\n if (!args[0]) {\n throw Errors.argumentRequired('take', 'number argument');\n }\n const numResult = await evaluator(args[0], input, context);\n \n // Validate that num is a singleton integer\n if (numResult.value.length !== 1) {\n throw Errors.invalidOperation('take argument must be a single value');\n }\n \n const boxedNum = numResult.value[0];\n if (!boxedNum) {\n throw Errors.invalidOperation('take argument must be a single value');\n }\n \n const num = unbox(boxedNum);\n \n // Check that num is an integer\n if (!Number.isInteger(num)) {\n throw Errors.invalidOperation('take argument must be an integer');\n }\n \n // If num is less than or equal to 0, return empty collection\n if (num <= 0) {\n return { value: [], context };\n }\n \n // Return the first num items (or all items if num is greater than length)\n const result = input.slice(0, num);\n \n return { value: result, context };\n};\n\nexport const takeFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'take',\n category: ['subsetting'],\n description: 'Returns a collection containing the first num items in the input collection, or less if there are less than num items. If num is less than or equal to 0, or if the input collection is empty, take returns an empty collection.',\n examples: [\n \"Patient.name.take(3)\",\n \"Observation.component.take(1)\"\n ],\n signatures: [{\n\n name: 'take',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'num', type: { type: 'Integer', singleton: true } }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // tail() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('tail', 0, args.length);\n }\n \n // If input has 0 or 1 items, return empty collection\n if (input.length <= 1) {\n return { value: [], context };\n }\n \n // Return all but the first item\n return { \n value: input.slice(1), \n context \n };\n};\n\nexport const tailFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'tail',\n category: ['subsetting'],\n description: 'Returns a collection containing all but the first item in the input collection. Will return an empty collection if the input collection has no items, or only one item.',\n examples: [\n '[1,2,3,4,5].tail()',\n 'Patient.name.tail()'\n ],\n signatures: [{\n\n name: 'tail',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // single takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('single', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If there is exactly one item, return it\n if (input.length === 1) {\n return { value: input[0] ? [input[0]] : [], context };\n }\n\n // If there are multiple items, signal an error\n throw Errors.singletonRequired('single', input.length);\n};\n\nexport const singleFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'single',\n category: ['subsetting'],\n description: 'Returns the single item in the input if there is just one item. If the input collection is empty, the result is empty. If there are multiple items, an error is signaled.',\n examples: [\n \"Patient.name.single()\",\n \"Patient.identifier.single()\"\n ],\n signatures: [{\n\n name: 'single',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n return { \n value: [box(input.length, { type: 'Integer', singleton: true })], \n context \n };\n};\n\nexport const countFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'count',\n doesNotPropagateEmpty: true,\n category: ['collection'],\n description: 'Returns the number of items in the collection',\n examples: ['Patient.name.count()'],\n signatures: [{\n\n name: 'count',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Integer', singleton: true },\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { type FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // No arguments - just check if input is not empty\n if (args.length === 0) {\n return { value: [box(input.length > 0, { type: 'Boolean', singleton: true })], context };\n }\n\n const condition = args[0];\n if (!condition) {\n throw Errors.invalidOperation('exists function requires a condition argument');\n }\n\n // Process each item with modified context\n for (let i = 0; i < input.length; i++) {\n const boxedItem = input[i];\n if (!boxedItem) continue;\n const item = unbox(boxedItem);\n \n // Create iterator context with $this and $index\n let tempContext = RuntimeContextManager.withIterator(context, item, i);\n tempContext = RuntimeContextManager.setVariable(tempContext, '$total', input.length);\n\n // Evaluate condition with temporary context\n const condResult = await evaluator(condition, [boxedItem], tempContext);\n \n // Return true if any item matches\n if (condResult.value.length > 0) {\n const resultValue = unbox(condResult.value[0]!);\n if (resultValue === true) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n }\n }\n\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const existsFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'exists',\n doesNotPropagateEmpty: true,\n category: ['collection', 'logical'],\n description: 'Returns true if the collection has any items, or if any item satisfies the condition',\n examples: ['Patient.name.exists()', 'Patient.name.exists(use = \"official\")'],\n signatures: [{\n\n name: 'exists',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'condition', optional: true, type: { type: 'Boolean', singleton: false } },\n ],\n result: { type: 'Boolean', singleton: true },\n }],\n evaluate\n};\n","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // all() requires exactly one argument (the criteria expression)\n if (!args || args.length !== 1) {\n throw Errors.invalidOperation('all requires exactly one argument');\n }\n\n // If the input collection is empty, the result is true per spec\n if (input.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n const criteriaExpression = args[0];\n if (!criteriaExpression) {\n throw Errors.invalidOperation('all requires a criteria expression');\n }\n\n // Evaluate the criteria for each element in the input collection\n for (let i = 0; i < input.length; i++) {\n const boxedItem = input[i];\n if (!boxedItem) continue;\n \n const item = unbox(boxedItem);\n \n // Create iterator context with $this and $index\n let tempContext = RuntimeContextManager.withIterator(context, item, i);\n tempContext = RuntimeContextManager.setVariable(tempContext, '$total', input.length);\n \n // Evaluate the criteria expression with the current item as context\n const result = await evaluator(criteriaExpression, [boxedItem], tempContext);\n \n // Check if the result is truthy\n // If the result is empty or contains a falsy value, return false\n if (result.value.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const resultValue = unbox(result.value[0]!);\n if (resultValue !== true) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n\n // All criteria evaluations were true\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const allFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'all',\n doesNotPropagateEmpty: true, // Returns true for empty collections\n category: ['existence'],\n description: 'Returns true if for every element in the input collection, criteria evaluates to true. Otherwise, the result is false. If the input collection is empty, the result is true.',\n examples: [\n \"generalPractitioner.all($this.resolve() is Practitioner)\"\n ],\n signatures: [{\n\n name: 'all',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'criteria', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};\n","import type { FunctionDefinition } from \"../types\";\nimport type { FunctionEvaluator } from \"../types\";\nimport { box, unbox } from \"../interpreter/boxing\";\n\nexport const evaluate: FunctionEvaluator = async (\n input,\n context,\n args,\n evaluator,\n) => {\n return {\n value: [box(input.length === 0, { type: \"Boolean\", singleton: true })],\n context,\n };\n};\n\nexport const emptyFunction: FunctionDefinition & {\n evaluate: FunctionEvaluator;\n} = {\n name: \"empty\",\n doesNotPropagateEmpty: true,\n category: [\"collection\", \"logical\"],\n description: \"Returns true if the collection is empty\",\n examples: [\"Patient.name.empty()\"],\n signatures: [\n {\n name: \"empty\",\n input: { type: \"Any\", singleton: false },\n parameters: [],\n result: { type: \"Boolean\", singleton: true },\n },\n ],\n evaluate,\n};\n","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Three-valued logic implementation\n if (input.length === 0) {\n // Empty collection returns empty\n return { value: [], context };\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n if (value === true) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n if (value === false) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Non-boolean values return empty\n return { value: [], context };\n};\n\nexport const notFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'not',\n category: ['logical'],\n description: 'Returns true if the input collection evaluates to false, and false if it evaluates to true. Otherwise, the result is empty',\n examples: [\n 'true.not()',\n '(5 = 5).not()',\n 'Patient.active.not()'\n ],\n signatures: [{\n\n name: 'not',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true },\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Use Set to track unique values based on unboxed values\n const seen = new Set<string>();\n const uniqueBoxedItems: any[] = [];\n \n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n // Use JSON.stringify for deep equality comparison\n const key = JSON.stringify(item);\n if (!seen.has(key)) {\n seen.add(key);\n uniqueBoxedItems.push(boxedItem);\n }\n }\n \n return { \n value: uniqueBoxedItems, \n context \n };\n};\n\nexport const distinctFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'distinct',\n category: ['collection'],\n description: 'Returns a collection containing only unique items',\n examples: ['Patient.name.given.distinct()'],\n signatures: [{\n\n name: 'distinct',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: false },\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // isDistinct takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('isDistinct', 0, args.length);\n }\n\n // If input is empty, return true\n if (input.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // Check if all items are distinct by comparing each pair\n // Using the equals (=) operator logic for comparison\n for (let i = 0; i < input.length; i++) {\n for (let j = i + 1; j < input.length; j++) {\n // Two items are considered equal if they have the same value\n // Compare unboxed values\n const value1 = unbox(input[i]!);\n const value2 = unbox(input[j]!);\n \n // Use JSON.stringify for deep comparison\n if (JSON.stringify(value1) === JSON.stringify(value2)) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n }\n\n // All items are distinct\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const isDistinctFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'isDistinct',\n doesNotPropagateEmpty: true, // Returns true for empty collections\n category: ['existence'],\n description: 'Returns true if all the items in the input collection are distinct. To determine whether two items are distinct, the equals (=) operator is used. If the input collection is empty, the result is true.',\n examples: [\n \"(1 | 2 | 3).isDistinct()\",\n \"(1 | 2 | 2 | 3).isDistinct()\",\n \"Patient.name.given.isDistinct()\"\n ],\n signatures: [{\n\n name: 'isDistinct',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, AnalysisContext, InternalAnalysisResult } from '../types';\nimport { Errors, ErrorCodes } from '../errors';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { NodeType } from '../parser';\nimport { DiagnosticSeverity } from '../types';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length < 2) {\n throw Errors.invalidOperation('iif requires at least 2 arguments');\n }\n \n if (args.length > 3) {\n throw Errors.invalidOperation('iif takes at most 3 arguments');\n }\n\n // Check for multiple items in input collection\n if (input.length > 1) {\n throw Errors.emptyNotAllowed('iif');\n }\n\n // Always evaluate condition\n const condExpr = args[0];\n const thenExpr = args[1];\n const elseExpr = args[2]; // Optional\n \n if (!condExpr || !thenExpr) {\n throw Errors.invalidOperation('iif requires condition and true-result arguments');\n }\n \n // When evaluating expressions within iif, ensure $this refers to the input\n // We need to preserve context variables but set $this to the iif input\n // Use RuntimeContextManager to properly handle prototype chain\n let evalContext = RuntimeContextManager.copy(context);\n evalContext = RuntimeContextManager.setVariable(evalContext, '$this', input.map(v => unbox(v)), true);\n \n const condResult = await evaluator(condExpr, input, evalContext);\n \n // Empty condition is treated as false\n if (condResult.value.length === 0) {\n // If no else expression provided, return empty\n if (!elseExpr) {\n return { value: [], context };\n }\n // Otherwise evaluate the else branch\n return await evaluator(elseExpr, input, context);\n }\n\n const boxedCondition = condResult.value[0];\n if (!boxedCondition) {\n return { value: [], context };\n }\n \n const condition = unbox(boxedCondition);\n \n // Check if condition is a boolean\n if (typeof condition !== 'boolean') {\n // Non-boolean criteria returns empty\n return { value: [], context };\n }\n \n // Evaluate only the needed branch\n if (condition === true) {\n return await evaluator(thenExpr, input, evalContext);\n } else {\n // If no else expression provided, return empty\n if (!elseExpr) {\n return { value: [], context };\n }\n return await evaluator(elseExpr, input, evalContext);\n }\n};\n\nexport const iifFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'iif',\n doesNotPropagateEmpty: true, // iif evaluates even with empty input\n category: ['control'],\n description: 'If-then-else expression (immediate if)',\n examples: ['iif(gender = \"male\", \"Mr.\", \"Ms.\")'],\n signatures: [{\n\n name: 'iif',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'condition', expression: true, type: { type: 'Boolean', singleton: true } },\n { name: 'trueResult', expression: true, type: { type: 'Any', singleton: false } },\n { name: 'falseResult', expression: true, type: { type: 'Any', singleton: false }, optional: true },\n ],\n result: { type: 'Any', singleton: false },\n }],\n evaluate,\n \n /**\n * Analysis-time behavior for iif with lazy evaluation.\n * Only analyzes reachable branches when condition is a literal.\n */\n async analyze(context: AnalysisContext, args): Promise<InternalAnalysisResult> {\n const diagnostics: any[] = [];\n \n // Validate argument count\n if (args.length < 2) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: [{\n message: 'iif requires at least 2 arguments',\n severity: DiagnosticSeverity.Error,\n code: ErrorCodes.WRONG_ARGUMENT_COUNT,\n source: 'fhirpath',\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n }]\n };\n }\n \n if (args.length > 3) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: [{\n message: 'iif takes at most 3 arguments',\n severity: DiagnosticSeverity.Error,\n code: ErrorCodes.WRONG_ARGUMENT_COUNT,\n source: 'fhirpath',\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n }]\n };\n }\n \n // Analyze condition\n const conditionArg = args[0];\n if (!conditionArg) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: [{\n message: 'iif requires a condition argument',\n severity: DiagnosticSeverity.Error,\n code: ErrorCodes.WRONG_ARGUMENT_COUNT,\n source: 'fhirpath',\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n }]\n };\n }\n const condResult = await context.analyzeNode(conditionArg);\n diagnostics.push(...condResult.diagnostics);\n \n // Check if condition is a literal boolean\n let isLiteralTrue = false;\n let isLiteralFalse = false;\n \n if (conditionArg.type === NodeType.Literal) {\n const literalValue = (conditionArg as any).value;\n if (literalValue === true) {\n isLiteralTrue = true;\n } else if (literalValue === false) {\n isLiteralFalse = true;\n }\n }\n \n let trueBranchType = { type: 'Any', singleton: false } as any;\n let falseBranchType = { type: 'Any', singleton: false } as any;\n \n // Lazy evaluation: only analyze reachable branches\n if (isLiteralTrue) {\n // Only true branch is reachable\n const trueBranch = args[1];\n if (!trueBranch) {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics\n };\n }\n const trueBranchResult = await context.analyzeNode(trueBranch);\n diagnostics.push(...trueBranchResult.diagnostics);\n trueBranchType = trueBranchResult.type;\n \n // Warn about unreachable false branch\n if (args.length === 3 && args[2]) {\n diagnostics.push({\n message: 'Unreachable code: false branch will never execute',\n severity: DiagnosticSeverity.Warning,\n code: ErrorCodes.UNREACHABLE_CODE,\n source: 'fhirpath',\n range: args[2].range || { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n });\n }\n \n return { type: trueBranchType, diagnostics };\n } else if (isLiteralFalse) {\n // Only false branch is reachable (if it exists)\n // Warn about unreachable true branch\n const trueBranch = args[1];\n if (trueBranch) {\n diagnostics.push({\n message: 'Unreachable code: true branch will never execute',\n severity: DiagnosticSeverity.Warning,\n code: ErrorCodes.UNREACHABLE_CODE,\n source: 'fhirpath',\n range: trueBranch.range || { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n });\n }\n \n if (args.length === 3 && args[2]) {\n const falseBranchResult = await context.analyzeNode(args[2]);\n diagnostics.push(...falseBranchResult.diagnostics);\n falseBranchType = falseBranchResult.type;\n return { type: falseBranchType, diagnostics };\n } else {\n // No else branch, return empty\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n } else {\n // Dynamic condition: analyze both branches\n const trueBranch = args[1];\n if (trueBranch) {\n const trueBranchResult = await context.analyzeNode(trueBranch);\n diagnostics.push(...trueBranchResult.diagnostics);\n trueBranchType = trueBranchResult.type;\n }\n \n if (args.length === 3 && args[2]) {\n const falseBranchResult = await context.analyzeNode(args[2]);\n diagnostics.push(...falseBranchResult.diagnostics);\n falseBranchType = falseBranchResult.type;\n \n // Result type is the union of both branches\n // For now, if they differ, return Any\n if (trueBranchType.type === falseBranchType.type && \n trueBranchType.singleton === falseBranchType.singleton) {\n return { type: trueBranchType, diagnostics };\n } else if (trueBranchType.type === falseBranchType.type) {\n // Same type but different singleton - result is collection\n return { type: { type: trueBranchType.type, singleton: false }, diagnostics };\n }\n }\n \n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n },\n \n async inferResultType(analyzer, node, inputType) {\n // iif returns the common type of the true and false branches\n if (node.arguments.length >= 2) {\n const trueBranchType = await (analyzer as any).inferType(node.arguments[1]!, inputType);\n if (node.arguments.length >= 3) {\n const falseBranchType = await (analyzer as any).inferType(node.arguments[2]!, inputType);\n // If both branches have the same type, use that\n if (trueBranchType.type === falseBranchType.type && \n trueBranchType.singleton === falseBranchType.singleton) {\n return trueBranchType;\n }\n // If types are the same but singleton differs, return as collection\n if (trueBranchType.type === falseBranchType.type) {\n // One is singleton, one is collection - result must be collection\n return { type: trueBranchType.type, singleton: false };\n }\n // Otherwise, check if one is a subtype of the other\n if ((analyzer as any).isTypeCompatible(trueBranchType, falseBranchType)) {\n return falseBranchType;\n }\n if ((analyzer as any).isTypeCompatible(falseBranchType, trueBranchType)) {\n return trueBranchType;\n }\n } else {\n // Only true branch, result can be that type or empty\n return { ...trueBranchType, singleton: false };\n }\n }\n return { type: 'Any', singleton: false };\n }\n};\n","import type { FunctionDefinition, LiteralNode, AnalysisContext, InternalAnalysisResult } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { type FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { DiagnosticSeverity } from '../types';\nimport { toDiagnostic } from '../errors';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length < 1) {\n throw Errors.invalidOperation('defineVariable requires at least 1 argument');\n }\n\n let varName: string;\n \n // Check if first argument is a literal\n const nameArg = args[0];\n if (nameArg && nameArg.type === 'Literal' && (nameArg as LiteralNode).valueType === 'string') {\n // Fast path: literal string\n varName = (nameArg as LiteralNode).value as string;\n } else {\n // Slow path: evaluate expression to get name\n const nameResult = await evaluator(nameArg!, input, context);\n if (nameResult.value.length === 0) {\n throw Errors.invalidOperation('Variable name expression evaluated to empty');\n }\n const firstValue = nameResult.value[0];\n if (!firstValue) {\n throw Errors.invalidOperation('Variable name expression evaluated to empty');\n }\n const nameValue = unbox(firstValue);\n if (typeof nameValue !== 'string') {\n throw Errors.invalidOperation('Variable name must evaluate to a string');\n }\n varName = nameValue;\n }\n \n let value: any[];\n \n if (args.length === 1) {\n // Single argument: defineVariable(name) - use input as value\n value = input;\n } else {\n // Two arguments: defineVariable(name, value) - evaluate value expression\n // $this should be set to the input collection (unboxed to avoid double-boxing)\n const unboxedInput = input.map(v => unbox(v));\n const tempContext = RuntimeContextManager.setVariable(context, '$this', unboxedInput, true);\n const valueExpr = args[1];\n if (!valueExpr) {\n throw Errors.invalidOperation('defineVariable requires a value expression');\n }\n \n const valueResult = await evaluator(valueExpr, input, tempContext);\n value = valueResult.value;\n }\n\n // Set the variable using RuntimeContextManager (handles prefixes and checks)\n // This will throw an error if the variable is already defined (per spec)\n const newContext = RuntimeContextManager.setVariable(context, varName, value);\n\n \n // Pass through input unchanged\n return { value: input, context: newContext };\n};\n\nexport const defineVariableFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'defineVariable',\n doesNotPropagateEmpty: true, // defineVariable should always execute to set the variable\n category: ['context'],\n description: 'Defines a variable in the evaluation context',\n examples: [\n 'Patient.defineVariable(\"patientName\", name.first())',\n 'Patient.name.defineVariable(\"names\")'\n ],\n signatures: [{\n\n name: 'defineVariable',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'name', type: { type: 'String', singleton: true } },\n { name: 'value', type: { type: 'Any', singleton: false }, optional: true, expression: true },\n ],\n result: { type: 'Any', singleton: false },\n }],\n evaluate,\n async inferResultType(analyzer, node, inputType) {\n // defineVariable returns its input type unchanged\n return inputType || { type: 'Any', singleton: false };\n },\n /**\n * Analysis-time behavior for defineVariable.\n * Adds the variable to the context for downstream expressions.\n */\n async analyze(context: AnalysisContext, args): Promise<InternalAnalysisResult> {\n const diagnostics: any[] = [];\n \n // Validate we have at least one argument\n if (args.length < 1) {\n return { \n type: context.inputType, \n diagnostics: [{\n range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },\n message: 'defineVariable requires at least 1 argument',\n severity: DiagnosticSeverity.Error\n }]\n };\n }\n \n // First argument: variable name (can be literal or expression)\n const nameNode = args[0];\n let varName: string | undefined;\n let isDynamic = false;\n \n if (nameNode && nameNode.type === 'Literal' && (nameNode as LiteralNode).valueType === 'string') {\n // Static variable name - full analysis\n varName = (nameNode as LiteralNode).value as string;\n \n // Check if variable already exists\n if (context.userVariables.has(varName)) {\n // Flag as warning in analysis; runtime enforces error with proper code (FP6009)\n diagnostics.push({\n range: nameNode.range,\n message: `Variable '${varName}' is already defined`,\n severity: DiagnosticSeverity.Warning\n });\n return { type: context.inputType, diagnostics, context };\n }\n } else {\n // Dynamic variable name - limited analysis\n isDynamic = true;\n diagnostics.push({\n range: nameNode?.range || { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },\n message: 'Dynamic variable name: cannot validate variable references at compile time',\n severity: DiagnosticSeverity.Warning\n });\n \n // Still analyze the expression for other errors\n if (nameNode) {\n const nameResult = await context.analyzeNode(nameNode);\n diagnostics.push(...nameResult.diagnostics);\n \n // Check if it evaluates to string type\n if (nameResult.type.type !== 'String') {\n diagnostics.push({\n range: nameNode.range,\n message: 'Variable name expression must evaluate to String type',\n severity: DiagnosticSeverity.Error\n });\n }\n }\n }\n \n // Determine the type of the variable\n let varType = context.inputType;\n \n if (args.length >= 2 && args[1]) {\n // If value expression provided, analyze it to get its type\n const valueResult = await context.analyzeNode(args[1]);\n diagnostics.push(...valueResult.diagnostics);\n varType = valueResult.type;\n }\n \n // Return with modified context\n // For static names, add the variable to context\n // For dynamic names, mark that dynamic variables exist\n let resultContext = context;\n if (varName) {\n resultContext = context.withUserVariable(varName, varType);\n } else if (isDynamic) {\n resultContext = context.withDynamicVariables();\n }\n \n return {\n type: context.inputType, // defineVariable returns input unchanged\n diagnostics,\n context: resultContext\n };\n }\n};\n","// Built-in temporal functions for FHIRPath\nimport type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box } from '../interpreter/boxing';\nimport { createDate, createDateTime, createTime, isFHIRDate, isFHIRDateTime, isFHIRTime } from '../complex-types/temporal';\n\n// ============================================================================\n// now() function - Returns current DateTime\n// ============================================================================\n\nexport const nowEvaluator: FunctionEvaluator = async (input, context, args) => {\n // Always use cached value if available (set at expression evaluation start)\n const CACHE_KEY = '__fhirpath_now_cache__';\n \n if (context.variables[CACHE_KEY]) {\n return {\n value: [context.variables[CACHE_KEY]],\n context\n };\n }\n \n // Fallback: create new value if not cached (shouldn't happen in normal evaluation)\n const now = new Date();\n const dateTime = createDateTime(\n now.getFullYear(),\n now.getMonth() + 1,\n now.getDate(),\n now.getHours(),\n now.getMinutes(),\n now.getSeconds(),\n now.getMilliseconds(),\n -now.getTimezoneOffset() // Convert to minutes from UTC (JS gives minutes to subtract from UTC)\n );\n \n return {\n value: [box(dateTime, { type: 'DateTime', singleton: true })],\n context\n };\n};\n\nexport const nowFunction: FunctionDefinition & { evaluate: typeof nowEvaluator } = {\n name: 'now',\n category: ['temporal'],\n description: 'Returns the current date and time as a DateTime value',\n examples: ['now()', 'Patient.birthDate < now()'],\n signatures: [\n {\n name: 'now',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'DateTime', singleton: true }\n }\n ],\n evaluate: nowEvaluator\n};\n\n// ============================================================================\n// today() function - Returns current Date\n// ============================================================================\n\nexport const todayEvaluator: FunctionEvaluator = async (input, context, args) => {\n // Always use cached value if available (set at expression evaluation start)\n const CACHE_KEY = '__fhirpath_today_cache__';\n \n if (context.variables[CACHE_KEY]) {\n return {\n value: [context.variables[CACHE_KEY]],\n context\n };\n }\n \n // Fallback: create new value if not cached (shouldn't happen in normal evaluation)\n const today = new Date();\n const date = createDate(\n today.getFullYear(),\n today.getMonth() + 1,\n today.getDate()\n );\n \n return {\n value: [box(date, { type: 'Date', singleton: true })],\n context\n };\n};\n\nexport const todayFunction: FunctionDefinition & { evaluate: typeof todayEvaluator } = {\n name: 'today',\n category: ['temporal'],\n description: 'Returns the current date (no time component)',\n examples: ['today()', 'Patient.birthDate < today()'],\n signatures: [\n {\n name: 'today',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Date', singleton: true }\n }\n ],\n evaluate: todayEvaluator\n};\n\n// ============================================================================\n// timeOfDay() function - Returns current Time\n// ============================================================================\n\nexport const timeOfDayEvaluator: FunctionEvaluator = async (input, context, args) => {\n // Always use cached value if available (set at expression evaluation start)\n const CACHE_KEY = '__fhirpath_timeOfDay_cache__';\n \n if (context.variables[CACHE_KEY]) {\n return {\n value: [context.variables[CACHE_KEY]],\n context\n };\n }\n \n // Fallback: create new value if not cached (shouldn't happen in normal evaluation)\n const now = new Date();\n const time = createTime(\n now.getHours(),\n now.getMinutes(),\n now.getSeconds(),\n now.getMilliseconds()\n );\n \n return {\n value: [box(time, { type: 'Time', singleton: true })],\n context\n };\n};\n\nexport const timeOfDayFunction: FunctionDefinition & { evaluate: typeof timeOfDayEvaluator } = {\n name: 'timeOfDay',\n category: ['temporal'],\n description: 'Returns the current time of day',\n examples: ['timeOfDay()', '@T09:00 < timeOfDay()'],\n signatures: [\n {\n name: 'timeOfDay',\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Time', singleton: true }\n }\n ],\n evaluate: timeOfDayEvaluator\n};\n\n// ============================================================================\n// toDate() function - Convert to Date\n// ============================================================================\n\nexport const toDateEvaluator: FunctionEvaluator = async (input, context, args) => {\n if (input.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = input[0];\n if (!boxedItem) {\n return { value: [], context };\n }\n \n const item = boxedItem.value;\n const typeInfo = boxedItem.typeInfo;\n \n // If it's already a Date, return as is\n if (typeInfo?.type === 'Date') {\n return { value: [boxedItem], context };\n }\n \n // If it's a DateTime, extract the date portion\n if (typeInfo?.type === 'DateTime' && item && typeof item === 'object') {\n const dateTime = item as any;\n const date = createDate(dateTime.year, dateTime.month, dateTime.day);\n return {\n value: [box(date, { type: 'Date', singleton: true })],\n context\n };\n }\n \n // If it's a String, try to parse it\n if (typeof item === 'string') {\n try {\n const { parseTemporalLiteral, isFHIRDate } = await import('../complex-types/temporal');\n const temporal = parseTemporalLiteral('@' + item);\n if (isFHIRDate(temporal)) {\n return {\n value: [box(temporal, { type: 'Date', singleton: true })],\n context\n };\n }\n } catch {\n // Parsing failed, return empty\n }\n }\n \n // For any other type (including Boolean), return empty\n // This allows expressions like ({}).empty().toDate() to return []\n return { value: [], context };\n};\n\nexport const toDateFunction: FunctionDefinition & { evaluate: typeof toDateEvaluator } = {\n name: 'toDate',\n category: ['conversion', 'temporal'],\n description: 'Converts the input to a Date value',\n examples: [\"'2020-01-15'.toDate()\", '@2020-01-15T10:30:00.toDate()'],\n signatures: [\n {\n name: 'any-toDate',\n parameters: [],\n input: { type: 'Any', singleton: true },\n result: { type: 'Date', singleton: true }\n }\n ],\n evaluate: toDateEvaluator\n};\n\n// ============================================================================\n// toDateTime() function - Convert to DateTime\n// ============================================================================\n\nexport const toDateTimeEvaluator: FunctionEvaluator = async (input, context, args) => {\n if (input.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = input[0];\n if (!boxedItem) {\n return { value: [], context };\n }\n \n const item = boxedItem.value;\n const typeInfo = boxedItem.typeInfo;\n \n // If it's already a DateTime, return as is\n if (typeInfo?.type === 'DateTime') {\n return { value: [boxedItem], context };\n }\n \n // If it's a Date, convert to DateTime with time as 00:00:00\n if (typeInfo?.type === 'Date' && item && typeof item === 'object') {\n const date = item as any;\n const dateTime = createDateTime(\n date.year,\n date.month,\n date.day,\n 0, 0, 0, 0\n );\n return {\n value: [box(dateTime, { type: 'DateTime', singleton: true })],\n context\n };\n }\n \n // If it's a String, try to parse it\n if (typeof item === 'string') {\n try {\n const { parseTemporalLiteral, isFHIRDate, isFHIRDateTime } = await import('../complex-types/temporal');\n const temporal = parseTemporalLiteral('@' + item);\n if (isFHIRDateTime(temporal)) {\n return {\n value: [box(temporal, { type: 'DateTime', singleton: true })],\n context\n };\n } else if (isFHIRDate(temporal)) {\n // Convert Date to DateTime (with time as 00:00:00)\n const dateTime = createDateTime(\n temporal.year,\n temporal.month,\n temporal.day,\n 0, 0, 0, 0\n );\n return {\n value: [box(dateTime, { type: 'DateTime', singleton: true })],\n context\n };\n }\n } catch {\n // Parsing failed, return empty\n }\n }\n \n // For any other type (including Boolean), return empty\n // This allows expressions like ({}).empty().toDateTime() to return []\n return { value: [], context };\n};\n\nexport const toDateTimeFunction: FunctionDefinition & { evaluate: typeof toDateTimeEvaluator } = {\n name: 'toDateTime',\n category: ['conversion', 'temporal'],\n description: 'Converts the input to a DateTime value',\n examples: [\"'2020-01-15T10:30:00Z'.toDateTime()\", '@2020-01-15.toDateTime()'],\n signatures: [\n {\n name: 'any-toDateTime',\n parameters: [],\n input: { type: 'Any', singleton: true },\n result: { type: 'DateTime', singleton: true }\n }\n ],\n evaluate: toDateTimeEvaluator\n};\n\n// ============================================================================\n// toTime() function - Convert to Time\n// ============================================================================\n\nexport const toTimeEvaluator: FunctionEvaluator = async (input, context, args) => {\n if (input.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = input[0];\n if (!boxedItem) {\n return { value: [], context };\n }\n \n const item = boxedItem.value;\n const typeInfo = boxedItem.typeInfo;\n \n // If it's already a Time, return as is\n if (typeInfo?.type === 'Time') {\n return { value: [boxedItem], context };\n }\n \n // If it's a DateTime, extract the time portion\n if (typeInfo?.type === 'DateTime' && item && typeof item === 'object') {\n const dateTime = item as any;\n if (dateTime.hour !== undefined) {\n const time = createTime(dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond);\n return {\n value: [box(time, { type: 'Time', singleton: true })],\n context\n };\n }\n }\n \n // If it's a String, try to parse it\n if (typeof item === 'string') {\n try {\n const { parseTemporalLiteral, isFHIRTime } = await import('../complex-types/temporal');\n // For time strings, prepend T if not present\n const timeString = item.startsWith('T') ? '@' + item : '@T' + item;\n const temporal = parseTemporalLiteral(timeString);\n if (isFHIRTime(temporal)) {\n return {\n value: [box(temporal, { type: 'Time', singleton: true })],\n context\n };\n }\n } catch {\n // Parsing failed, return empty\n }\n }\n \n // For any other type (including Boolean), return empty\n // This allows expressions like ({}).empty().toTime() to return []\n return { value: [], context };\n};\n\nexport const toTimeFunction: FunctionDefinition & { evaluate: typeof toTimeEvaluator } = {\n name: 'toTime',\n category: ['conversion', 'temporal'],\n description: 'Converts the input to a Time value',\n examples: [\"'14:30:00'.toTime()\", '@2020-01-15T10:30:00.toTime()'],\n signatures: [\n {\n name: 'any-toTime',\n parameters: [],\n input: { type: 'Any', singleton: true },\n result: { type: 'Time', singleton: true }\n }\n ],\n evaluate: toTimeEvaluator\n};\n\n// ============================================================================\n// convertsToDate() function - Check if convertible to Date\n// ============================================================================\n\nexport const convertsToDateEvaluator: FunctionEvaluator = async (input, context, args) => {\n if (input.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = input[0];\n if (!boxedItem) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const item = boxedItem.value;\n const typeInfo = boxedItem.typeInfo;\n \n // Already a Date\n if (typeInfo?.type === 'Date') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // DateTime can be converted\n if (typeInfo?.type === 'DateTime') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Try to parse string\n if (typeof item === 'string') {\n try {\n const { parseTemporalLiteral, isFHIRDate } = await import('../complex-types/temporal');\n const temporal = parseTemporalLiteral('@' + item);\n return {\n value: [box(isFHIRDate(temporal), { type: 'Boolean', singleton: true })],\n context\n };\n } catch {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToDateFunction: FunctionDefinition & { evaluate: typeof convertsToDateEvaluator } = {\n name: 'convertsToDate',\n category: ['conversion', 'temporal'],\n description: 'Returns true if the input can be converted to a Date',\n examples: [\"'2020-01-15'.convertsToDate()\", \"'invalid'.convertsToDate()\"],\n signatures: [\n {\n name: 'convertsToDate',\n parameters: [],\n input: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate: convertsToDateEvaluator\n};\n\n// ============================================================================\n// convertsToDateTime() function - Check if convertible to DateTime\n// ============================================================================\n\nexport const convertsToDateTimeEvaluator: FunctionEvaluator = async (input, context, args) => {\n if (input.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = input[0];\n if (!boxedItem) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const item = boxedItem.value;\n const typeInfo = boxedItem.typeInfo;\n \n // Already a DateTime\n if (typeInfo?.type === 'DateTime') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Date can be converted\n if (typeInfo?.type === 'Date') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Try to parse string\n if (typeof item === 'string') {\n try {\n const { parseTemporalLiteral, isFHIRDate, isFHIRDateTime } = await import('../complex-types/temporal');\n const temporal = parseTemporalLiteral('@' + item);\n return {\n value: [box(isFHIRDateTime(temporal) || isFHIRDate(temporal), { type: 'Boolean', singleton: true })],\n context\n };\n } catch {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToDateTimeFunction: FunctionDefinition & { evaluate: typeof convertsToDateTimeEvaluator } = {\n name: 'convertsToDateTime',\n category: ['conversion', 'temporal'],\n description: 'Returns true if the input can be converted to a DateTime',\n examples: [\"'2020-01-15T10:30:00'.convertsToDateTime()\", \"'invalid'.convertsToDateTime()\"],\n signatures: [\n {\n name: 'convertsToDateTime',\n parameters: [],\n input: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate: convertsToDateTimeEvaluator\n};\n\n// ============================================================================\n// convertsToTime() function - Check if convertible to Time\n// ============================================================================\n\nexport const convertsToTimeEvaluator: FunctionEvaluator = async (input, context, args) => {\n if (input.length === 0) {\n return { value: [], context };\n }\n \n const boxedItem = input[0];\n if (!boxedItem) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const item = boxedItem.value;\n const typeInfo = boxedItem.typeInfo;\n \n // Already a Time\n if (typeInfo?.type === 'Time') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // DateTime can be converted if it has time components\n if (typeInfo?.type === 'DateTime') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Try to parse string\n if (typeof item === 'string') {\n try {\n const { parseTemporalLiteral, isFHIRTime } = await import('../complex-types/temporal');\n const timeString = item.startsWith('T') ? '@' + item : '@T' + item;\n const temporal = parseTemporalLiteral(timeString);\n return {\n value: [box(isFHIRTime(temporal), { type: 'Boolean', singleton: true })],\n context\n };\n } catch {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToTimeFunction: FunctionDefinition & { evaluate: typeof convertsToTimeEvaluator } = {\n name: 'convertsToTime',\n category: ['conversion', 'temporal'],\n description: 'Returns true if the input can be converted to a Time',\n examples: [\"'14:30:00'.convertsToTime()\", \"'invalid'.convertsToTime()\"],\n signatures: [\n {\n name: 'convertsToTime',\n parameters: [],\n input: { type: 'Any', singleton: true },\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate: convertsToTimeEvaluator\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // Get separator from args (if provided)\n let separator = '';\n if (args.length > 0 && args[0]) {\n const sepResult = await evaluator(args[0], input, context);\n if (sepResult.value.length > 0) {\n const boxedSep = sepResult.value[0];\n if (boxedSep) {\n const sepValue = unbox(boxedSep);\n if (typeof sepValue === 'string') {\n separator = sepValue;\n }\n }\n }\n }\n\n // Convert all input items to strings and join\n const stringValues = await Promise.all(input.map(async boxedItem => {\n if (boxedItem === null || boxedItem === undefined) {\n return '';\n }\n const item = unbox(boxedItem);\n if (item === null || item === undefined) {\n return '';\n }\n return String(item);\n }));\n\n const result = stringValues.join(separator);\n\n return { \n value: [box(result, { type: 'String', singleton: true })], \n context \n };\n};\n\nexport const joinFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'join',\n category: ['string'],\n description: 'The join function takes a collection of strings and joins them into a single string, optionally using the given separator. If the input is empty, the result is empty. If no separator is specified, the strings are directly concatenated.',\n examples: [\n \"('A' | 'B' | 'C').join() // 'ABC'\",\n \"('A' | 'B' | 'C').join(',') // 'A,B,C'\"\n ],\n signatures: [{\n\n name: 'join',\n input: { type: 'String', singleton: false },\n parameters: [\n { \n name: 'separator', \n optional: true,\n type: { type: 'String', singleton: true } \n },\n ],\n result: { type: 'String', singleton: true },\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check if we have exactly 2 arguments\n if (args.length !== 2) {\n throw Errors.invalidOperation('replace requires exactly 2 arguments: pattern and substitution');\n }\n \n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // If input has multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('replace can only be used on a single string value');\n }\n \n const boxedInput = input[0];\n if (!boxedInput) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInput);\n \n // Input must be a string\n if (typeof inputValue !== 'string') {\n return { value: [], context };\n }\n \n // Evaluate pattern argument\n const patternNode = args[0];\n if (!patternNode) {\n return { value: [], context };\n }\n const patternResult = await evaluator(patternNode, input, context);\n \n // If pattern is empty collection, return empty\n if (patternResult.value.length === 0) {\n return { value: [], context };\n }\n \n // Pattern must be single string\n if (patternResult.value.length > 1) {\n throw Errors.invalidOperation('replace pattern must be a single string value');\n }\n \n const boxedPattern = patternResult.value[0];\n if (!boxedPattern) {\n return { value: [], context };\n }\n \n const pattern = unbox(boxedPattern);\n if (typeof pattern !== 'string') {\n return { value: [], context };\n }\n \n // Evaluate substitution argument\n const substitutionNode = args[1];\n if (!substitutionNode) {\n return { value: [], context };\n }\n const substitutionResult = await evaluator(substitutionNode, input, context);\n \n // If substitution is empty collection, return empty\n if (substitutionResult.value.length === 0) {\n return { value: [], context };\n }\n \n // Substitution must be single string\n if (substitutionResult.value.length > 1) {\n throw Errors.invalidOperation('replace substitution must be a single string value');\n }\n \n const boxedSubstitution = substitutionResult.value[0];\n if (!boxedSubstitution) {\n return { value: [], context };\n }\n \n const substitution = unbox(boxedSubstitution);\n if (typeof substitution !== 'string') {\n return { value: [], context };\n }\n \n // Handle special case: empty pattern\n if (pattern === '') {\n // Insert substitution between every character\n const chars = inputValue.split('');\n const result = substitution + chars.join(substitution) + substitution;\n return { value: [box(result, { type: 'String', singleton: true })], context };\n }\n \n // Normal replacement: replace all occurrences\n const result = inputValue.split(pattern).join(substitution);\n \n return { value: [box(result, { type: 'Integer', singleton: true })], context };\n};\n\nexport const replaceFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'replace',\n category: ['string'],\n description: 'Returns the input string with all instances of pattern replaced with substitution',\n examples: [\n \"'abcdefg'.replace('cde', '123')\",\n \"'abcdefg'.replace('cde', '')\",\n \"'abc'.replace('', 'x')\"\n ],\n signatures: [{\n\n name: 'replace',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'pattern', type: { type: 'String', singleton: true } },\n { name: 'substitution', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'String', singleton: true },\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('union', 1, args.length);\n }\n\n // Evaluate the argument to get the other collection\n const argNode = args[0];\n if (!argNode) {\n throw Errors.invalidOperation('union requires an argument');\n }\n const otherResult = await evaluator(argNode, input, context);\n const other = otherResult.value;\n\n // Merge the two collections and eliminate duplicates using equals (=) semantics\n const result: any[] = [];\n const processedItemsJson = new Set<string>();\n \n // Add items from input collection\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n const itemJson = JSON.stringify(item);\n \n if (!processedItemsJson.has(itemJson)) {\n result.push(boxedItem);\n processedItemsJson.add(itemJson);\n }\n }\n \n // Add items from other collection if not already present\n for (const boxedItem of other) {\n const item = unbox(boxedItem);\n const itemJson = JSON.stringify(item);\n \n if (!processedItemsJson.has(itemJson)) {\n result.push(boxedItem);\n processedItemsJson.add(itemJson);\n }\n }\n \n return { value: result, context };\n};\n\nexport const unionFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'union',\n category: ['collection'],\n description: 'Merge the two collections into a single collection, eliminating any duplicate values (using equals (=) to determine equality). There is no expectation of order in the resulting collection.',\n examples: [\n '{1, 1, 2, 3}.union({2, 3})',\n 'name.select(use.union(given))',\n 'Patient.identifier.union(Patient.contact.identifier)'\n ],\n signatures: [{\n\n name: 'union',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'other', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // combine() requires exactly one argument (the other collection)\n if (!args || args.length !== 1) {\n throw Errors.invalidOperation('combine requires exactly one argument');\n }\n\n // Evaluate the argument to get the other collection\n const otherArg = args[0];\n if (!otherArg) {\n throw Errors.argumentRequired('combine', 'collection argument');\n }\n \n // Evaluate the argument expression\n // The argument should be evaluated in the root context, not the current input\n // Use the original context data\n const rootInput = context.variables?.['%context'] || context.input || [];\n const rootInputArray = Array.isArray(rootInput) ? rootInput : [rootInput];\n const otherResult = await evaluator(otherArg, rootInputArray, context);\n const otherCollection = otherResult.value;\n\n // Merge the input and other collections into a single collection\n // without eliminating duplicate values\n const combined = [...input, ...otherCollection];\n\n return { value: combined, context };\n};\n\nexport const combineFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'combine',\n doesNotPropagateEmpty: true, // Combine accepts empty collections as valid input\n category: ['collection'],\n description: 'Merge the input and other collections into a single collection without eliminating duplicate values. Combining an empty collection with a non-empty collection will return the non-empty collection. There is no expectation of order in the resulting collection.',\n examples: [\n \"{1, 2, 3}.combine({3, 4, 5}) // returns {1, 2, 3, 3, 4, 5}\"\n ],\n signatures: [{\n\n name: 'combine',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'other', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('intersect', 1, args.length);\n }\n\n // Evaluate the argument to get the other collection\n const argNode = args[0];\n if (!argNode) {\n throw Errors.invalidOperation('intersect requires an argument');\n }\n const otherResult = await evaluator(argNode, input, context);\n const other = otherResult.value;\n\n // Find elements that are in both collections, eliminating duplicates\n // Use deep equality for comparison as specified in FHIRPath equals (=) semantics.\n const result: any[] = [];\n const processedItemsJson = new Set<string>();\n \n // Check each item from input collection\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n const itemJson = JSON.stringify(item);\n \n // Skip if we've already processed this item (to eliminate duplicates)\n if (processedItemsJson.has(itemJson)) {\n continue;\n }\n \n // Check if item exists in other collection\n let foundInOther = false;\n for (const boxedOtherItem of other) {\n const otherItem = unbox(boxedOtherItem);\n if (JSON.stringify(otherItem) === itemJson) {\n foundInOther = true;\n break;\n }\n }\n \n // If found in both collections, add to result (preserving boxing)\n if (foundInOther) {\n result.push(boxedItem);\n processedItemsJson.add(itemJson);\n }\n }\n \n return { value: result, context };\n};\n\nexport const intersectFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'intersect',\n category: ['collection'],\n description: 'Returns the set of elements that are in both collections. Duplicate items will be eliminated by this function. Order of items is not guaranteed to be preserved in the result of this function.',\n examples: [\n '{1, 2, 3, 4}.intersect({3, 4, 5, 6})',\n 'Patient.identifier.intersect(Patient.contact.identifier)'\n ],\n signatures: [{\n\n name: 'intersect',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'other', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('exclude', 1, args.length);\n }\n\n // Evaluate the argument to get the other collection\n const argNode = args[0];\n if (!argNode) {\n throw Errors.invalidOperation('exclude requires an argument');\n }\n const otherResult = await evaluator(argNode, input, context);\n const other = otherResult.value;\n\n // Return elements from input that are not in other collection\n // Preserves duplicates and order\n const result: any[] = [];\n \n // Check each item from input collection\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n // Check if item exists in other collection\n let foundInOther = false;\n for (const boxedOtherItem of other) {\n const otherItem = unbox(boxedOtherItem);\n // Use JSON.stringify for deep equality comparison\n if (JSON.stringify(item) === JSON.stringify(otherItem)) {\n foundInOther = true;\n break;\n }\n }\n \n // If not found in other collection, add to result (preserving boxing)\n if (!foundInOther) {\n result.push(boxedItem);\n }\n }\n \n return { value: result, context };\n};\n\nexport const excludeFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'exclude',\n doesNotPropagateEmpty: true, // exclude with empty argument returns the original collection\n category: ['collection'],\n description: 'Returns the set of elements that are not in the other collection. Duplicate items will not be eliminated by this function, and order will be preserved.',\n examples: [\n '(1 | 2 | 3).exclude(2)',\n '{1, 2, 3, 4}.exclude({3, 4})',\n 'Patient.identifier.exclude(Patient.contact.identifier)'\n ],\n signatures: [{\n\n name: 'exclude',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'other', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator, LiteralNode } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('indexOf', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('indexOf');\n }\n\n // Check arguments\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('indexOf', 1, args.length);\n }\n\n // Evaluate substring argument\n const substringArg = args[0];\n if (!substringArg) {\n throw Errors.argumentRequired('indexOf', 'substring argument');\n }\n \n const substringResult = await evaluator(substringArg, input, context);\n \n if (substringResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (substringResult.value.length > 1) {\n throw Errors.singletonRequired('indexOf substring', substringResult.value.length);\n }\n \n const boxedSubstring = substringResult.value[0];\n if (!boxedSubstring) {\n return { value: [], context };\n }\n \n const substring = unbox(boxedSubstring);\n if (typeof substring !== 'string') {\n throw Errors.invalidStringOperation('indexOf', 'substring argument');\n }\n\n // Handle empty substring - returns 0 per spec\n if (substring === '') {\n return { value: [box(0, { type: 'Integer', singleton: true })], context };\n }\n\n // Find the index\n const index = inputValue.indexOf(substring);\n \n return { value: [box(index, { type: 'Integer', singleton: true })], context };\n};\n\nexport const indexOfFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'indexOf',\n category: ['string'],\n description: 'Returns the 0-based index of the first position substring is found in the input string, or -1 if it is not found',\n examples: [\n \"'abcdefg'.indexOf('bc')\",\n \"'abcdefg'.indexOf('x')\",\n \"'abcdefg'.indexOf('abcdefg')\"\n ],\n signatures: [{\n\n name: 'indexOf',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'substring', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Integer', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator, LiteralNode } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('lastIndexOf', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('lastIndexOf');\n }\n\n // Check arguments\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('lastIndexOf', 1, args.length);\n }\n\n // Evaluate substring argument\n const substringArg = args[0];\n if (!substringArg) {\n throw Errors.argumentRequired('lastIndexOf', 'substring argument');\n }\n \n const substringResult = await evaluator(substringArg, input, context);\n \n if (substringResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (substringResult.value.length > 1) {\n throw Errors.singletonRequired('lastIndexOf substring', substringResult.value.length);\n }\n \n const boxedSubstring = substringResult.value[0];\n if (!boxedSubstring) {\n return { value: [], context };\n }\n \n const substring = unbox(boxedSubstring);\n if (typeof substring !== 'string') {\n throw Errors.invalidStringOperation('lastIndexOf', 'substring argument');\n }\n\n // Handle empty substring - returns 0 per spec\n if (substring === '') {\n return { value: [box(0, { type: 'Integer', singleton: true })], context };\n }\n\n // Find the last index\n const index = inputValue.lastIndexOf(substring);\n \n return { value: [box(index, { type: 'Integer', singleton: true })], context };\n};\n\nexport const lastIndexOfFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'lastIndexOf',\n category: ['string'],\n description: 'Returns the 0-based index of the last position substring is found in the input string, or -1 if it is not found',\n examples: [\n \"'abcdefg'.lastIndexOf('bc')\",\n \"'abcdefg'.lastIndexOf('x')\",\n \"'abc abc'.lastIndexOf('a')\"\n ],\n signatures: [{\n name: 'lastIndexOf',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'substring', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Integer', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('substring', input.length);\n }\n\n const boxedInput = input[0];\n if (!boxedInput) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInput);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('substring');\n }\n\n // Check arguments - requires at least 1 (start), optionally 2 (start, length)\n if (args.length === 0 || args.length > 2) {\n throw Errors.invalidOperation('substring requires 1 or 2 arguments (start, and optionally length)');\n }\n\n // Evaluate start argument\n const startArg = args[0];\n if (!startArg) {\n return { value: [], context };\n }\n \n const startResult = await evaluator(startArg, input, context);\n \n if (startResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (startResult.value.length > 1) {\n throw Errors.singletonRequired('substring start', startResult.value.length);\n }\n \n const boxedStart = startResult.value[0];\n if (!boxedStart) {\n return { value: [], context };\n }\n \n const start = unbox(boxedStart);\n if (typeof start !== 'number' || !Number.isInteger(start)) {\n throw Errors.invalidNumericOperation('substring', 'start argument', 'integer');\n }\n\n // If start is outside string bounds, return empty\n if (start < 0 || start > inputValue.length) {\n return { value: [], context };\n }\n \n // Special case: start equals string length (e.g., empty string with start 0)\n if (start === inputValue.length) {\n return { value: [box('', { type: 'String', singleton: true })], context };\n }\n\n // Handle optional length argument\n let length: number | undefined;\n \n if (args.length === 2) {\n const lengthArg = args[1];\n if (lengthArg) {\n const lengthResult = await evaluator(lengthArg, input, context);\n \n if (lengthResult.value.length === 0) {\n // Empty length - behave as if length not provided\n length = undefined;\n } else {\n if (lengthResult.value.length > 1) {\n throw Errors.singletonRequired('substring length', lengthResult.value.length);\n }\n \n const boxedLength = lengthResult.value[0];\n if (!boxedLength) {\n length = undefined;\n } else {\n const lengthValue = unbox(boxedLength);\n if (typeof lengthValue !== 'number' || !Number.isInteger(lengthValue)) {\n throw Errors.invalidNumericOperation('substring', 'length argument', 'integer');\n }\n \n // Negative or zero length returns empty string\n if (lengthValue <= 0) {\n return { value: [box('', { type: 'String', singleton: true })], context };\n }\n \n length = lengthValue;\n }\n }\n }\n }\n\n // Extract substring\n let result: string;\n if (length === undefined) {\n // No length specified - return from start to end\n result = inputValue.substring(start);\n } else {\n // Length specified - return at most length characters\n result = inputValue.substring(start, start + length);\n }\n \n return { value: [box(result, { type: 'String', singleton: true })], context };\n};\n\nexport const substringFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'substring',\n category: ['string'],\n description: 'Returns the part of the string starting at position start (zero-based). If length is given, will return at most length number of characters from the input string',\n examples: [\n \"'abcdefg'.substring(3)\",\n \"'abcdefg'.substring(1, 2)\",\n \"'abcdefg'.substring(6, 2)\"\n ],\n signatures: [{\n\n name: 'substring',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'start', type: { type: 'Integer', singleton: true } },\n { name: 'length', type: { type: 'Integer', singleton: true }, optional: true }\n ],\n result: { type: 'String', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('matches', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('matches');\n }\n\n // Check arguments\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('matches', 1, args.length);\n }\n\n // Evaluate regex argument\n const regexArg = args[0];\n if (!regexArg) {\n throw Errors.argumentRequired('matches', 'regex argument');\n }\n \n const regexResult = await evaluator(regexArg, input, context);\n \n if (regexResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (regexResult.value.length > 1) {\n throw Errors.singletonRequired('matches regex', regexResult.value.length);\n }\n \n const boxedRegex = regexResult.value[0];\n if (!boxedRegex) {\n return { value: [], context };\n }\n \n const regexPattern = unbox(boxedRegex);\n if (typeof regexPattern !== 'string') {\n throw Errors.invalidStringOperation('matches', 'regex argument');\n }\n\n try {\n // Create regex with unicode support and single line mode (dotAll)\n // Per spec: case-sensitive, single line mode, allow Unicode\n const regex = new RegExp(regexPattern, 'us');\n const result = regex.test(inputValue);\n \n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n } catch (error) {\n throw new Error(`Invalid regular expression in matches(): ${(error as Error).message}`);\n }\n};\n\nexport const matchesFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'matches',\n category: ['string'],\n description: 'Returns true when the input string matches the given regular expression',\n examples: [\n \"'test string'.matches('t.+')\",\n \"'test string'.matches('asd.+')\",\n \"'first line\\\\nsecond line'.matches('line.second')\"\n ],\n signatures: [{\n name: 'matches',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'regex', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('matchesFull', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('matchesFull');\n }\n\n // Check arguments\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('matchesFull', 1, args.length);\n }\n\n // Evaluate regex argument\n const regexArg = args[0];\n if (!regexArg) {\n throw Errors.argumentRequired('matchesFull', 'regex argument');\n }\n \n const regexResult = await evaluator(regexArg, input, context);\n \n if (regexResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (regexResult.value.length > 1) {\n throw Errors.singletonRequired('matchesFull regex', regexResult.value.length);\n }\n \n const boxedRegex = regexResult.value[0];\n if (!boxedRegex) {\n return { value: [], context };\n }\n \n const regexPattern = unbox(boxedRegex);\n if (typeof regexPattern !== 'string') {\n throw Errors.invalidStringOperation('matchesFull', 'regex argument');\n }\n\n try {\n // matchesFull implicitly adds ^ and $ anchors to match the entire string\n // Only add anchors if they're not already present\n let fullPattern = regexPattern;\n if (!regexPattern.startsWith('^')) {\n fullPattern = '^' + fullPattern;\n }\n if (!regexPattern.endsWith('$')) {\n fullPattern = fullPattern + '$';\n }\n \n // Create regex with unicode support and single line mode (dotAll)\n // Per spec: case-sensitive, single line mode, allow Unicode\n const regex = new RegExp(fullPattern, 'us');\n const result = regex.test(inputValue);\n \n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n } catch (error) {\n throw new Error(`Invalid regular expression in matchesFull(): ${(error as Error).message}`);\n }\n};\n\nexport const matchesFullFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'matchesFull',\n category: ['string'],\n description: 'Returns true when the input string completely matches the given regular expression',\n examples: [\n \"'Library'.matchesFull('Library')\",\n \"'http://example.org/Library'.matchesFull('Library')\",\n \"'N8000123'.matchesFull('N[0-9]{7}')\"\n ],\n signatures: [{\n name: 'matchesFull',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'regex', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('replaceMatches', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('replaceMatches');\n }\n\n // Check arguments\n if (args.length !== 2) {\n throw Errors.wrongArgumentCount('replaceMatches', 2, args.length);\n }\n\n // Evaluate regex argument\n const regexArg = args[0];\n if (!regexArg) {\n throw Errors.argumentRequired('replaceMatches', 'regex argument');\n }\n \n const regexResult = await evaluator(regexArg, input, context);\n \n if (regexResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (regexResult.value.length > 1) {\n throw Errors.singletonRequired('replaceMatches regex', regexResult.value.length);\n }\n \n const boxedRegex = regexResult.value[0];\n if (!boxedRegex) {\n return { value: [], context };\n }\n \n const regexPattern = unbox(boxedRegex);\n if (typeof regexPattern !== 'string') {\n throw Errors.invalidStringOperation('replaceMatches', 'regex argument');\n }\n\n // Evaluate substitution argument\n const substitutionArg = args[1];\n if (!substitutionArg) {\n throw Errors.argumentRequired('replaceMatches', 'substitution argument');\n }\n \n const substitutionResult = await evaluator(substitutionArg, input, context);\n \n if (substitutionResult.value.length === 0) {\n return { value: [], context };\n }\n \n if (substitutionResult.value.length > 1) {\n throw Errors.singletonRequired('replaceMatches substitution', substitutionResult.value.length);\n }\n \n const boxedSubstitution = substitutionResult.value[0];\n if (!boxedSubstitution) {\n return { value: [], context };\n }\n \n const substitution = unbox(boxedSubstitution);\n if (typeof substitution !== 'string') {\n throw Errors.invalidStringOperation('replaceMatches', 'substitution argument');\n }\n\n try {\n // Create regex with unicode support, single line mode (dotAll), and global flag for all matches\n // Per spec: case-sensitive, single line mode, allow Unicode\n const regex = new RegExp(regexPattern, 'gus');\n \n // JavaScript's replace supports $1, $2 etc for capture groups\n // The spec also mentions named groups with ${name} syntax\n // JavaScript natively supports both $1 and $<name> syntax\n // We need to convert ${name} to $<name> for JavaScript compatibility\n const jsSubstitution = substitution.replace(/\\$\\{([^}]+)\\}/g, '$<$1>');\n \n const result = inputValue.replace(regex, jsSubstitution);\n \n return { value: [box(result, { type: 'String', singleton: true })], context };\n } catch (error) {\n throw new Error(`Invalid regular expression in replaceMatches(): ${(error as Error).message}`);\n }\n};\n\nexport const replaceMatchesFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'replaceMatches',\n category: ['string'],\n description: 'Replaces all matches of the regex pattern with the substitution string',\n examples: [\n \"'test string'.replaceMatches('test', 'match')\",\n \"'11/30/1972'.replaceMatches('\\\\\\\\b(\\\\\\\\d{1,2})/(\\\\\\\\d{1,2})/(\\\\\\\\d{2,4})\\\\\\\\b', '$2-$1-$3')\",\n \"'test test'.replaceMatches('t', 'T')\"\n ],\n signatures: [{\n name: 'replaceMatches',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'regex', type: { type: 'String', singleton: true } },\n { name: 'substitution', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'String', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('toChars', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('toChars');\n }\n\n // Check arguments - toChars takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('toChars', 0, args.length);\n }\n\n // Convert string to array of single-character strings\n // Use Array.from to properly handle Unicode characters (including emoji)\n const chars = Array.from(inputValue);\n \n // Box each character as a String\n const result = chars.map(char => box(char, { type: 'String', singleton: true }));\n \n return { value: result, context };\n};\n\nexport const toCharsFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toChars',\n category: ['string'],\n description: 'Returns the list of characters in the input string as a collection',\n examples: [\n \"'abc'.toChars()\",\n \"'Hello'.toChars()\",\n \"''.toChars()\"\n ],\n signatures: [{\n name: 'toChars',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // contains() requires exactly 1 argument\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('contains', 1, args.length);\n }\n\n const substringExpr = args[0];\n if (!substringExpr) {\n throw Errors.argumentRequired('contains', 'substring argument');\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('contains can only be applied to a single string');\n }\n\n // Input must be a string\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n // Non-string input returns empty\n return { value: [], context };\n }\n\n // Evaluate the substring expression\n const substringResult = await evaluator(substringExpr, input, context);\n \n // If substring evaluation is empty, return empty\n if (substringResult.value.length === 0) {\n return { value: [], context };\n }\n \n // Substring must be a single string\n if (substringResult.value.length > 1) {\n throw Errors.invalidOperation('contains substring argument must evaluate to a single value');\n }\n \n const boxedSubstring = substringResult.value[0];\n if (!boxedSubstring) {\n return { value: [], context };\n }\n \n const substring = unbox(boxedSubstring);\n if (typeof substring !== 'string') {\n // Non-string substring returns empty\n return { value: [], context };\n }\n\n // If substring is empty string, result is true\n if (substring === '') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // Check if input string contains the substring\n const result = inputValue.includes(substring);\n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const containsFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'contains',\n category: ['string'],\n description: 'Returns true when the given substring is a substring of the input string. If substring is the empty string, the result is true. If the input collection is empty, the result is empty. If the input collection contains multiple items, the evaluation of the expression will end and signal an error to the calling environment.',\n examples: [\n \"'abc'.contains('b')\",\n \"'abc'.contains('bc')\", \n \"'abc'.contains('d')\"\n ],\n signatures: [{\n\n name: 'contains',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'substring', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};\n","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // startsWith() requires exactly 1 argument\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('startsWith', 1, args.length);\n }\n\n const prefixExpr = args[0];\n if (!prefixExpr) {\n throw Errors.argumentRequired('startsWith', 'prefix argument');\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('startsWith can only be applied to a single string');\n }\n\n // Input must be a string\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n // Non-string input returns empty\n return { value: [], context };\n }\n\n // Evaluate the prefix expression\n const prefixResult = await evaluator(prefixExpr, input, context);\n \n // If prefix evaluation is empty, return empty\n if (prefixResult.value.length === 0) {\n return { value: [], context };\n }\n \n // Prefix must be a single string\n if (prefixResult.value.length > 1) {\n throw Errors.invalidOperation('startsWith prefix argument must evaluate to a single value');\n }\n \n const boxedPrefix = prefixResult.value[0];\n if (!boxedPrefix) {\n return { value: [], context };\n }\n \n const prefix = unbox(boxedPrefix);\n if (typeof prefix !== 'string') {\n // Non-string prefix returns empty\n return { value: [], context };\n }\n\n // If prefix is empty string, result is true\n if (prefix === '') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // Check if input string starts with the prefix\n const result = inputValue.startsWith(prefix);\n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const startsWithFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'startsWith',\n category: ['string'],\n description: 'Returns true when the input string starts with the given prefix. If prefix is the empty string, the result is true. If the input collection is empty, the result is empty. If the input collection contains multiple items, the evaluation of the expression will end and signal an error to the calling environment.',\n examples: [\n \"'abcdefg'.startsWith('abc')\",\n \"'abcdefg'.startsWith('xyz')\"\n ],\n signatures: [{\n\n name: 'startsWith',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'prefix', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Validate arguments\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('endsWith', 1, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('endsWith', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Check that input is a string\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('endsWith');\n }\n\n // Evaluate the suffix argument\n if (!args[0]) {\n throw Errors.argumentRequired('endsWith', 'suffix argument');\n }\n const suffixResult = await evaluator(args[0], input, context);\n \n // If suffix is empty, propagate empty\n if (suffixResult.value.length === 0) {\n return { value: [], context };\n }\n \n // Validate that suffix is a singleton string\n if (suffixResult.value.length !== 1) {\n throw Errors.invalidOperation('endsWith suffix argument must be a single value');\n }\n \n const boxedSuffix = suffixResult.value[0];\n if (!boxedSuffix) {\n return { value: [], context };\n }\n \n const suffix = unbox(boxedSuffix);\n \n // Check that suffix is a string\n if (typeof suffix !== 'string') {\n throw Errors.invalidStringOperation('endsWith', 'suffix argument');\n }\n \n // If suffix is empty string, result is true\n if (suffix === '') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check if input ends with suffix\n const result = inputValue.endsWith(suffix);\n \n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const endsWithFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'endsWith',\n category: ['string'],\n description: 'Returns true when the input string ends with the given suffix. If suffix is the empty string, the result is true. If the input collection is empty, the result is empty. If the input collection contains multiple items, an error is signaled.',\n examples: [\n \"'abcdefg'.endsWith('efg')\",\n \"'abcdefg'.endsWith('abc')\"\n ],\n signatures: [{\n\n name: 'endsWith',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'suffix', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Check single item in input\n if (input.length === 0) {\n return { value: [], context };\n }\n \n if (input.length > 1) {\n throw Errors.stringSingletonRequired('length', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('length');\n }\n\n // length() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('length', 0, args.length);\n }\n\n // Return the length of the string\n return { value: [box(inputValue.length, { type: 'Integer', singleton: true })], context };\n};\n\nexport const lengthFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'length',\n category: ['string'],\n description: 'Returns the length of the input string. If the input collection is empty, the result is empty.',\n examples: [\n \"'abcdefg'.length()\",\n \"''.length()\",\n \"name.given.first().length()\"\n ],\n signatures: [{\n\n name: 'length',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // trim() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('trim', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('trim can only be applied to a single string');\n }\n\n // Input must be a string\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n if (typeof inputValue !== 'string') {\n // Non-string input returns empty\n return { value: [], context };\n }\n\n // Trim whitespace from beginning and end\n // FHIRPath defines whitespace as: tab (\\t), space ( ), line feed (\\n), carriage return (\\r)\n const trimmed = inputValue.trim();\n \n return { value: [box(trimmed, { type: 'String', singleton: true })], context };\n};\n\nexport const trimFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'trim',\n category: ['string'],\n description: 'Trims whitespace characters from the beginning and ending of the input string. Whitespace includes tab (\\\\t), space ( ), line feed (\\\\n) and carriage return (\\\\r). If the input is empty, the result is empty.',\n examples: [\n \"' hello '.trim()\",\n \"'\\\\thello\\\\n'.trim()\",\n \"'no-trim'.trim()\"\n ],\n signatures: [{\n\n name: 'trim',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // If the input is empty, the result is true\n if (input.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Verify all inputs are booleans (unbox first)\n for (let i = 0; i < input.length; i++) {\n const unboxedValue = unbox(input[i]!);\n if (typeof unboxedValue !== 'boolean') {\n throw Errors.booleanOperationOnNonBoolean('allTrue', i, `${typeof unboxedValue}`);\n }\n }\n \n // Return true if all items are true, false if any item is false\n const result = input.every(item => unbox(item) === true);\n \n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const allTrueFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'allTrue',\n doesNotPropagateEmpty: true,\n category: ['existence'],\n description: 'Takes a collection of Boolean values and returns true if all the items are true. If any items are false, the result is false. If the input is empty, the result is true.',\n examples: [\n \"Observation.select(component.value > 90 'mm[Hg]').allTrue()\"\n ],\n signatures: [{\n\n name: 'allTrue',\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Handle empty input collection\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // Validate singleton input\n if (input.length !== 1) {\n throw Errors.invalidOperation('split requires a singleton input');\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n \n // Type check the input - must be a string\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('split');\n }\n\n // Validate arguments - requires exactly one argument\n if (!args || args.length !== 1) {\n throw Errors.invalidOperation('split requires exactly one argument');\n }\n\n // Evaluate the separator argument\n const separatorArg = args[0];\n if (!separatorArg) {\n throw Errors.invalidOperation('split requires exactly one argument');\n }\n const separatorResult = await evaluator(separatorArg, input, context);\n \n if (separatorResult.value.length !== 1) {\n throw Errors.invalidOperation('split separator must be a singleton');\n }\n \n const boxedSeparator = separatorResult.value[0];\n if (!boxedSeparator) {\n throw Errors.invalidOperation('split separator must be a string');\n }\n \n const separator = unbox(boxedSeparator);\n \n if (typeof separator !== 'string') {\n throw Errors.invalidOperation('split separator must be a string');\n }\n\n // Perform the split operation\n const result = inputValue.split(separator);\n \n // Box each result string\n const boxedResult = result.map(str => box(str, { type: 'String', singleton: false }));\n\n return { value: boxedResult, context };\n};\n\nexport const splitFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'split',\n category: ['string'],\n description: 'Splits a singleton input string into a list of strings, using the given separator. If the input is empty, the result is empty. If the input string does not contain any appearances of the separator, the result is the input string.',\n examples: [\n \"('A,B,C').split(',') // returns { 'A', 'B', 'C' }\",\n \"('ABC').split(',') // returns { 'ABC' }\",\n \"'A,,C'.split(',') // returns { 'A', '', 'C' }\"\n ],\n signatures: [{\n\n name: 'split',\n input: { type: 'String', singleton: true },\n parameters: [\n { name: 'separator', type: { type: 'String', singleton: true } }\n ],\n result: { type: 'String', singleton: false }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Handle empty input collection\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // If input contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('upper can only be applied to a singleton string');\n }\n \n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n \n // Type check the input - must be a string\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('upper');\n }\n \n // upper() takes no arguments\n if (args && args.length > 0) {\n throw Errors.invalidOperation('upper does not take any arguments');\n }\n \n // Convert to uppercase\n const result = inputValue.toUpperCase();\n \n return { value: [box(result, { type: 'String', singleton: true })], context };\n};\n\nexport const upperFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'upper',\n category: ['string'],\n description: 'Returns the input string with all characters converted to upper case. If the input collection is empty, the result is empty. If the input collection contains multiple items, the evaluation of the expression will end and signal an error to the calling environment.',\n examples: [\n \"'abcdefg'.upper() // returns 'ABCDEFG'\",\n \"'AbCdefg'.upper() // returns 'ABCDEFG'\"\n ],\n signatures: [{\n\n name: 'upper',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Handle empty input collection\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // If input contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('lower can only be applied to a singleton string');\n }\n \n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n \n // Type check the input - must be a string\n if (typeof inputValue !== 'string') {\n throw Errors.stringOperationOnNonString('lower');\n }\n \n // lower() takes no arguments\n if (args && args.length > 0) {\n throw Errors.invalidOperation('lower does not take any arguments');\n }\n \n // Convert to lowercase\n const result = inputValue.toLowerCase();\n \n return { value: [box(result, { type: 'String', singleton: true })], context };\n};\n\nexport const lowerFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'lower',\n category: ['string'],\n description: 'Returns the input string with all characters converted to lower case. If the input collection is empty, the result is empty. If the input collection contains multiple items, the evaluation of the expression will end and signal an error to the calling environment.',\n examples: [\n \"'ABCDEFG'.lower() // returns 'abcdefg'\",\n \"'aBcDEFG'.lower() // returns 'abcdefg'\"\n ],\n signatures: [{\n\n name: 'lower',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // If the input is empty, the result is true\n if (input.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Verify all inputs are booleans (unbox first)\n for (let i = 0; i < input.length; i++) {\n const unboxedValue = unbox(input[i]!);\n if (typeof unboxedValue !== 'boolean') {\n throw Errors.booleanOperationOnNonBoolean('allFalse', i, `${typeof unboxedValue}`);\n }\n }\n \n // Return true if all items are false, false if any item is true\n const result = input.every(item => unbox(item) === false);\n \n return { value: [box(result, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const allFalseFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'allFalse',\n doesNotPropagateEmpty: true,\n category: ['existence'],\n description: 'Takes a collection of Boolean values and returns true if all the items are false. If any items are true, the result is false. If the input is empty, the result is true.',\n examples: [\n \"Observation.select(component.value > 90 'mm[Hg]').allFalse()\"\n ],\n signatures: [{\n\n name: 'allFalse',\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Empty input returns false per spec\n if (input.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check if any item in the collection is true\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n if (typeof item !== 'boolean') {\n continue; // Skip non-boolean values\n }\n if (item === true) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n // All items are false or non-boolean\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const anyTrueFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'anyTrue',\n doesNotPropagateEmpty: true,\n category: ['existence'],\n description: 'Takes a collection of Boolean values and returns true if any of the items are true. If all the items are false, or if the input is empty, the result is false.',\n examples: [\n \"Observation.component.select(value.value > 90).anyTrue()\"\n ],\n signatures: [{\n\n name: 'anyTrue',\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Empty input returns false per spec\n if (input.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check if any item in the collection is false\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n if (typeof item !== 'boolean') {\n continue; // Skip non-boolean values\n }\n if (item === false) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n // All items are true or non-boolean\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const anyFalseFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'anyFalse',\n doesNotPropagateEmpty: true,\n category: ['existence'],\n description: 'Takes a collection of Boolean values and returns true if any of the items are false. If all the items are true, or if the input is empty, the result is false.',\n examples: [\n \"Observation.select(component.value > 90 'mm[Hg]').anyFalse()\"\n ],\n signatures: [{\n\n name: 'anyFalse',\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('subsetOf', 1, args.length);\n }\n\n // If the input collection is empty, the result is true\n if (input.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // Evaluate the other collection argument\n const argNode = args[0];\n if (!argNode) {\n throw Errors.invalidOperation('subsetOf requires an argument');\n }\n // Evaluate the argument with the root context ($this), not the current input\n // This allows expressions like Patient.name.given to work correctly\n // $this contains the original input to the FHIRPath expression\n // context.input contains the original input passed to evaluate()\n // We should use $this if available, otherwise fall back to context.input\n const rootInput = context.variables?.['$this'] || context.input || [];\n const otherResult = await evaluator(argNode, rootInput, context);\n const other = otherResult.value;\n\n // If the other collection is empty but input is not, the result is false\n if (other.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n\n // Check if all items in input are members of other using equals semantics\n for (const boxedInputItem of input) {\n const inputItem = unbox(boxedInputItem);\n let found = false;\n for (const boxedOtherItem of other) {\n const otherItem = unbox(boxedOtherItem);\n // Use deep equality for comparing items\n if (JSON.stringify(inputItem) === JSON.stringify(otherItem)) {\n found = true;\n break;\n }\n }\n // If any item is not found in other, return false\n if (!found) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n\n // All items in input are members of other\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const subsetOfFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'subsetOf',\n doesNotPropagateEmpty: true, // Returns true if input is empty\n category: ['existence'],\n description: 'Returns true if all items in the input collection are members of the collection passed as the other argument. Membership is determined using the equals (=) operation.',\n examples: [\n 'MedicationRequest.contained.meta.tag.subsetOf(MedicationRequest.meta.tag)'\n ],\n signatures: [{\n\n name: 'subsetOf',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'other', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('supersetOf', 1, args.length);\n }\n\n // Evaluate the other collection argument\n const argNode = args[0];\n if (!argNode) {\n throw Errors.invalidOperation('supersetOf requires an argument');\n }\n // Evaluate the argument with the root context ($this), not the current input\n // This allows expressions like Patient.name.given to work correctly\n // $this contains the original input to the FHIRPath expression\n // context.input contains the original input passed to evaluate()\n // We should use $this if available, otherwise fall back to context.input\n const rootInput = context.variables?.['$this'] || context.input || [];\n const otherResult = await evaluator(argNode, rootInput, context);\n const other = otherResult.value;\n\n // If the other collection is empty, the result is true\n if (other.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // If the input collection is empty but other is not, the result is false\n if (input.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n\n // Check if all items in other are members of input using equals semantics\n for (const boxedOtherItem of other) {\n const otherItem = unbox(boxedOtherItem);\n let found = false;\n for (const boxedInputItem of input) {\n const inputItem = unbox(boxedInputItem);\n // Use deep equality for comparing items\n if (JSON.stringify(otherItem) === JSON.stringify(inputItem)) {\n found = true;\n break;\n }\n }\n // If any item from other is not found in input, return false\n if (!found) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n\n // All items in other are members of input\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const supersetOfFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'supersetOf',\n doesNotPropagateEmpty: true, // Returns false if input is empty (unless other is also empty)\n category: ['existence'],\n description: 'Returns true if all items in the collection passed as the other argument are members of the input collection. Membership is determined using the equals (=) operation.',\n examples: [\n 'MedicationRequest.contained.meta.tag.supersetOf(MedicationRequest.meta.tag)'\n ],\n signatures: [{\n\n name: 'supersetOf',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'other', type: { type: 'Any', singleton: false } }\n ],\n result: { type: 'Boolean', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // toInteger() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('toInteger', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('toInteger', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Handle different input types according to spec\n \n // Integer - return as is\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n return { value: [box(inputValue, { type: 'Integer', singleton: true })], context };\n }\n \n // String - convert if valid integer format\n if (typeof inputValue === 'string') {\n // Regex from spec: (\\+|-)?\\d+\n const integerRegex = /^(\\+|-)?\\d+$/;\n if (integerRegex.test(inputValue)) {\n const intValue = parseInt(inputValue, 10);\n return { value: [box(intValue, { type: 'Integer', singleton: true })], context };\n }\n // String not convertible to integer - return empty\n return { value: [], context };\n }\n \n // Boolean - true -> 1, false -> 0\n if (typeof inputValue === 'boolean') {\n return { value: [box(inputValue ? 1 : 0, { type: 'Integer', singleton: true })], context };\n }\n\n // For all other types (including decimals), return empty\n return { value: [], context };\n};\n\nexport const toIntegerFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toInteger',\n category: ['type-conversion'],\n description: 'Converts the input to an Integer. Returns an integer for: Integer (identity), String convertible to integer (using regex (\\\\+|-)?\\\\d+), Boolean (true->1, false->0). Returns empty for all other types or non-convertible strings. Throws error for multiple input items.',\n examples: [\n \"'42'.toInteger()\",\n \"'+123'.toInteger()\",\n \"'-456'.toInteger()\",\n \"true.toInteger()\",\n \"false.toInteger()\",\n \"'hello'.toInteger()\"\n ],\n signatures: [\n {\n name: 'toInteger-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n {\n name: 'toInteger-string',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n {\n name: 'toInteger-boolean',\n input: { type: 'Boolean', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // Handle empty input collection\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // If input contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('toDecimal can only be applied to a singleton');\n }\n \n // toDecimal() takes no arguments\n if (args && args.length > 0) {\n throw Errors.invalidOperation('toDecimal does not take any arguments');\n }\n \n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n \n // Handle different input types according to spec\n \n // Integer or Decimal - return as decimal\n if (typeof inputValue === 'number') {\n return { value: [box(inputValue, { type: 'Decimal', singleton: true })], context };\n }\n \n // Boolean - true -> 1.0, false -> 0.0\n if (typeof inputValue === 'boolean') {\n return { value: [box(inputValue ? 1.0 : 0.0, { type: 'Decimal', singleton: true })], context };\n }\n \n // String - try to convert to decimal\n if (typeof inputValue === 'string') {\n // Use the regex from the spec: (\\+|-)?\\d+(\\.\\d+)?\n const decimalRegex = /^(\\+|-)?\\d+(\\.\\d+)?$/;\n \n if (!decimalRegex.test(inputValue)) {\n // String is not convertible to decimal\n return { value: [], context };\n }\n \n const parsedValue = parseFloat(inputValue);\n \n // Check for valid number\n if (isNaN(parsedValue)) {\n return { value: [], context };\n }\n \n return { value: [box(parsedValue, { type: 'Decimal', singleton: true })], context };\n }\n \n // For any other type, return empty\n return { value: [], context };\n};\n\nexport const toDecimalFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toDecimal',\n category: ['type-conversion'],\n description: 'Converts the input to a Decimal value. Returns a single decimal for Integer, Decimal, convertible String, or Boolean inputs. Returns empty for non-convertible values.',\n examples: [\n \"'3.14'.toDecimal() // returns 3.14\",\n \"42.toDecimal() // returns 42.0\",\n \"true.toDecimal() // returns 1.0\",\n \"false.toDecimal() // returns 0.0\"\n ],\n signatures: [\n {\n name: 'toDecimal-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'toDecimal-decimal',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'toDecimal-boolean',\n input: { type: 'Boolean', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'toDecimal-string',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // toString takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('toString', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, signal an error\n if (input.length > 1) {\n throw Errors.invalidOperation('toString can only be used on single values');\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Handle different types according to the spec\n if (typeof inputValue === 'string') {\n // Already a string\n return { value: [box(inputValue, { type: 'String', singleton: true })], context };\n }\n \n if (typeof inputValue === 'number') {\n // Integer or Decimal\n return { value: [box(inputValue.toString(), { type: 'String', singleton: true })], context };\n }\n \n if (typeof inputValue === 'boolean') {\n // Boolean: true -> 'true', false -> 'false'\n return { value: [box(inputValue ? 'true' : 'false', { type: 'String', singleton: true })], context };\n }\n \n // Handle Date, Time, DateTime objects if they have specific properties\n if (inputValue && typeof inputValue === 'object') {\n // Check for Date type (YYYY-MM-DD format)\n if (inputValue.type === 'Date' && inputValue.value) {\n return { value: [box(inputValue.value, { type: 'String', singleton: true })], context };\n }\n \n // Check for DateTime type (YYYY-MM-DDThh:mm:ss.fff(+|-)hh:mm format)\n if (inputValue.type === 'DateTime' && inputValue.value) {\n return { value: [box(inputValue.value, { type: 'String', singleton: true })], context };\n }\n \n // Check for Time type (hh:mm:ss.fff(+|-)hh:mm format)\n if (inputValue.type === 'Time' && inputValue.value) {\n return { value: [box(inputValue.value, { type: 'String', singleton: true })], context };\n }\n \n // Check for Quantity type\n if (inputValue.type === 'Quantity' && inputValue.value !== undefined && inputValue.unit) {\n return { value: [box(`${inputValue.value} '${inputValue.unit}'`, { type: 'String', singleton: true })], context };\n }\n }\n \n // For any other type, return empty (not false as mentioned in spec - seems to be a typo)\n return { value: [], context };\n};\n\nexport const toStringFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toString',\n category: ['type-conversion'],\n description: 'Converts a single value to a String. Supports String, Integer, Decimal, Boolean, Date, Time, DateTime, and Quantity types. Returns empty for unsupported types. Signals an error for multiple input items.',\n examples: [\n \"42.toString()\",\n \"true.toString()\",\n \"'hello'.toString()\",\n \"3.14.toString()\"\n ],\n signatures: [\n {\n name: 'toString-string',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-decimal',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-boolean',\n input: { type: 'Boolean', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-date',\n input: { type: 'Date', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-datetime',\n input: { type: 'DateTime', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-time',\n input: { type: 'Time', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n {\n name: 'toString-quantity',\n input: { type: 'Quantity', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // toBoolean() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('toBoolean', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('toBoolean', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Handle different input types according to spec\n \n // Boolean - return as is (boxed)\n if (typeof inputValue === 'boolean') {\n return { value: [box(inputValue, { type: 'Boolean', singleton: true })], context };\n }\n \n // Integer - 1 -> true, 0 -> false\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n if (inputValue === 1) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n } else if (inputValue === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n // Other integers return empty\n return { value: [], context };\n }\n \n // Decimal - 1.0 -> true, 0.0 -> false\n if (typeof inputValue === 'number' && !Number.isInteger(inputValue)) {\n if (inputValue === 1.0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n } else if (inputValue === 0.0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n // Other decimals return empty\n return { value: [], context };\n }\n \n // String - various representations (case insensitive)\n if (typeof inputValue === 'string') {\n const lowerValue = inputValue.toLowerCase();\n \n // True representations\n if (['true', 't', 'yes', 'y', '1', '1.0'].includes(lowerValue)) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // False representations\n if (['false', 'f', 'no', 'n', '0', '0.0'].includes(lowerValue)) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Other strings return empty\n return { value: [], context };\n }\n\n // For all other types, return empty\n return { value: [], context };\n};\n\nexport const toBooleanFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toBoolean',\n category: ['type-conversion'],\n description: 'Converts the input to a Boolean. Accepts: Boolean (identity), Integer (1->true, 0->false), Decimal (1.0->true, 0.0->false), String (\\'true\\'/\\'t\\'/\\'yes\\'/\\'y\\'/\\'1\\'/\\'1.0\\'->true, \\'false\\'/\\'f\\'/\\'no\\'/\\'n\\'/\\'0\\'/\\'0.0\\'->false, case insensitive). Returns empty for all other values. Throws error for multiple input items.',\n examples: [\n \"'true'.toBoolean()\",\n \"'FALSE'.toBoolean()\",\n \"'yes'.toBoolean()\",\n \"'no'.toBoolean()\",\n \"1.toBoolean()\",\n \"0.toBoolean()\",\n \"1.0.toBoolean()\",\n \"0.0.toBoolean()\"\n ],\n signatures: [\n {\n name: 'toBoolean-boolean',\n input: { type: 'Boolean', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n {\n name: 'toBoolean-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n {\n name: 'toBoolean-decimal',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n {\n name: 'toBoolean-string',\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox, box } from '../interpreter/boxing';\nimport { createQuantity, CALENDAR_DURATION_UNITS } from '../complex-types/quantity-value';\nimport { ucum } from '@atomic-ehr/ucum';\n\n// Regex for parsing quantity strings according to FHIRPath spec\n// Matches: (?'value'(\\+|-)?\\d+(\\.\\d+)?)\\s*('(?'unit'[^']+)'|(?'time'[a-zA-Z]+))?\nconst QUANTITY_REGEX = /^(?<value>[+-]?\\d+(?:\\.\\d+)?)\\s*(?:'(?<quotedUnit>[^']+)'|(?<unquotedUnit>[a-zA-Z]+))?$/;\n\n// Calendar duration conversion factors (from spec)\nconst CALENDAR_CONVERSIONS: Record<string, Record<string, number>> = {\n 'year': { 'month': 12, 'months': 12, 'day': 365, 'days': 365, 'd': 365 },\n 'years': { 'month': 12, 'months': 12, 'day': 365, 'days': 365, 'd': 365 },\n 'month': { 'day': 30, 'days': 30, 'd': 30 },\n 'months': { 'day': 30, 'days': 30, 'd': 30 },\n 'week': { 'day': 7, 'days': 7, 'd': 7 },\n 'weeks': { 'day': 7, 'days': 7, 'd': 7 },\n 'wk': { 'day': 7, 'days': 7, 'd': 7 },\n 'day': { 'hour': 24, 'hours': 24, 'h': 24 },\n 'days': { 'hour': 24, 'hours': 24, 'h': 24 },\n 'd': { 'hour': 24, 'hours': 24, 'h': 24 },\n 'hour': { 'minute': 60, 'minutes': 60, 'min': 60 },\n 'hours': { 'minute': 60, 'minutes': 60, 'min': 60 },\n 'h': { 'minute': 60, 'minutes': 60, 'min': 60 },\n 'minute': { 'second': 60, 'seconds': 60, 's': 60 },\n 'minutes': { 'second': 60, 'seconds': 60, 's': 60 },\n 'min': { 'second': 60, 'seconds': 60, 's': 60 },\n 'second': { 's': 1 },\n 'seconds': { 's': 1 }\n};\n\n// Map common time units to their canonical forms\nconst UNIT_MAPPING: Record<string, string> = {\n 'year': 'year',\n 'years': 'year',\n 'month': 'month', \n 'months': 'month',\n 'week': 'week',\n 'weeks': 'week',\n 'day': 'd',\n 'days': 'd',\n 'hour': 'h',\n 'hours': 'h',\n 'minute': 'min',\n 'minutes': 'min',\n 'second': 's',\n 'seconds': 's',\n 'millisecond': 'ms',\n 'milliseconds': 'ms'\n};\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // toQuantity takes 0 or 1 argument (optional unit)\n if (args.length > 1) {\n throw Errors.wrongArgumentCountRange('toQuantity', 0, 1, args.length);\n }\n\n // Check singleton requirement\n if (input.length > 1) {\n throw Errors.singletonRequired('toQuantity', input.length);\n }\n\n if (input.length === 0) {\n return { value: [], context };\n }\n\n const item = input[0];\n if (!item) {\n return { value: [], context };\n }\n \n const unboxedItem = unbox(item);\n const itemType = (item as any).typeInfo?.type || (item as any).type;\n \n let resultQuantity: any = null;\n\n // Handle different input types\n if (itemType === 'Integer' || itemType === 'Decimal') {\n // Numbers get default unit '1'\n resultQuantity = createQuantity(unboxedItem as number, '1');\n } else if (itemType === 'Quantity') {\n // Already a quantity\n resultQuantity = unboxedItem;\n } else if (itemType === 'Boolean') {\n // true → 1.0 '1', false → 0.0 '1'\n const value = unboxedItem ? 1.0 : 0.0;\n resultQuantity = createQuantity(value, '1');\n } else if (itemType === 'String') {\n // Try to parse the string as a quantity\n const str = unboxedItem as string;\n const match = QUANTITY_REGEX.exec(str);\n \n if (match) {\n const value = parseFloat(match.groups?.value || '0');\n const unit = match.groups?.quotedUnit || match.groups?.unquotedUnit || '1';\n \n // Map common time units to canonical forms\n const mappedUnit = UNIT_MAPPING[unit] || unit;\n resultQuantity = createQuantity(value, mappedUnit);\n } else {\n // String doesn't match quantity format\n return { value: [], context };\n }\n } else {\n // Other types return empty\n return { value: [], context };\n }\n\n // If unit argument is provided, attempt conversion\n if (args.length === 1) {\n const unitArg = args[0];\n if (!unitArg) {\n throw Errors.invalidOperation('toQuantity: unit parameter is required');\n }\n \n // Evaluate the argument to get the unit string\n const unitResult = await evaluator(unitArg, input, context);\n if (unitResult.value.length !== 1) {\n throw Errors.invalidOperation('toQuantity: unit parameter must be a single string value');\n }\n \n const unitValue = unitResult.value[0];\n const unitValueType = (unitValue as any)?.typeInfo?.type || (unitValue as any)?.type;\n if (!unitValue || unitValueType !== 'String') {\n throw Errors.invalidOperation('toQuantity: unit parameter must be a string');\n }\n \n const targetUnit = unbox(unitValue) as string;\n const mappedTargetUnit = UNIT_MAPPING[targetUnit] || targetUnit;\n \n // Try calendar duration conversion first\n const conversions = CALENDAR_CONVERSIONS[resultQuantity.unit];\n if (conversions && conversions[mappedTargetUnit]) {\n const factor = conversions[mappedTargetUnit];\n resultQuantity = createQuantity(resultQuantity.value * factor, mappedTargetUnit);\n } else if (resultQuantity.unit === mappedTargetUnit) {\n // Same unit, no conversion needed\n } else if (!CALENDAR_DURATION_UNITS.has(resultQuantity.unit) && \n !CALENDAR_DURATION_UNITS.has(mappedTargetUnit)) {\n // Try UCUM conversion\n try {\n const convertedValue = ucum.convert(resultQuantity.value, resultQuantity.unit, mappedTargetUnit);\n resultQuantity = createQuantity(convertedValue, mappedTargetUnit);\n } catch (e) {\n // Conversion failed, return empty\n return { value: [], context };\n }\n } else {\n // Can't convert between these units\n return { value: [], context };\n }\n }\n\n return { \n value: [box(resultQuantity, { type: 'Quantity', singleton: true })], \n context \n };\n};\n\nexport const toQuantityFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toQuantity',\n category: ['conversion'],\n description: 'Converts the input to a Quantity value. Integers and Decimals are converted with default unit \\'1\\'. Strings are parsed for quantity format. Boolean true becomes 1.0 \\'1\\', false becomes 0.0 \\'1\\'. With optional unit parameter, attempts conversion to specified unit.',\n examples: [\n '1.toQuantity() // Returns 1 \\'1\\'',\n '\\'4 days\\'.toQuantity() // Returns 4 \\'d\\'',\n '\\'1 \\\\\\'wk\\\\\\'\\'.toQuantity(\\'d\\') // Returns 7 \\'d\\'',\n 'true.toQuantity() // Returns 1.0 \\'1\\''\n ],\n signatures: [{\n name: 'toQuantity',\n input: { type: 'Any', singleton: true },\n parameters: [\n { name: 'unit', type: { type: 'String', singleton: true }, optional: true }\n ],\n result: { type: 'Quantity', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox, box } from '../interpreter/boxing';\n\n// 64-bit Long bounds\nconst MAX_LONG = BigInt('9223372036854775807');\nconst MIN_LONG = BigInt('-9223372036854775808');\n\n// Regex for integer string format\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\nexport const evaluate: FunctionEvaluator = async (input, context, args) => {\n // toLong takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('toLong', 0, args.length);\n }\n\n // Check singleton requirement\n if (input.length > 1) {\n throw Errors.singletonRequired('toLong', input.length);\n }\n\n if (input.length === 0) {\n return { value: [], context };\n }\n\n const item = input[0];\n if (!item) {\n return { value: [], context };\n }\n \n const unboxedItem = unbox(item);\n const itemType = (item as any).typeInfo?.type || (item as any).type;\n \n let resultValue: number | null = null;\n\n // Handle different input types\n if (itemType === 'Integer' || itemType === 'Long') {\n // Integer/Long passthrough\n resultValue = unboxedItem as number;\n } else if (itemType === 'Boolean') {\n // true → 1, false → 0\n resultValue = unboxedItem ? 1 : 0;\n } else if (itemType === 'String') {\n // Try to parse the string as an integer\n const str = unboxedItem as string;\n \n // Check if string matches integer format\n if (!INTEGER_REGEX.test(str)) {\n return { value: [], context };\n }\n \n try {\n // Use BigInt to parse and check bounds\n const bigIntValue = BigInt(str);\n \n // Check 64-bit bounds\n if (bigIntValue < MIN_LONG || bigIntValue > MAX_LONG) {\n return { value: [], context };\n }\n \n // Convert back to number (safe within 64-bit bounds)\n resultValue = Number(bigIntValue);\n } catch (e) {\n // Parse failed\n return { value: [], context };\n }\n } else {\n // Other types return empty\n return { value: [], context };\n }\n\n // Box the result as Long type\n return { \n value: [box(resultValue, { type: 'Long', singleton: true })], \n context \n };\n};\n\nexport const toLongFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'toLong',\n category: ['conversion'],\n description: 'Converts the input to a 64-bit Long integer. Integers are passed through, Strings are parsed if they match integer format and are within 64-bit bounds, Boolean true becomes 1 and false becomes 0. This is a Standard for Trial Use (STU) feature.',\n examples: [\n '1.toLong() // Returns 1',\n '\\'123\\'.toLong() // Returns 123',\n 'true.toLong() // Returns 1',\n '\\'9223372036854775807\\'.toLong() // Max 64-bit value'\n ],\n signatures: [{\n name: 'toLong',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Long', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // convertsToBoolean() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('convertsToBoolean', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('convertsToBoolean', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Check if the value can be converted to Boolean\n \n // Boolean - always convertible\n if (typeof inputValue === 'boolean') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Integer - 1 and 0 are convertible\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n const canConvert = inputValue === 1 || inputValue === 0;\n return { value: [box(canConvert, { type: 'Boolean', singleton: true })], context };\n }\n \n // Decimal - 1.0 and 0.0 are convertible\n if (typeof inputValue === 'number' && !Number.isInteger(inputValue)) {\n const canConvert = inputValue === 1.0 || inputValue === 0.0;\n return { value: [box(canConvert, { type: 'Boolean', singleton: true })], context };\n }\n \n // String - check if it's a valid boolean representation (case insensitive)\n if (typeof inputValue === 'string') {\n const lowerValue = inputValue.toLowerCase();\n const validRepresentations = ['true', 't', 'yes', 'y', '1', '1.0', 'false', 'f', 'no', 'n', '0', '0.0'];\n const canConvert = validRepresentations.includes(lowerValue);\n return { value: [box(canConvert, { type: 'Boolean', singleton: true })], context };\n }\n\n // For all other types, return false\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToBooleanFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'convertsToBoolean',\n category: ['type-conversion'],\n description: 'Returns true if the input can be converted to a Boolean. Returns true for: Boolean (any), Integer (1 or 0), Decimal (1.0 or 0.0), String (\\'true\\'/\\'t\\'/\\'yes\\'/\\'y\\'/\\'1\\'/\\'1.0\\'/\\'false\\'/\\'f\\'/\\'no\\'/\\'n\\'/\\'0\\'/\\'0.0\\', case insensitive). Returns false for all other values.',\n examples: [\n \"'true'.convertsToBoolean()\",\n \"'invalid'.convertsToBoolean()\",\n \"1.convertsToBoolean()\",\n \"2.convertsToBoolean()\"\n ],\n signatures: [\n {\n name: 'convertsToBoolean',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // convertsToInteger() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('convertsToInteger', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('convertsToInteger', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Check if the value can be converted to Integer\n \n // Integer - always convertible\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // String - check if valid integer format\n if (typeof inputValue === 'string') {\n // Regex from spec: (\\+|-)?\\d+\n const integerRegex = /^(\\+|-)?\\d+$/;\n const canConvert = integerRegex.test(inputValue);\n return { value: [box(canConvert, { type: 'Boolean', singleton: true })], context };\n }\n \n // Boolean - always convertible (true -> 1, false -> 0)\n if (typeof inputValue === 'boolean') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // For all other types (including decimals), return false\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToIntegerFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'convertsToInteger',\n category: ['type-conversion'],\n description: 'Returns true if the input can be converted to an Integer. Returns true for: Integer (any), String matching regex (\\\\+|-)?\\\\d+, Boolean (any). Returns false for all other types including decimals.',\n examples: [\n \"'42'.convertsToInteger()\",\n \"'3.14'.convertsToInteger()\",\n \"true.convertsToInteger()\",\n \"3.14.convertsToInteger()\"\n ],\n signatures: [\n {\n name: 'convertsToInteger',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // convertsToDecimal() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('convertsToDecimal', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('convertsToDecimal', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Check if the value can be converted to Decimal\n \n // Integer or Decimal - always convertible\n if (typeof inputValue === 'number') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Boolean - always convertible (true -> 1.0, false -> 0.0)\n if (typeof inputValue === 'boolean') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // String - check if valid decimal format\n if (typeof inputValue === 'string') {\n // Use the regex from the spec: (\\+|-)?\\d+(\\.\\d+)?\n const decimalRegex = /^(\\+|-)?\\d+(\\.\\d+)?$/;\n \n if (!decimalRegex.test(inputValue)) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const parsedValue = parseFloat(inputValue);\n \n // Check for valid number\n if (isNaN(parsedValue)) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // For all other types, return false\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToDecimalFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'convertsToDecimal',\n category: ['type-conversion'],\n description: 'Returns true if the input can be converted to a Decimal. Returns true for: Integer (any), Decimal (any), Boolean (any), String matching regex (\\\\+|-)?\\\\d+(\\\\.\\\\d+)?. Returns false for all other types.',\n examples: [\n \"'42'.convertsToDecimal()\",\n \"'3.14'.convertsToDecimal()\",\n \"true.convertsToDecimal()\",\n \"'invalid'.convertsToDecimal()\"\n ],\n signatures: [\n {\n name: 'convertsToDecimal',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // convertsToString() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('convertsToString', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('convertsToString', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Check if the value can be converted to String\n \n // String - always convertible\n if (typeof inputValue === 'string') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Integer or Decimal - always convertible\n if (typeof inputValue === 'number') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Boolean - always convertible\n if (typeof inputValue === 'boolean') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check for temporal types (Date, Time, DateTime) - these are convertible\n if (inputValue && typeof inputValue === 'object') {\n // Check if it has type property indicating temporal type\n const objWithType = inputValue as any;\n if (objWithType.type === 'Date' || objWithType.type === 'DateTime' || objWithType.type === 'Time') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check boxed type info\n const typeInfo = boxedInputValue.typeInfo;\n if (typeInfo?.type === 'Date' || typeInfo?.type === 'DateTime' || typeInfo?.type === 'Time') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check for Quantity type\n if (objWithType.type === 'Quantity' || typeInfo?.type === 'Quantity') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n }\n\n // For complex objects and other types, return false\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToStringFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'convertsToString',\n category: ['type-conversion'],\n description: 'Returns true if the input can be converted to a String. Returns true for: String (any), Integer (any), Decimal (any), Boolean (any), Date, DateTime, Time, Quantity. Returns false for complex objects and resources.',\n examples: [\n \"'test'.convertsToString()\",\n \"42.convertsToString()\",\n \"true.convertsToString()\",\n \"Patient.convertsToString()\"\n ],\n signatures: [\n {\n name: 'convertsToString',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\nimport { createQuantity, isValidQuantity } from '../complex-types/quantity-value';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // convertsToQuantity() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('convertsToQuantity', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('convertsToQuantity', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n const typeInfo = boxedInputValue.typeInfo;\n\n // Check if the value can be converted to Quantity\n \n // Already a Quantity\n if (typeInfo?.type === 'Quantity') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check for Quantity object structure\n if (inputValue && typeof inputValue === 'object') {\n const obj = inputValue as any;\n // Check if it looks like a Quantity (has value and unit properties)\n if (typeof obj.value === 'number' && typeof obj.unit === 'string') {\n // Validate that the unit is valid (either UCUM or calendar duration)\n try {\n const quantity = createQuantity(obj.value, obj.unit);\n const isValid = isValidQuantity(quantity);\n return { value: [box(isValid, { type: 'Boolean', singleton: true })], context };\n } catch {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n }\n \n // String - check if it can be parsed as a quantity (e.g., \"10 mg\", \"5.5 km\")\n if (typeof inputValue === 'string') {\n // Try to parse as quantity: number followed by space(s) and unit\n // This matches the pattern: <number> <unit>\n const quantityRegex = /^(\\+|-)?\\d+(\\.\\d+)?\\s+.+$/;\n \n if (!quantityRegex.test(inputValue.trim())) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Split into value and unit parts\n const parts = inputValue.trim().split(/\\s+/);\n if (parts.length < 2) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const valueStr = parts[0];\n const unit = parts.slice(1).join(' ');\n \n const value = parseFloat(valueStr!);\n if (isNaN(value)) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Check if the unit is valid\n try {\n const quantity = createQuantity(value, unit);\n const isValid = isValidQuantity(quantity);\n return { value: [box(isValid, { type: 'Boolean', singleton: true })], context };\n } catch {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n // Integer or Decimal with no unit - not a valid quantity\n // (quantities must have units)\n if (typeof inputValue === 'number') {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n\n // For all other types, return false\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToQuantityFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'convertsToQuantity',\n category: ['type-conversion'],\n description: 'Returns true if the input can be converted to a Quantity. Returns true for: Quantity (any), String in format \"number unit\" with valid UCUM or calendar duration unit. Returns false for numbers without units and all other types.',\n examples: [\n \"'10 mg'.convertsToQuantity()\",\n \"'5.5 km'.convertsToQuantity()\",\n \"10.convertsToQuantity()\",\n \"'invalid'.convertsToQuantity()\"\n ],\n signatures: [\n {\n name: 'convertsToQuantity',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // convertsToLong() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('convertsToLong', 0, args.length);\n }\n\n // If input collection is empty, result is empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input collection contains multiple items, signal an error\n if (input.length > 1) {\n throw Errors.singletonRequired('convertsToLong', input.length);\n }\n\n const boxedInputValue = input[0];\n if (!boxedInputValue) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n const inputValue = unbox(boxedInputValue);\n\n // Check if the value can be converted to Long\n // Note: In JavaScript, we don't have a separate Long type, but we can check\n // if the value would be a valid long (integer within safe bounds)\n \n // Integer - always convertible to Long\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // String - check if valid integer format (same as convertsToInteger)\n if (typeof inputValue === 'string') {\n // Regex from spec: (\\+|-)?\\d+\n const integerRegex = /^(\\+|-)?\\d+$/;\n if (!integerRegex.test(inputValue)) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // For Long, we should check if the value is within valid bounds\n // In JavaScript, we can safely represent integers up to Number.MAX_SAFE_INTEGER\n try {\n const longValue = BigInt(inputValue);\n // Check if it can be safely represented\n // For FHIRPath, Long is typically 64-bit integer\n const MAX_LONG = BigInt('9223372036854775807');\n const MIN_LONG = BigInt('-9223372036854775808');\n \n const canConvert = longValue >= MIN_LONG && longValue <= MAX_LONG;\n return { value: [box(canConvert, { type: 'Boolean', singleton: true })], context };\n } catch {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n // Boolean - always convertible (true -> 1, false -> 0)\n if (typeof inputValue === 'boolean') {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n\n // For all other types (including decimals), return false\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const convertsToLongFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'convertsToLong',\n category: ['type-conversion'],\n description: 'Returns true if the input can be converted to a Long (64-bit integer). Returns true for: Integer (any), String matching regex (\\\\+|-)?\\\\d+ within 64-bit bounds, Boolean (any). Returns false for all other types including decimals.',\n examples: [\n \"'42'.convertsToLong()\",\n \"'9223372036854775807'.convertsToLong()\",\n \"'9223372036854775808'.convertsToLong()\",\n \"true.convertsToLong()\"\n ],\n signatures: [\n {\n name: 'convertsToLong',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // trace() requires at least a name argument\n if (args.length === 0) {\n // If no name provided, use a default name\n console.log('[FHIRPath trace] (unnamed):', JSON.stringify(input));\n return { value: input, context };\n }\n \n if (args.length > 2) {\n throw Errors.wrongArgumentCountRange('trace', 0, 2, args.length);\n }\n\n // Evaluate the name argument\n if (!args[0]) {\n throw Errors.argumentRequired('trace', 'name argument');\n }\n const nameResult = await evaluator(args[0], input, context);\n \n // Validate that name is a singleton string\n if (nameResult.value.length !== 1) {\n throw Errors.singletonRequired('trace name', nameResult.value.length);\n }\n \n const boxedName = nameResult.value[0];\n if (!boxedName) {\n throw Errors.invalidStringOperation('trace', 'name argument');\n }\n \n const name = unbox(boxedName);\n if (typeof name !== 'string') {\n throw Errors.invalidStringOperation('trace', 'name argument');\n }\n\n // If projection argument is provided, evaluate it and log the result\n if (args.length === 2 && args[1]) {\n const projectionResult = await evaluator(args[1], input, context);\n console.log(`[FHIRPath trace] ${name}:`, JSON.stringify(projectionResult.value));\n } else {\n // Otherwise log the input\n console.log(`[FHIRPath trace] ${name}:`, JSON.stringify(input));\n }\n\n // Always return the input unchanged\n return { value: input, context };\n};\n\nexport const traceFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'trace',\n category: ['utility'],\n description: 'Adds a String representation of the input collection to the diagnostic log, using the name argument as the name in the log. Does not change the input, so returns the input collection as output.',\n examples: [\n \"contained.where(criteria).trace('unmatched', id).empty()\",\n \"name.given.trace('test').count()\"\n ],\n signatures: [{\n\n name: 'trace',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'name', type: { type: 'String', singleton: true } },\n { name: 'projection', type: { type: 'Any', singleton: false }, optional: true }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate\n};","// dateOf() function - Extracts date component from Date or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { createDate, isFHIRDate, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const dateOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // dateOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('dateOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('dateOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Date or DateTime\n if (isFHIRDate(value)) {\n // Already a Date, return as-is\n return {\n value: [box(value, { type: 'Date', singleton: true })],\n context\n };\n }\n \n if (isFHIRDateTime(value)) {\n // Extract date component (preserve precision)\n const date = createDate(value.year, value.month, value.day);\n return {\n value: [box(date, { type: 'Date', singleton: true })],\n context\n };\n }\n \n // Not a Date or DateTime, return empty\n return { value: [], context };\n};\n\nexport const dateOfFunction: FunctionDefinition & { evaluate: typeof dateOfEvaluator } = {\n name: 'dateOf',\n category: ['temporal'],\n description: 'Returns the date component of a Date or DateTime value',\n examples: [\n '@2012-01-01T12:30:00.dateOf()',\n 'Patient.birthDate.dateOf()'\n ],\n signatures: [\n {\n name: 'dateOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Date', singleton: true }\n }\n ],\n evaluate: dateOfEvaluator\n};","// timeOf() function - Extracts time component from DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { createTime, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const timeOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // timeOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('timeOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('timeOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a DateTime\n if (isFHIRDateTime(value)) {\n // Check if time component is present\n if (value.hour === undefined) {\n // No time component present\n return { value: [], context };\n }\n \n // Extract time component (preserve precision)\n const time = createTime(value.hour, value.minute, value.second, value.millisecond);\n return {\n value: [box(time, { type: 'Time', singleton: true })],\n context\n };\n }\n \n // Not a DateTime, return empty\n return { value: [], context };\n};\n\nexport const timeOfFunction: FunctionDefinition & { evaluate: typeof timeOfEvaluator } = {\n name: 'timeOf',\n category: ['temporal'],\n description: 'Returns the time component of a DateTime value',\n examples: [\n '@2012-01-01T12:30:00.timeOf()',\n 'Observation.effectiveDateTime.timeOf()'\n ],\n signatures: [\n {\n name: 'timeOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Time', singleton: true }\n }\n ],\n evaluate: timeOfEvaluator\n};","// yearOf() function - Extracts year component from Date or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRDate, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const yearOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // yearOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('yearOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('yearOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Date or DateTime\n if (isFHIRDate(value) || isFHIRDateTime(value)) {\n // Check if year component is present\n if (value.year === undefined) {\n return { value: [], context };\n }\n \n // Return the year as an Integer\n return {\n value: [box(value.year, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Date or DateTime, return empty\n return { value: [], context };\n};\n\nexport const yearOfFunction: FunctionDefinition & { evaluate: typeof yearOfEvaluator } = {\n name: 'yearOf',\n category: ['temporal'],\n description: 'Returns the year component of a Date or DateTime value',\n examples: [\n '@2014-01-05.yearOf()',\n '@2014-01-05T10:30:00.yearOf()',\n 'Patient.birthDate.yearOf()'\n ],\n signatures: [\n {\n name: 'yearOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: yearOfEvaluator\n};","// monthOf() function - Extracts month component from Date or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRDate, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const monthOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // monthOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('monthOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('monthOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Date or DateTime\n if (isFHIRDate(value) || isFHIRDateTime(value)) {\n // Check if month component is present\n if (value.month === undefined) {\n return { value: [], context };\n }\n \n // Return the month as an Integer (1-12)\n return {\n value: [box(value.month, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Date or DateTime, return empty\n return { value: [], context };\n};\n\nexport const monthOfFunction: FunctionDefinition & { evaluate: typeof monthOfEvaluator } = {\n name: 'monthOf',\n category: ['temporal'],\n description: 'Returns the month component of a Date or DateTime value (1-12)',\n examples: [\n '@2014-01-05.monthOf()',\n '@2014-01-05T10:30:00.monthOf()',\n 'Patient.birthDate.monthOf()'\n ],\n signatures: [\n {\n name: 'monthOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: monthOfEvaluator\n};","// dayOf() function - Extracts day component from Date or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRDate, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const dayOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // dayOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('dayOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('dayOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Date or DateTime\n if (isFHIRDate(value) || isFHIRDateTime(value)) {\n // Check if day component is present\n if (value.day === undefined) {\n return { value: [], context };\n }\n \n // Return the day as an Integer (1-31)\n return {\n value: [box(value.day, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Date or DateTime, return empty\n return { value: [], context };\n};\n\nexport const dayOfFunction: FunctionDefinition & { evaluate: typeof dayOfEvaluator } = {\n name: 'dayOf',\n category: ['temporal'],\n description: 'Returns the day component of a Date or DateTime value (1-31)',\n examples: [\n '@2014-01-05.dayOf()',\n '@2014-01-05T10:30:00.dayOf()',\n 'Patient.birthDate.dayOf()'\n ],\n signatures: [\n {\n name: 'dayOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: dayOfEvaluator\n};","// hourOf() function - Extracts hour component from Time or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRTime, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const hourOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // hourOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('hourOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('hourOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Time or DateTime\n if (isFHIRTime(value) || isFHIRDateTime(value)) {\n // Check if hour component is present\n if (value.hour === undefined) {\n return { value: [], context };\n }\n \n // Return the hour as an Integer (0-23)\n return {\n value: [box(value.hour, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Time or DateTime, return empty\n return { value: [], context };\n};\n\nexport const hourOfFunction: FunctionDefinition & { evaluate: typeof hourOfEvaluator } = {\n name: 'hourOf',\n category: ['temporal'],\n description: 'Returns the hour component of a Time or DateTime value (0-23)',\n examples: [\n '@T10:30:00.hourOf()',\n '@2014-01-05T10:30:00.hourOf()',\n 'Patient.birthDate.hourOf()'\n ],\n signatures: [\n {\n name: 'hourOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: hourOfEvaluator\n};","// minuteOf() function - Extracts minute component from Time or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRTime, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const minuteOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // minuteOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('minuteOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('minuteOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Time or DateTime\n if (isFHIRTime(value) || isFHIRDateTime(value)) {\n // Check if minute component is present\n if (value.minute === undefined) {\n return { value: [], context };\n }\n \n // Return the minute as an Integer (0-59)\n return {\n value: [box(value.minute, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Time or DateTime, return empty\n return { value: [], context };\n};\n\nexport const minuteOfFunction: FunctionDefinition & { evaluate: typeof minuteOfEvaluator } = {\n name: 'minuteOf',\n category: ['temporal'],\n description: 'Returns the minute component of a Time or DateTime value (0-59)',\n examples: [\n '@T10:30:00.minuteOf()',\n '@2014-01-05T10:30:00.minuteOf()',\n 'Observation.effectiveDateTime.minuteOf()'\n ],\n signatures: [\n {\n name: 'minuteOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: minuteOfEvaluator\n};","// secondOf() function - Extracts second component from Time or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRTime, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const secondOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // secondOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('secondOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('secondOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Time or DateTime\n if (isFHIRTime(value) || isFHIRDateTime(value)) {\n // Check if second component is present\n if (value.second === undefined) {\n return { value: [], context };\n }\n \n // Return the second as an Integer (0-59)\n return {\n value: [box(value.second, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Time or DateTime, return empty\n return { value: [], context };\n};\n\nexport const secondOfFunction: FunctionDefinition & { evaluate: typeof secondOfEvaluator } = {\n name: 'secondOf',\n category: ['temporal'],\n description: 'Returns the second component of a Time or DateTime value (0-59)',\n examples: [\n '@T10:30:45.secondOf()',\n '@2014-01-05T10:30:45.secondOf()',\n 'Observation.effectiveDateTime.secondOf()'\n ],\n signatures: [\n {\n name: 'secondOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: secondOfEvaluator\n};","// millisecondOf() function - Extracts millisecond component from Time or DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRTime, isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const millisecondOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // millisecondOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('millisecondOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('millisecondOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a Time or DateTime\n if (isFHIRTime(value) || isFHIRDateTime(value)) {\n // Check if millisecond component is present\n if (value.millisecond === undefined) {\n return { value: [], context };\n }\n \n // Return the millisecond as an Integer (0-999)\n return {\n value: [box(value.millisecond, { type: 'Integer', singleton: true })],\n context\n };\n }\n \n // Not a Time or DateTime, return empty\n return { value: [], context };\n};\n\nexport const millisecondOfFunction: FunctionDefinition & { evaluate: typeof millisecondOfEvaluator } = {\n name: 'millisecondOf',\n category: ['temporal'],\n description: 'Returns the millisecond component of a Time or DateTime value (0-999)',\n examples: [\n '@T10:30:45.123.millisecondOf()',\n '@2014-01-05T10:30:45.500.millisecondOf()',\n 'Observation.effectiveDateTime.millisecondOf()'\n ],\n signatures: [\n {\n name: 'millisecondOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }\n ],\n evaluate: millisecondOfEvaluator\n};","// timezoneOffsetOf() function - Extracts timezone offset component from DateTime\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { isFHIRDateTime } from '../complex-types/temporal';\nimport { Errors } from '../errors';\n\nexport const timezoneOffsetOfEvaluator: FunctionEvaluator = async (input, context, args) => {\n // timezoneOffsetOf() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('timezoneOffsetOf', 0, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('timezoneOffsetOf', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Check if it's a DateTime with timezone\n if (isFHIRDateTime(value)) {\n // Check if timezone offset is present\n if (value.timezoneOffset === undefined) {\n return { value: [], context };\n }\n \n // Return the timezone offset as a Decimal (hours)\n // The timezoneOffset is stored in minutes, convert to decimal hours\n const offsetInHours = value.timezoneOffset / 60;\n \n return {\n value: [box(offsetInHours, { type: 'Decimal', singleton: true })],\n context\n };\n }\n \n // Not a DateTime, return empty\n return { value: [], context };\n};\n\nexport const timezoneOffsetOfFunction: FunctionDefinition & { evaluate: typeof timezoneOffsetOfEvaluator } = {\n name: 'timezoneOffsetOf',\n category: ['temporal'],\n description: 'Returns the timezone offset component of a DateTime value as decimal hours',\n examples: [\n '@2012-01-01T12:30:00.000-07:00.timezoneOffsetOf()',\n '@2012-01-01T12:30:00.000+05:30.timezoneOffsetOf()',\n 'Patient.lastUpdated.timezoneOffsetOf()'\n ],\n signatures: [\n {\n name: 'timezoneOffsetOf',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n }\n ],\n evaluate: timezoneOffsetOfEvaluator\n};","// lowBoundary() function - Returns the least possible value to the specified precision\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { \n isFHIRDate, isFHIRDateTime, isFHIRTime,\n getDateLowBoundary, getDateTimeLowBoundary, getTimeLowBoundary \n} from '../complex-types/temporal';\nimport { getDecimalLowBoundary } from './decimal-boundaries';\nimport { Errors } from '../errors';\n\nexport const lowBoundaryEvaluator: FunctionEvaluator = async (input, context, args, evaluator) => {\n // lowBoundary() takes optional precision parameter\n if (args.length > 1) {\n throw Errors.wrongArgumentCountRange('lowBoundary', 0, 1, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('lowBoundary', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Get precision if provided\n let precision: number | undefined;\n if (args.length === 1) {\n const precisionResult = await evaluator(args[0]!, input, context);\n const precisionArg = precisionResult.value;\n if (precisionArg.length === 0) {\n return { value: [], context };\n }\n if (precisionArg.length > 1) {\n throw Errors.singletonRequired('lowBoundary precision', precisionArg.length);\n }\n const precisionValue = unbox(precisionArg[0]!);\n if (typeof precisionValue !== 'number' || !Number.isInteger(precisionValue)) {\n throw Errors.invalidOperandType('lowBoundary precision', typeof precisionValue);\n }\n precision = precisionValue;\n }\n \n // Handle Date\n if (isFHIRDate(value)) {\n const result = getDateLowBoundary(value, precision);\n if (!result) {\n return { value: [], context };\n }\n return { value: [box(result, { type: 'Date', singleton: true })], context };\n }\n \n // Handle DateTime\n if (isFHIRDateTime(value)) {\n const result = getDateTimeLowBoundary(value, precision);\n if (!result) {\n return { value: [], context };\n }\n return { value: [box(result, { type: 'DateTime', singleton: true })], context };\n }\n \n // Handle Time\n if (isFHIRTime(value)) {\n const result = getTimeLowBoundary(value, precision);\n if (!result) {\n return { value: [], context };\n }\n return { value: [box(result, { type: 'Time', singleton: true })], context };\n }\n \n // For Decimal/Integer types\n if (typeof value === 'number') {\n const result = getDecimalLowBoundary(value, precision);\n if (result === null) {\n return { value: [], context };\n }\n // Determine the result type based on whether it's an integer or decimal\n const isInteger = Number.isInteger(result);\n return { \n value: [box(result, { type: isInteger ? 'Integer' : 'Decimal', singleton: true })], \n context \n };\n }\n \n // Invalid type returns empty\n return { value: [], context };\n};\n\nexport const lowBoundaryFunction: FunctionDefinition & { evaluate: typeof lowBoundaryEvaluator } = {\n name: 'lowBoundary',\n category: ['utility'],\n description: 'Returns the least possible value of the input to the specified precision',\n examples: [\n '@2014.lowBoundary(6)',\n '@2014-01-01T08.lowBoundary(17)',\n '@T10:30.lowBoundary(9)',\n '1.587.lowBoundary()',\n '1.587.lowBoundary(2)',\n '1.lowBoundary(0)'\n ],\n signatures: [\n {\n name: 'lowBoundary',\n input: { type: 'Any' as const, singleton: true },\n parameters: [\n { name: 'precision', type: { type: 'Integer' as const, singleton: true }, optional: true }\n ],\n result: { type: 'Any' as const, singleton: true }\n }\n ],\n evaluate: lowBoundaryEvaluator\n};","/**\n * Decimal boundary functions for FHIRPath\n * \n * Implements lowBoundary and highBoundary for decimal values according to the FHIRPath specification.\n * These functions return the least or greatest possible value at a specified precision.\n */\n\n/**\n * Maximum supported precision for decimal values (FHIRPath requires at least 8)\n */\nconst MAX_DECIMAL_PRECISION = 8;\n\n/**\n * Get the low boundary of a decimal value at the specified precision\n * \n * Returns the least possible value of the input to the specified precision.\n * For the given precision, returns the truncated value minus half the step size.\n * \n * @param value The decimal value\n * @param precision The number of decimal places (optional, defaults to input precision + 1) \n * @returns The low boundary value, or null if precision is invalid\n */\nexport function getDecimalLowBoundary(value: number, precision?: number): number | null {\n // Default precision is the input's precision (for decimals) or 1 (for integers)\n if (precision === undefined) {\n const str = value.toString();\n const decimalIndex = str.indexOf('.');\n const inputPrecision = decimalIndex === -1 ? 0 : str.length - decimalIndex - 1;\n // For integers, default to precision 1; for decimals, use their precision\n precision = inputPrecision === 0 ? 1 : Math.min(inputPrecision, MAX_DECIMAL_PRECISION);\n }\n \n // Invalid precision returns null (empty in FHIRPath)\n if (precision < 0 || precision > MAX_DECIMAL_PRECISION) {\n return null;\n }\n \n // For precision 0 (integer precision)\n if (precision === 0) {\n // For integers at precision 0, return floor - 1 for positive, ceiling + 1 for negative\n // 1.lowBoundary(0) = 0\n // -1.lowBoundary(0) = -2\n const truncated = value >= 0 ? Math.floor(value) : Math.ceil(value);\n return truncated - 1;\n }\n \n // Calculate the factor for the given precision\n const factor = Math.pow(10, precision);\n const stepSize = Math.pow(10, -precision);\n const halfStep = stepSize / 2;\n \n // Check if the original value is an integer\n const isInteger = Math.floor(value) === value;\n \n // For integers with decimal precision, the boundary is 0.5 less than the value\n if (isInteger && precision > 0) {\n return value - 0.5;\n }\n \n // Truncate the value to the specified precision using floor (always toward negative infinity)\n const truncated = Math.floor(value * factor) / factor;\n \n // The low boundary is the truncated value minus half a step\n return truncated - halfStep;\n}\n\n/**\n * Get the high boundary of a decimal value at the specified precision\n * \n * Returns the greatest possible value of the input to the specified precision.\n * For the given precision, returns the ceiling value plus half the step size.\n * \n * @param value The decimal value\n * @param precision The number of decimal places (optional, defaults to input precision + 1)\n * @returns The high boundary value, or null if precision is invalid\n */\nexport function getDecimalHighBoundary(value: number, precision?: number): number | null {\n // Default precision is the input's precision (for decimals) or 1 (for integers)\n if (precision === undefined) {\n const str = value.toString();\n const decimalIndex = str.indexOf('.');\n const inputPrecision = decimalIndex === -1 ? 0 : str.length - decimalIndex - 1;\n // For integers, default to precision 1; for decimals, use their precision\n precision = inputPrecision === 0 ? 1 : Math.min(inputPrecision, MAX_DECIMAL_PRECISION);\n }\n \n // Invalid precision returns null (empty in FHIRPath)\n if (precision < 0 || precision > MAX_DECIMAL_PRECISION) {\n return null;\n }\n \n // For precision 0 (integer precision)\n if (precision === 0) {\n // For integers at precision 0, return ceiling + 1 for positive, floor - 1 for negative\n // 1.highBoundary(0) = 2\n // -1.highBoundary(0) = -2\n const ceiling = value >= 0 ? Math.ceil(value) : Math.floor(value);\n return ceiling + 1;\n }\n \n // Calculate the factor for the given precision\n const factor = Math.pow(10, precision);\n const stepSize = Math.pow(10, -precision);\n const halfStep = stepSize / 2;\n \n // Check if the original value is an integer\n const isInteger = Math.floor(value) === value;\n \n // For integers with decimal precision, the boundary is 0.5 more than the value\n if (isInteger && precision > 0) {\n return value + 0.5;\n }\n \n // Ceiling the value to the specified precision (always toward positive infinity)\n const ceiling = Math.ceil(value * factor) / factor;\n \n // The high boundary is the ceiling value plus half a step\n return ceiling + halfStep;\n}\n\n/**\n * Format a decimal value to a specific number of decimal places\n * Ensures trailing zeros are preserved in the output string\n */\nexport function formatDecimalWithPrecision(value: number, precision: number): string {\n // Handle special case for precision 0\n if (precision === 0) {\n return String(Math.round(value));\n }\n \n // Use toFixed to ensure the right number of decimal places\n return value.toFixed(precision);\n}","// highBoundary() function - Returns the greatest possible value to the specified precision\nimport type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { box, unbox } from '../interpreter/boxing';\nimport { \n isFHIRDate, isFHIRDateTime, isFHIRTime,\n getDateHighBoundary, getDateTimeHighBoundary, getTimeHighBoundary \n} from '../complex-types/temporal';\nimport { getDecimalHighBoundary } from './decimal-boundaries';\nimport { Errors } from '../errors';\n\nexport const highBoundaryEvaluator: FunctionEvaluator = async (input, context, args, evaluator) => {\n // highBoundary() takes optional precision parameter\n if (args.length > 1) {\n throw Errors.wrongArgumentCountRange('highBoundary', 0, 1, args.length);\n }\n \n // Empty input returns empty\n if (input.length === 0) {\n return { value: [], context };\n }\n \n // Multiple items throws error\n if (input.length > 1) {\n throw Errors.singletonRequired('highBoundary', input.length);\n }\n \n const boxedValue = input[0];\n if (!boxedValue) {\n return { value: [], context };\n }\n \n const value = unbox(boxedValue);\n \n // Get precision if provided\n let precision: number | undefined;\n if (args.length === 1) {\n const precisionResult = await evaluator(args[0]!, input, context);\n const precisionArg = precisionResult.value;\n if (precisionArg.length === 0) {\n return { value: [], context };\n }\n if (precisionArg.length > 1) {\n throw Errors.singletonRequired('highBoundary precision', precisionArg.length);\n }\n const precisionValue = unbox(precisionArg[0]!);\n if (typeof precisionValue !== 'number' || !Number.isInteger(precisionValue)) {\n throw Errors.invalidOperandType('highBoundary precision', typeof precisionValue);\n }\n precision = precisionValue;\n }\n \n // Handle Date\n if (isFHIRDate(value)) {\n const result = getDateHighBoundary(value, precision);\n if (!result) {\n return { value: [], context };\n }\n return { value: [box(result, { type: 'Date', singleton: true })], context };\n }\n \n // Handle DateTime\n if (isFHIRDateTime(value)) {\n const result = getDateTimeHighBoundary(value, precision);\n if (!result) {\n return { value: [], context };\n }\n return { value: [box(result, { type: 'DateTime', singleton: true })], context };\n }\n \n // Handle Time\n if (isFHIRTime(value)) {\n const result = getTimeHighBoundary(value, precision);\n if (!result) {\n return { value: [], context };\n }\n return { value: [box(result, { type: 'Time', singleton: true })], context };\n }\n \n // For Decimal/Integer types\n if (typeof value === 'number') {\n const result = getDecimalHighBoundary(value, precision);\n if (result === null) {\n return { value: [], context };\n }\n // Determine the result type based on whether it's an integer or decimal\n const isInteger = Number.isInteger(result);\n return { \n value: [box(result, { type: isInteger ? 'Integer' : 'Decimal', singleton: true })], \n context \n };\n }\n \n // Invalid type returns empty\n return { value: [], context };\n};\n\nexport const highBoundaryFunction: FunctionDefinition & { evaluate: typeof highBoundaryEvaluator } = {\n name: 'highBoundary',\n category: ['utility'],\n description: 'Returns the greatest possible value of the input to the specified precision',\n examples: [\n '@2014.highBoundary(6)',\n '@2014-01-01T08.highBoundary(17)',\n '@T10:30.highBoundary(9)',\n '1.587.highBoundary()',\n '1.587.highBoundary(2)',\n '1.highBoundary(0)'\n ],\n signatures: [\n {\n name: 'highBoundary',\n input: { type: 'Any' as const, singleton: true },\n parameters: [\n { name: 'precision', type: { type: 'Integer' as const, singleton: true }, optional: true }\n ],\n result: { type: 'Any' as const, singleton: true }\n }\n ],\n evaluate: highBoundaryEvaluator\n};","import type { FunctionDefinition, FunctionEvaluator, TypeInfo } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter/runtime-context';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // aggregator expression is required\n if (args.length < 1) {\n throw Errors.invalidOperation('aggregate requires at least one argument (aggregator expression)');\n }\n\n const aggregatorExpr = args[0]!;\n const initExpr = args[1]; // optional init value\n\n // Evaluate init value if provided, otherwise start with empty\n let total: any[];\n if (initExpr) {\n const initResult = await evaluator(initExpr, input, context);\n total = initResult.value;\n } else {\n total = [];\n }\n\n // If input is empty and init is provided, return the init value\n if (input.length === 0 && initExpr) {\n return { value: total, context };\n }\n\n // For each item in the input collection, evaluate the aggregator expression\n for (let index = 0; index < input.length; index++) {\n const item = input[index]!;\n // Create a new context with $this, $index, and $total\n // Note: $this needs unboxed value, but we pass boxed item to evaluator\n const unboxedItem = unbox(item);\n let aggregatorContext = RuntimeContextManager.withIterator(context, unboxedItem, index);\n \n // For the first iteration without init, $total should be empty (not undefined)\n // $total needs to be unboxed values for variable access\n const unboxedTotal = total.map(v => unbox(v));\n aggregatorContext = RuntimeContextManager.setVariable(aggregatorContext, '$total', unboxedTotal);\n\n // Evaluate the aggregator expression\n const result = await evaluator(aggregatorExpr, [item], aggregatorContext);\n \n // Update $total with the result\n total = result.value;\n }\n\n return { value: total, context };\n};\n\nexport const aggregateFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'aggregate',\n doesNotPropagateEmpty: true, // aggregate with init should return init value for empty input\n category: ['aggregates'],\n description: 'Performs general-purpose aggregation by evaluating the aggregator expression for each element of the input collection',\n examples: [\n 'value.aggregate($this + $total, 0)',\n 'value.aggregate(iif($total.empty(), $this, iif($this < $total, $this, $total)))',\n 'value.aggregate($total + $this, 0) / value.count()'\n ],\n signatures: [{\n\n name: 'aggregate',\n input: { type: 'Any', singleton: false },\n parameters: [\n { name: 'aggregator', expression: true, type: { type: 'Any', singleton: false } },\n { name: 'init', expression: true, type: { type: 'Any', singleton: false }, optional: true }\n ],\n result: { type: 'Any', singleton: false }\n }],\n evaluate,\n async inferResultType(analyzer, node, inputType) {\n // If init parameter is provided, use its type to infer result type\n if (node.arguments.length >= 2) {\n const initType = await (analyzer as any).inferType(node.arguments[1]!, inputType);\n // The result type is the same as init type\n return initType;\n }\n // Without init, we can't fully infer the type without running annotation\n // This is a limitation - the actual type will be set during annotateAST\n if (node.arguments.length >= 1) {\n // We could try to infer, but it would require setting up system variables\n // For now, return Any and let annotateAST handle proper typing\n return { type: 'Any', singleton: false };\n }\n // No arguments at all\n return { type: 'Any', singleton: false };\n },\n async analyze(context, args) {\n const diagnostics: any[] = [];\n const itemType = { ...context.inputType, singleton: true };\n\n // Determine $total type: from init (arg[1]) if provided; otherwise from aggregator result after first iteration (approximate with Any)\n let totalType = { type: 'Any', singleton: false } as TypeInfo;\n\n if (args.length >= 2 && args[1]) {\n const initResult = await context\n .withSystemVariable('$this', itemType)\n .withSystemVariable('$index', { type: 'Integer', singleton: true })\n .analyzeNode(args[1]!);\n diagnostics.push(...initResult.diagnostics);\n totalType = initResult.type;\n }\n\n // Analyze aggregator with $this (item) and $total (init or inferred seed)\n if (args.length >= 1 && args[0]) {\n // If we don't have init, seed $total with a heuristic:\n // - If aggregator contains string operations, seed as String\n // - Else seed as item type\n const containsStringHints = (function hasStringHints(node: any): boolean {\n if (!node) return false;\n if (node.type === 'Literal' && typeof node.value === 'string') return true;\n if (node.type === 'Function' && node.name?.type === 'Identifier' && node.name.name === 'toString') return true;\n if (node.children) return node.children.some((c: any) => hasStringHints(c));\n if (node.arguments) return (node.arguments as any[]).some(a => hasStringHints(a));\n if (node.left && node.right) return hasStringHints(node.left) || hasStringHints(node.right);\n if (node.expression) return hasStringHints(node.expression);\n return false;\n })(args[0]);\n\n const seededTotal = (args.length < 2)\n ? (containsStringHints ? { type: 'String', singleton: true } as TypeInfo : itemType)\n : totalType;\n let aggregatorCtx = context\n .withSystemVariable('$this', itemType)\n .withSystemVariable('$index', { type: 'Integer', singleton: true })\n .withSystemVariable('$total', seededTotal);\n\n const firstPass = await aggregatorCtx.analyzeNode(args[0]!);\n diagnostics.push(...firstPass.diagnostics);\n\n // If no init provided, refine $total type to aggregator result and re-analyze aggregator\n if (args.length < 2) {\n aggregatorCtx = aggregatorCtx.withSystemVariable('$total', firstPass.type);\n const secondPass = await aggregatorCtx.analyzeNode(args[0]!);\n diagnostics.push(...secondPass.diagnostics);\n return { type: secondPass.type, diagnostics, context };\n }\n\n return { type: firstPass.type, diagnostics, context };\n }\n\n return { type: context.inputType, diagnostics, context };\n }\n};\n","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // abs() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('abs', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('abs', input.length);\n }\n\n const boxedValue = input[0];\n if (!boxedValue) return { value: [], context };\n const value = unbox(boxedValue);\n\n // Handle different types\n if (typeof value === 'number') {\n const result = Math.abs(value);\n const typeInfo = Number.isInteger(result) ? \n { type: 'Integer' as const, singleton: true } : \n { type: 'Decimal' as const, singleton: true };\n return { value: [box(result, typeInfo)], context };\n }\n\n // Handle Quantity type\n if (value && typeof value === 'object' && 'value' in value && 'unit' in value) {\n const result = {\n value: Math.abs(value.value),\n unit: value.unit,\n ...(value._ucumQuantity && { _ucumQuantity: { ...value._ucumQuantity, value: Math.abs(value._ucumQuantity.value) } })\n };\n return { \n value: [box(result, { type: 'Quantity', singleton: true })], \n context \n };\n }\n\n throw Errors.invalidOperandType('abs', `${typeof value}`);\n};\n\nexport const absFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'abs',\n category: ['math'],\n description: 'Returns the absolute value of the input. When taking the absolute value of a quantity, the unit is unchanged.',\n examples: [\n '(-5).abs()',\n '(-5.5).abs()',\n \"(-5.5 'mg').abs()\"\n ],\n signatures: [\n {\n name: 'abs-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n {\n name: 'abs-decimal',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'abs-quantity',\n input: { type: 'Quantity', singleton: true },\n parameters: [],\n result: { type: 'Quantity', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // ceiling() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('ceiling', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('ceiling', input.length);\n }\n\n const boxedValue = input[0];\n if (!boxedValue) return { value: [], context };\n const value = unbox(boxedValue);\n\n // Must be a number\n if (typeof value !== 'number') {\n throw Errors.invalidOperandType('ceiling', `${typeof value}`);\n }\n\n // Math.ceil can return -0, normalize it to 0\n const result = Math.ceil(value);\n return { value: [box(Object.is(result, -0) ? 0 : result, { type: 'Integer', singleton: true })], context };\n};\n\nexport const ceilingFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'ceiling',\n category: ['math'],\n description: 'Returns the first integer greater than or equal to the input.',\n examples: [\n '1.ceiling()',\n '1.1.ceiling()',\n '(-1.1).ceiling()'\n ],\n signatures: [{\n\n name: 'ceiling',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // floor() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('floor', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('floor', input.length);\n }\n\n const boxedValue = input[0];\n if (!boxedValue) return { value: [], context };\n const value = unbox(boxedValue);\n\n // Must be a number\n if (typeof value !== 'number') {\n throw Errors.invalidOperandType('floor', `${typeof value}`);\n }\n\n return { value: [box(Math.floor(value), { type: 'Integer', singleton: true })], context };\n};\n\nexport const floorFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'floor',\n category: ['math'],\n description: 'Returns the first integer less than or equal to the input.',\n examples: [\n '1.floor()',\n '2.1.floor()',\n '(-2.1).floor()'\n ],\n signatures: [{\n\n name: 'floor',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // round() takes 0 or 1 argument (precision)\n if (args.length > 1) {\n throw Errors.wrongArgumentCountRange('round', 0, 1, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('round', input.length);\n }\n\n const boxedValue = input[0];\n if (!boxedValue) return { value: [], context };\n const value = unbox(boxedValue);\n\n // Must be a number\n if (typeof value !== 'number') {\n throw Errors.invalidOperandType('round', `${typeof value}`);\n }\n\n // Get precision if provided\n let precision = 0;\n if (args.length === 1) {\n const precisionResult = await evaluator(args[0]!, input, context);\n if (precisionResult.value.length === 0) {\n return { value: [], context };\n }\n if (precisionResult.value.length > 1) {\n throw Errors.invalidOperation('round precision must be a single value');\n }\n const boxedPrecision = precisionResult.value[0];\n if (!boxedPrecision) {\n return { value: [], context };\n }\n precision = unbox(boxedPrecision);\n if (!Number.isInteger(precision) || precision < 0) {\n throw Errors.invalidOperation('round precision must be a non-negative integer');\n }\n }\n\n // Round to specified precision\n // FHIRPath uses \"traditional round\" where 0.5 rounds away from zero\n const multiplier = Math.pow(10, precision);\n const scaled = value * multiplier;\n \n let rounded: number;\n if (scaled >= 0) {\n rounded = Math.floor(scaled + 0.5);\n } else {\n rounded = Math.ceil(scaled - 0.5);\n }\n \n const result = rounded / multiplier;\n \n // If precision is 0 and result is a whole number, return as integer\n if (precision === 0 && Number.isInteger(result)) {\n return { value: [box(result, { type: 'Integer', singleton: true })], context };\n }\n \n return { value: [box(result, { type: 'Decimal', singleton: true })], context };\n};\n\nexport const roundFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'round',\n category: ['math'],\n description: 'Rounds the decimal to the nearest whole number using a traditional round (i.e. 0.5 or higher will round to 1). If specified, the precision argument determines the decimal place at which the rounding will occur.',\n examples: [\n '1.round()',\n '3.14159.round(3)'\n ],\n signatures: [{\n\n name: 'round',\n input: { type: 'Decimal', singleton: true },\n parameters: [\n { name: 'precision', type: { type: 'Integer', singleton: true }, optional: true }\n ],\n result: { type: 'Decimal', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // truncate() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('truncate', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('truncate', input.length);\n }\n\n const boxedValue = input[0];\n if (!boxedValue) return { value: [], context };\n const value = unbox(boxedValue);\n\n // Must be a number\n if (typeof value !== 'number') {\n throw Errors.invalidOperandType('truncate', `${typeof value}`);\n }\n\n // Math.trunc removes decimal part (towards zero)\n return { value: [box(Math.trunc(value), { type: 'Integer', singleton: true })], context };\n};\n\nexport const truncateFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'truncate',\n category: ['math'],\n description: 'Returns the integer portion of the input.',\n examples: [\n '101.truncate()',\n '1.00000001.truncate()',\n '(-1.56).truncate()'\n ],\n signatures: [{\n\n name: 'truncate',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // sqrt() takes no arguments\n if (args.length !== 0) {\n throw Errors.wrongArgumentCount('sqrt', 0, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('sqrt', input.length);\n }\n\n const boxedValue = input[0];\n if (!boxedValue) return { value: [], context };\n const value = unbox(boxedValue);\n\n // Must be a number\n if (typeof value !== 'number') {\n throw Errors.invalidOperandType('sqrt', `${typeof value}`);\n }\n\n // If negative, return empty (cannot represent square root of negative)\n if (value < 0) {\n return { value: [], context };\n }\n\n return { value: [box(Math.sqrt(value), { type: 'Decimal', singleton: true })], context };\n};\n\nexport const sqrtFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'sqrt',\n category: ['math'],\n description: 'Returns the square root of the input number as a Decimal.',\n examples: [\n '81.sqrt()',\n '(-1).sqrt()'\n ],\n signatures: [\n {\n name: 'sqrt-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'sqrt-decimal',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n }\n ],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../interpreter/boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n // power() takes exactly one argument (exponent)\n if (args.length !== 1) {\n throw Errors.wrongArgumentCount('power', 1, args.length);\n }\n\n // If input is empty, return empty\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // If input has multiple items, error\n if (input.length > 1) {\n throw Errors.singletonRequired('power', input.length);\n }\n\n const boxedBase = input[0];\n if (!boxedBase) {\n return { value: [], context };\n }\n \n const base = unbox(boxedBase);\n\n // Base must be a number\n if (typeof base !== 'number') {\n throw Errors.invalidOperandType('power', `${typeof base}`);\n }\n\n // Evaluate exponent\n const exponentResult = await evaluator(args[0]!, input, context);\n if (exponentResult.value.length === 0) {\n return { value: [], context };\n }\n if (exponentResult.value.length > 1) {\n throw Errors.invalidOperation('power exponent must be a single value');\n }\n\n const boxedExponent = exponentResult.value[0];\n if (!boxedExponent) {\n return { value: [], context };\n }\n \n const exponent = unbox(boxedExponent);\n if (typeof exponent !== 'number') {\n throw Errors.invalidOperation('power exponent must be a number');\n }\n\n // Calculate power\n const result = Math.pow(base, exponent);\n\n // Check if result is valid (not NaN)\n if (isNaN(result)) {\n // Power cannot be represented (e.g., (-1)^0.5)\n return { value: [], context };\n }\n\n // If both inputs are integers and result is a whole number, return as integer\n if (Number.isInteger(base) && Number.isInteger(exponent) && Number.isInteger(result)) {\n return { value: [box(result, { type: 'Integer', singleton: true })], context };\n }\n\n return { value: [box(result, { type: 'Decimal', singleton: true })], context };\n};\n\nexport const powerFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'power',\n category: ['math'],\n description: 'Raises a number to the exponent power. If this function is used with Integers, the result is an Integer. If the function is used with Decimals, the result is a Decimal.',\n examples: [\n '2.power(3)',\n '2.5.power(2)',\n '(-1).power(0.5)'\n ],\n signatures: [\n {\n name: 'power-integer',\n input: { type: 'Integer', singleton: true },\n parameters: [\n { name: 'exponent', type: { type: 'Integer', singleton: true }, optional: false }\n ],\n result: { type: 'Integer', singleton: true }\n },\n {\n name: 'power-decimal',\n input: { type: 'Decimal', singleton: true },\n parameters: [\n { name: 'exponent', type: { type: 'Decimal', singleton: true }, optional: false }\n ],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'power-integer-decimal',\n input: { type: 'Integer', singleton: true },\n parameters: [\n { name: 'exponent', type: { type: 'Decimal', singleton: true }, optional: false }\n ],\n result: { type: 'Decimal', singleton: true }\n },\n {\n name: 'power-decimal-integer',\n input: { type: 'Decimal', singleton: true },\n parameters: [\n { name: 'exponent', type: { type: 'Integer', singleton: true }, optional: false }\n ],\n result: { type: 'Decimal', singleton: true }\n }\n ],\n evaluate\n};","import { Lexer, TokenType, Channel } from './lexer';\nimport type { Token, LexerOptions } from './lexer';\nimport { registry } from './registry';\nimport { NodeType } from './types';\nimport {\n createCursorOperatorNode,\n createCursorIdentifierNode,\n createCursorArgumentNode,\n createCursorIndexNode,\n createCursorTypeNode,\n} from './parser/cursor-nodes';\nimport type {\n Position,\n Range,\n BaseASTNode,\n ASTNode,\n IdentifierNode,\n LiteralNode,\n TemporalLiteralNode,\n BinaryNode,\n UnaryNode,\n FunctionNode,\n VariableNode,\n IndexNode,\n MembershipTestNode,\n TypeCastNode,\n CollectionNode,\n TypeReferenceNode,\n QuantityNode,\n ErrorNode,\n TriviaInfo,\n ParseResult,\n ParseError\n} from './types';\nimport { Errors } from './errors';\nimport { parseTemporalLiteral } from './complex-types/temporal';\nimport { augment } from './analyzer/augmentor';\nimport { findNodeAtPosition, getCompletions as lspGetCompletions, getExpectedTokens as lspGetExpectedTokens } from './analyzer/cursor-services';\nimport { computeTriviaSpans } from './analyzer/trivia-indexer';\n\n// Re-export types for backward compatibility\nexport {\n NodeType,\n type Position,\n type BaseASTNode,\n type Range,\n type ASTNode,\n type IdentifierNode,\n type LiteralNode,\n type TemporalLiteralNode,\n type BinaryNode,\n type UnaryNode,\n type FunctionNode,\n type VariableNode,\n type IndexNode,\n type MembershipTestNode,\n type TypeCastNode,\n type CollectionNode,\n type TypeReferenceNode,\n type QuantityNode,\n type ErrorNode,\n type TriviaInfo,\n type ParseResult,\n type ParseError\n} from './types';\nexport { pprint } from './utils/pprint';\n\n// Parser options\nexport interface ParserOptions {\n mode?: 'simple' | 'lsp'; // Default: 'simple'\n preserveTrivia?: boolean; // Auto-enabled in LSP mode\n buildIndexes?: boolean; // Auto-enabled in LSP mode\n errorRecovery?: boolean; // Auto-enabled in LSP mode\n partialParse?: { // For partial parsing\n cursorPosition: number;\n };\n cursorPosition?: number; // Cursor position for LSP support\n}\n\nexport class Parser {\n protected lexer: Lexer;\n protected tokens: Token[] = [];\n protected current = 0;\n private mode: 'simple' | 'lsp';\n private options: ParserOptions;\n private preserveTriviaEffective = false;\n private errors?: ParseError[];\n private input: string;\n // Trivia and token indexes for LSP mode with trivia preservation\n private leadingTriviaByTokenStart?: Map<number, TriviaInfo[]>;\n private trailingTriviaByTokenEnd?: Map<number, TriviaInfo[]>;\n private tokenByStart?: Map<number, Token>;\n private tokenByEnd?: Map<number, Token>;\n \n // Synchronization tokens for error recovery\n private readonly synchronizationTokens = new Set([\n TokenType.COMMA,\n TokenType.RPAREN,\n TokenType.RBRACE,\n TokenType.RBRACKET,\n TokenType.EOF\n ]);\n \n constructor(input: string, options: ParserOptions = {}) {\n const mode = options.mode || 'simple';\n const lexerOptions: LexerOptions = {\n trackPosition: true,\n preserveTrivia: mode === 'lsp' ? true : (options.preserveTrivia ?? false)\n };\n this.preserveTriviaEffective = !!lexerOptions.preserveTrivia;\n \n this.lexer = new Lexer(input, lexerOptions);\n this.tokens = this.lexer.tokenize();\n \n // If preserving trivia, capture leading/trailing trivia spans before filtering\n if (this.preserveTriviaEffective) {\n const spans = computeTriviaSpans(this.tokens);\n this.leadingTriviaByTokenStart = spans.leadingByStart;\n this.trailingTriviaByTokenEnd = spans.trailingByEnd;\n this.tokenByStart = spans.tokenByStart;\n this.tokenByEnd = spans.tokenByEnd;\n // Then filter hidden-channel tokens out for parsing\n this.tokens = this.tokens.filter(token => token.channel === undefined || token.channel === Channel.DEFAULT);\n }\n \n // Make mode/options/input available before cursor injection decisions\n this.input = input;\n this.mode = mode;\n this.options = options;\n\n // Inject cursor token if cursor position is provided\n if (options.cursorPosition !== undefined) {\n this.tokens = this.injectCursorToken(this.tokens, options.cursorPosition);\n }\n \n // Initialize LSP features only if needed\n if (this.mode === 'lsp') {\n this.errors = [];\n // indexes are now built by the augmentor\n }\n }\n\n // removed unused checkCursor(); cursor handling is contextual in parse methods\n \n private injectCursorToken(tokens: Token[], cursorPosition: number): Token[] {\n // Find the position to inject the cursor token\n let insertIndex = 0;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (!token) continue;\n\n // Skip EOF token\n if (token.type === TokenType.EOF) {\n break;\n }\n\n // Check if cursor is before this token\n if (cursorPosition <= token.start) {\n insertIndex = i;\n break;\n }\n\n // Check if cursor is within this token (we ignore mid-token cursors)\n if (cursorPosition > token.start && cursorPosition < token.end) {\n // Only materialize mid-token cursor in LSP mode; otherwise ignore\n if (this.mode === 'lsp') {\n insertIndex = i;\n break;\n } else {\n return tokens;\n }\n }\n\n // Cursor is after this token\n insertIndex = i + 1;\n }\n\n // Create cursor token\n const cursorToken: Token = {\n type: TokenType.CURSOR,\n value: '',\n start: cursorPosition,\n end: cursorPosition,\n line: 1,\n column: cursorPosition + 1,\n range: {\n start: { line: 0, character: cursorPosition, offset: cursorPosition },\n end: { line: 0, character: cursorPosition, offset: cursorPosition }\n }\n };\n\n // Insert cursor token\n const result = [...tokens];\n result.splice(insertIndex, 0, cursorToken);\n\n return result;\n }\n\n private getRangeFromToken(token: Token): Range {\n return token.range || {\n start: { line: 0, character: 0, offset: token.start },\n end: { line: 0, character: 0, offset: token.end }\n };\n }\n \n private getRangeFromTokens(startToken: Token, endToken: Token): Range {\n const start = startToken.range?.start || { line: 0, character: 0, offset: startToken.start };\n const end = endToken.range?.end || { line: 0, character: 0, offset: endToken.end };\n return { start, end };\n }\n \n private getRangeFromNodes(startNode: ASTNode, endNode: ASTNode): Range {\n return {\n start: startNode.range.start,\n end: endNode.range.end\n };\n }\n\n parse(): ParseResult {\n if (this.mode === 'simple') {\n return this.parseSimple();\n } else {\n return this.parseLSP();\n }\n }\n \n private parseSimple(): ParseResult {\n const errors: ParseError[] = [];\n let ast: ASTNode;\n \n try {\n ast = this.expression();\n if (!this.isAtEnd()) {\n const token = this.peek();\n throw Errors.unexpectedToken(token.value || TokenType[token.type], this.getRangeFromToken(token));\n }\n } catch (error) {\n // In simple mode, we still collect the error but also throw\n if (error instanceof Error) {\n const token = this.peek();\n errors.push({\n message: error.message,\n position: {\n line: token.line || 0,\n character: token.column || 0,\n offset: token.start\n },\n range: this.getRangeFromToken(token),\n token\n });\n throw error; // Re-throw for backward compatibility\n }\n throw error;\n }\n \n return {\n ast,\n errors\n };\n }\n \n private parseLSP(): ParseResult {\n // Clear indexes for fresh parse\n this.errors = [];\n // indexes will be built by augmentor\n \n let ast: ASTNode;\n \n try {\n ast = this.expression();\n \n if (!this.isAtEnd()) {\n const token = this.peek();\n this.addError(Errors.unexpectedToken(token.value || TokenType[token.type], this.getRangeFromToken(token)).message, token);\n }\n \n // No transform here; augmentor handles cursor-specific transforms\n } catch (error) {\n // In LSP mode, create error node on fatal errors\n if (error instanceof Error) {\n ast = this.createErrorNode(error.message, this.peek());\n } else {\n ast = this.createErrorNode('Parse failed', this.peek());\n }\n }\n \n // Augment AST for LSP consumers\n const aug = augment(ast, {\n input: this.input,\n preserveTrivia: this.preserveTriviaEffective,\n trivia: this.preserveTriviaEffective ? {\n leadingByStart: this.leadingTriviaByTokenStart,\n trailingByEnd: this.trailingTriviaByTokenEnd,\n } : undefined,\n cursorPosition: this.options.cursorPosition,\n });\n\n const result: ParseResult = {\n ast: aug.ast,\n errors: this.errors!,\n indexes: aug.indexes,\n };\n \n // Add cursor context if partial parsing\n if (this.options.partialParse) {\n const nodeAtCursor = findNodeAtPosition(aug.ast, this.options.partialParse.cursorPosition);\n result.cursorContext = {\n node: nodeAtCursor,\n expectedTokens: lspGetExpectedTokens(nodeAtCursor),\n availableCompletions: lspGetCompletions(nodeAtCursor, aug.indexes.identifiers)\n };\n }\n \n return result;\n }\n\n // Trivia population moved to augmentor\n \n // Shared expression parsing with precedence climbing\n protected expression(): ASTNode {\n return this.parseExpressionWithPrecedence(0);\n }\n \n protected parseExpressionWithPrecedence(minPrecedence: number): ASTNode {\n let left = this.parsePrimary();\n\n // Inline isAtEnd() and peek() for hot path\n while (this.current < this.tokens.length) {\n const token = this.tokens[this.current];\n if (!token || token.type === TokenType.EOF) break;\n \n // Check for cursor between expressions (expecting operator)\n if (token.type === TokenType.CURSOR) {\n this.advance();\n // Create a partial binary node to preserve left context\n const cursorNode = createCursorOperatorNode(token.start) as any;\n return this.createBinaryNode(token, left, cursorNode);\n }\n \n // Check for postfix operations that don't have precedence requirements\n if (token.type === TokenType.LBRACKET) {\n // Array indexing - always binds tightly\n this.current++; // inline advance()\n // Check for cursor in indexer\n if (this.peek().type === TokenType.CURSOR) {\n if (this.mode === 'lsp') {\n const cursorTok = this.advance();\n const cursorIndex = createCursorIndexNode(cursorTok.start) as any;\n this.consume(TokenType.RBRACKET, \"Expected ']'\");\n left = this.createIndexNode(left, cursorIndex, token);\n } else {\n this.advance();\n left = createCursorIndexNode(this.previous().start) as any;\n }\n } else {\n const index = this.expression();\n this.consume(TokenType.RBRACKET, \"Expected ']'\");\n left = this.createIndexNode(left, index, token);\n }\n continue;\n }\n \n if (token.type === TokenType.LPAREN && this.isFunctionCall(left)) {\n // Function calls - always bind tightly, handled via shared helper\n left = this.parseFunctionCall(left);\n continue;\n }\n \n // Get operator value for precedence check\n let operator: string | undefined;\n let precedence = 0;\n \n if (token.type === TokenType.DOT) {\n operator = '.';\n precedence = registry.getPrecedence(operator);\n } else if (token.type === TokenType.OPERATOR) {\n operator = token.value;\n precedence = registry.getPrecedence(operator);\n } else if (token.type === TokenType.IDENTIFIER) {\n // Check if it's a keyword operator\n if (registry.isKeywordOperator(token.value)) {\n operator = token.value;\n precedence = registry.getPrecedence(operator);\n }\n }\n \n if (precedence < minPrecedence) break;\n\n if (token.type === TokenType.DOT) {\n this.current++; // inline advance()\n const right = this.parseInvocation();\n left = this.createBinaryNode(token, left, right);\n } else if (token.type === TokenType.IDENTIFIER && token.value === 'is') {\n this.current++; // inline advance()\n // Check for cursor after 'is'\n if (this.peek().type === TokenType.CURSOR) {\n this.advance();\n left = createCursorTypeNode(this.previous().start, 'is') as any;\n } else {\n const typeName = this.parseTypeName();\n left = this.createMembershipTestNode(left, typeName, token);\n }\n } else if (token.type === TokenType.IDENTIFIER && token.value === 'as') {\n this.current++; // inline advance()\n // Check for cursor after 'as'\n if (this.peek().type === TokenType.CURSOR) {\n this.advance();\n left = createCursorTypeNode(this.previous().start, 'as') as any;\n } else {\n const typeName = this.parseTypeName();\n left = this.createTypeCastNode(left, typeName, token);\n }\n } else if (operator && registry.isBinaryOperator(operator)) {\n this.current++; // inline advance()\n const associativity = registry.getAssociativity(operator);\n const nextMinPrecedence = associativity === 'left' ? precedence + 1 : precedence;\n const right = this.parseExpressionWithPrecedence(nextMinPrecedence);\n \n left = this.createBinaryNode(token, left, right);\n } else {\n break;\n }\n }\n\n return left;\n }\n \n protected parsePrimary(): ASTNode {\n // Inline peek() for hot path\n const token = this.current < this.tokens.length ? this.tokens[this.current]! : { type: TokenType.EOF, value: '', start: 0, end: 0, line: 1, column: 1 };\n\n // Handle cursor at expression start\n if (token.type === TokenType.CURSOR) {\n this.advance();\n return createCursorOperatorNode(token.start) as any;\n }\n\n // Quantity literal emitted by lexer\n if (token.type === TokenType.QUANTITY) {\n this.current++;\n const raw = token.value;\n const quoteIdx = raw.indexOf(\"'\");\n const numberPart = quoteIdx >= 0 ? raw.slice(0, quoteIdx).trim() : raw;\n const unitPart = quoteIdx >= 0 ? raw.slice(quoteIdx) : '';\n const numberValue = Number(numberPart);\n const unit = unitPart ? this.parseStringValue(unitPart) : '';\n return this.createQuantityNode(numberValue, unit, token, token);\n }\n\n if (token.type === TokenType.NUMBER) {\n this.current++; // inline advance()\n const numberValue = parseFloat(token.value);\n \n // Check if next token is a string (quantity unit)\n const nextToken = this.peek();\n if (nextToken.type === TokenType.STRING) {\n this.advance();\n const unit = this.parseStringValue(nextToken.value);\n return this.createQuantityNode(numberValue, unit, token, nextToken);\n }\n \n // Check if next token is a calendar duration identifier\n if (nextToken.type === TokenType.IDENTIFIER) {\n const calendarUnits = ['year', 'years', 'month', 'months', 'week', 'weeks', \n 'day', 'days', 'hour', 'hours', 'minute', 'minutes', \n 'second', 'seconds', 'millisecond', 'milliseconds'];\n if (calendarUnits.includes(nextToken.value)) {\n this.advance();\n return this.createQuantityNode(numberValue, nextToken.value, token, nextToken);\n }\n }\n \n return this.createLiteralNode(numberValue, 'number', token);\n }\n\n if (token.type === TokenType.STRING) {\n this.current++; // inline advance()\n const value = this.parseStringValue(token.value);\n return this.createLiteralNode(value, 'string', token);\n }\n\n if (token.type === TokenType.IDENTIFIER && (token.value === 'true' || token.value === 'false')) {\n this.advance();\n return this.createLiteralNode(token.value === 'true', 'boolean', token);\n }\n\n if (token.type === TokenType.IDENTIFIER && token.value === 'null') {\n this.advance();\n return this.createLiteralNode(null, 'null', token);\n }\n\n if (token.type === TokenType.DATE) {\n this.advance();\n const value = token.value.substring(1); // Remove @\n return this.createTemporalLiteralNode(value, 'date', token);\n }\n\n if (token.type === TokenType.DATETIME) {\n this.advance();\n const value = token.value.substring(1); // Remove @\n return this.createTemporalLiteralNode(value, 'datetime', token);\n }\n\n if (token.type === TokenType.TIME) {\n this.advance();\n const value = token.value.substring(1); // Remove @\n return this.createTemporalLiteralNode(value, 'time', token);\n }\n\n if (token.type === TokenType.SPECIAL_IDENTIFIER) {\n this.advance();\n return this.createVariableNode(token.value, token);\n }\n\n if (token.type === TokenType.ENVIRONMENT_VARIABLE) {\n this.advance();\n return this.createVariableNode(token.value, token);\n }\n\n if (token.type === TokenType.IDENTIFIER && token.value === 'not') {\n this.advance();\n const operand = this.parseExpressionWithPrecedence(registry.getPrecedence('not'));\n return this.createUnaryNode(token, operand);\n }\n\n if (token.type === TokenType.IDENTIFIER) {\n // If cursor is exactly at end of identifier and no whitespace at cursor, treat as identifier context\n if (this.options.cursorPosition !== undefined && this.options.cursorPosition === token.end) {\n const ch = this.input[this.options.cursorPosition];\n const isWs = ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' || ch === undefined;\n if (!isWs) {\n this.advance();\n return createCursorIdentifierNode(this.options.cursorPosition, token.value) as any;\n }\n }\n this.advance();\n const name = this.parseIdentifierValue(token.value);\n return this.createIdentifierNode(name, token);\n }\n\n if (token.type === TokenType.LPAREN) {\n this.advance();\n const expr = this.expression();\n this.consume(TokenType.RPAREN, \"Expected ')'\");\n return expr;\n }\n\n if (token.type === TokenType.LBRACE) {\n this.advance();\n const elements = this.parseCollectionElements();\n this.consume(TokenType.RBRACE, \"Expected '}'\");\n return this.createCollectionNode(elements, token);\n }\n\n // Handle unary operators\n if (token.type === TokenType.OPERATOR && (token.value === '+' || token.value === '-')) {\n this.advance();\n const operand = this.parseExpressionWithPrecedence(registry.getPrecedence('*'));\n return this.createUnaryNode(token, operand);\n }\n\n const tokenStr = token.value || TokenType[token.type];\n const range = this.getRangeFromToken(token);\n const error = Errors.unexpectedToken(tokenStr, range);\n return this.handleAstError(error.message, token);\n }\n \n protected parseInvocation(): ASTNode {\n const token = this.peek();\n \n // Handle cursor after dot\n if (token.type === TokenType.CURSOR) {\n this.advance();\n return createCursorIdentifierNode(token.start) as any;\n }\n \n // Allow identifiers and keywords that can be used as member names\n if (token.type === TokenType.IDENTIFIER) {\n // Check for cursor at the end of an identifier\n if (this.options.cursorPosition !== undefined && this.options.cursorPosition === token.end) {\n this.advance();\n return createCursorIdentifierNode(this.options.cursorPosition, token.value) as any;\n }\n\n this.advance();\n const name = this.parseIdentifierValue(token.value);\n const node = this.createIdentifierNode(name, token);\n \n // Check if this is a function call\n if (this.check(TokenType.LPAREN)) {\n return this.parseFunctionCall(node);\n }\n \n return node;\n }\n \n // Allow environment variables after dot (like .%resource)\n if (token.type === TokenType.ENVIRONMENT_VARIABLE) {\n this.advance();\n return this.createVariableNode(token.value, token);\n }\n\n const tokenStr = token.value || TokenType[token.type];\n const range = this.getRangeFromToken(token);\n const error = Errors.expectedIdentifier('.', tokenStr, range);\n return this.handleAstError(error.message, token);\n }\n \n protected parseArgumentList(functionName?: string): ASTNode[] {\n const args: ASTNode[] = [];\n \n // Check for cursor at start of arguments\n if (this.peek().type === TokenType.CURSOR) {\n this.advance();\n const fn = functionName ?? '';\n args.push(createCursorArgumentNode(this.previous().start, fn, 0) as any);\n return args;\n }\n \n if (this.peek().type === TokenType.RPAREN) {\n return args;\n }\n\n args.push(this.expression());\n \n while (this.match(TokenType.COMMA)) {\n // Check for cursor after comma\n if (this.peek().type === TokenType.CURSOR) {\n this.advance();\n const fn = functionName ?? '';\n args.push(createCursorArgumentNode(this.previous().start, fn, args.length) as any);\n return args;\n }\n args.push(this.expression());\n }\n\n return args;\n }\n \n // Shared function-call parser for both standalone and dotted calls\n protected parseFunctionCall(nameNode: ASTNode): ASTNode {\n // Current token is '(' per caller contract\n this.advance();\n const fnName = (nameNode as any)?.name && (typeof (nameNode as any).name === 'string')\n ? (nameNode as any).name as string\n : undefined;\n const args = this.parseArgumentList(fnName);\n this.consume(TokenType.RPAREN, \"Expected ')'\");\n return this.createFunctionNode(nameNode, args);\n }\n \n protected parseCollectionElements(): ASTNode[] {\n const elements: ASTNode[] = [];\n \n if (this.peek().type === TokenType.RBRACE) {\n return elements; // Empty collection {} is valid\n }\n\n // Any other token is an error - braces can only contain empty collections\n const unexpectedToken = this.peek();\n const message = `Unexpected token '${unexpectedToken.value}', expected '}'. Braces can only be used for empty collections. Use parentheses and pipe operators for non-empty collections: (1 | 2 | 3)`;\n return this.handleAstError(message, unexpectedToken) as any;\n }\n \n protected parseTypeName(): string {\n const token = this.advance();\n if (token.type !== TokenType.IDENTIFIER) {\n const tokenStr = token.value || TokenType[token.type];\n const range = this.getRangeFromToken(token);\n const error = Errors.expectedTypeName(tokenStr, range);\n if (this.mode === 'lsp' && this.options.errorRecovery) {\n this.reportError(error.message, token);\n return '';\n }\n this.throwSyntax(error.message, token);\n return '';\n }\n return this.parseIdentifierValue(token.value);\n }\n \n protected parseStringValue(raw: string): string {\n // Remove quotes and handle escape sequences\n const content = raw.slice(1, -1);\n return content.replace(/\\\\(.)/g, (_, char) => {\n switch (char) {\n case 'n': return '\\n';\n case 'r': return '\\r';\n case 't': return '\\t';\n case 'f': return '\\f';\n case '\\\\': return '\\\\';\n case \"'\": return \"'\";\n case '\"': return '\"';\n case '`': return '`';\n case '/': return '/';\n default: return char;\n }\n });\n }\n \n protected parseIdentifierValue(raw: string): string {\n if (raw.startsWith('`')) {\n // Delimited identifier - remove backticks and handle escapes\n return raw.slice(1, -1).replace(/\\\\(.)/g, '$1');\n }\n return raw;\n }\n \n // Shared utility methods\n protected isFunctionCall(node: ASTNode): boolean {\n return (node as any).type === NodeType.Identifier;\n }\n \n // removed unused: isBinaryOperatorToken, isKeywordAllowedAsMember, isKeywordAllowedAsIdentifier\n \n // Helper methods\n protected peek(): Token {\n return this.tokens[this.current] || { type: TokenType.EOF, value: '', start: 0, end: 0, line: 1, column: 1 };\n }\n \n protected previous(): Token {\n return this.tokens[this.current - 1] || { type: TokenType.EOF, value: '', start: 0, end: 0, line: 1, column: 1 };\n }\n \n protected isAtEnd(): boolean {\n return this.current >= this.tokens.length || this.peek().type === TokenType.EOF;\n }\n \n protected advance(): Token {\n if (!this.isAtEnd()) this.current++;\n return this.previous();\n }\n \n protected check(type: TokenType): boolean {\n if (this.isAtEnd()) return false;\n return this.peek().type === type;\n }\n \n protected match(...types: TokenType[]): boolean {\n for (const type of types) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n }\n return false;\n }\n \n protected consume(type: TokenType, message: string): Token {\n if (this.check(type)) {\n return this.advance();\n }\n // If we are in recovery mode (LSP + errorRecovery), report and return a synthetic token\n if (this.mode === 'lsp' && this.options.errorRecovery) {\n const tok = this.peek();\n this.reportError(message, tok);\n // Create a zero-width synthetic token of the expected type at the current position\n const pos = this.isAtEnd() ? this.input.length : tok.start;\n const synthetic: Token = {\n type,\n value: '',\n start: pos,\n end: pos,\n line: tok?.line ?? 0,\n column: tok?.column ?? 0,\n range: {\n start: { line: 0, character: pos, offset: pos },\n end: { line: 0, character: pos, offset: pos }\n }\n } as Token;\n return synthetic;\n }\n // Be lenient when cursor is provided and we're at EOF (legacy behavior for simple mode cursor tests)\n if (this.options.cursorPosition !== undefined && this.isAtEnd()) {\n const pos = this.input.length;\n const synthetic: Token = {\n type,\n value: '',\n start: pos,\n end: pos,\n line: 0,\n column: 0,\n range: {\n start: { line: 0, character: pos, offset: pos },\n end: { line: 0, character: pos, offset: pos }\n }\n } as Token;\n return synthetic;\n }\n // Simple mode: throw\n this.throwSyntax(message, this.peek());\n }\n\n // Implement node creation methods\n protected createIdentifierNode(name: string, token: Token): ASTNode {\n const range = this.getRangeFromToken(token);\n const node: ASTNode = {\n type: NodeType.Identifier,\n name,\n range\n } as any;\n return node;\n }\n\n protected createLiteralNode(value: any, valueType: LiteralNode['valueType'], token: Token): LiteralNode {\n const node: LiteralNode = {\n type: NodeType.Literal,\n value,\n valueType,\n range: this.getRangeFromToken(token)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createTemporalLiteralNode(rawValue: string, valueType: TemporalLiteralNode['valueType'], token: Token): TemporalLiteralNode {\n // Parse temporal value immediately\n const temporalValue = parseTemporalLiteral('@' + rawValue);\n \n const node: TemporalLiteralNode = {\n type: NodeType.TemporalLiteral,\n value: temporalValue,\n valueType,\n rawValue,\n range: this.getRangeFromToken(token)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createBinaryNode(token: Token, left: ASTNode, right: ASTNode): BinaryNode {\n const node: BinaryNode = {\n type: NodeType.Binary,\n operator: token.value,\n left,\n right,\n range: this.getRangeFromNodes(left, right)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createUnaryNode(token: Token, operand: ASTNode): UnaryNode {\n const startPos = token.range?.start || { line: 0, character: 0, offset: token.start };\n const node: UnaryNode = {\n type: NodeType.Unary,\n operator: token.value,\n operand,\n range: { start: startPos, end: operand.range.end }\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createFunctionNode(name: ASTNode, args: ASTNode[]): FunctionNode {\n const endNode = args.length > 0 ? args[args.length - 1]! : name;\n const node: FunctionNode = {\n type: NodeType.Function,\n name,\n arguments: args,\n range: this.getRangeFromNodes(name, endNode)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createVariableNode(name: string, token: Token): VariableNode {\n const node: VariableNode = {\n type: NodeType.Variable,\n name,\n range: this.getRangeFromToken(token)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createIndexNode(expression: ASTNode, index: ASTNode, startToken: Token): IndexNode {\n const node: IndexNode = {\n type: NodeType.Index,\n expression,\n index,\n range: this.getRangeFromNodes(expression, index)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n\n protected createMembershipTestNode(expression: ASTNode, targetType: string, startToken: Token): MembershipTestNode {\n // The range should extend from expression start to the end of the type name\n const endToken = this.previous(); // Should be the type identifier\n const node: MembershipTestNode = {\n type: NodeType.MembershipTest,\n expression,\n targetType,\n range: { start: expression.range.start, end: this.getRangeFromToken(endToken).end }\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createTypeCastNode(expression: ASTNode, targetType: string, startToken: Token): TypeCastNode {\n // The range should extend from expression start to the end of the type name\n const endToken = this.previous(); // Should be the type identifier\n const node: TypeCastNode = {\n type: NodeType.TypeCast,\n expression,\n targetType,\n range: { start: expression.range.start, end: this.getRangeFromToken(endToken).end }\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createCollectionNode(elements: ASTNode[], startToken: Token): CollectionNode {\n const endToken = this.previous(); // Should be RBRACE\n const node: CollectionNode = {\n type: NodeType.Collection,\n elements,\n range: this.getRangeFromTokens(startToken, endToken)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n protected createQuantityNode(value: number, unit: string, startToken: Token, endToken: Token): QuantityNode {\n const node: QuantityNode = {\n type: NodeType.Quantity,\n value,\n unit,\n range: this.getRangeFromTokens(startToken, endToken)\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n\n // AST-level error handler: returns an ErrorNode in recovery, throws in simple mode\n protected handleAstError(message: string, token?: Token): ErrorNode {\n if (this.mode === 'lsp' && this.options.errorRecovery) {\n this.reportError(message, token);\n // Attempt to synchronize so the parse can continue\n this.synchronize();\n return this.createErrorNode(message, token);\n }\n this.throwSyntax(message, token);\n }\n\n // Record an error (LSP path)\n private reportError(message: string, token?: Token): void {\n this.addError(message, token);\n }\n\n // Throw a syntax error (simple mode path)\n private throwSyntax(message: string, token?: Token): never {\n const range = token ? this.getRangeFromToken(token) : undefined;\n if (message.includes('Unexpected token:')) {\n const tokenMatch = message.match(/Unexpected token: (.+)/);\n const tokenValue = tokenMatch?.[1] ?? 'unknown';\n throw Errors.unexpectedToken(tokenValue, range);\n }\n throw Errors.invalidSyntax(message, range);\n }\n \n // LSP enrichment moved to augmentor\n \n private createErrorNode(message: string, token?: Token): ErrorNode {\n const range = token ? this.getRangeFromToken(token) : {\n start: { line: 0, character: 0, offset: 0 },\n end: { line: 0, character: 0, offset: 0 }\n };\n \n const node: ErrorNode = {\n type: 'Error',\n message,\n range\n };\n \n // LSP enrichment handled by augmentor\n \n return node;\n }\n \n private addError(message: string, token?: Token): void {\n if (!this.errors) return;\n \n const position = token ? {\n line: token.line || 0,\n character: token.column || 0,\n offset: token.start\n } : { line: 0, character: 0, offset: 0 };\n \n const error: ParseError = {\n message,\n position,\n token\n };\n \n if (token) {\n error.range = this.getRangeFromToken(token);\n }\n \n this.errors.push(error);\n }\n \n private synchronize(): void {\n // Skip tokens until we find a synchronization point\n while (!this.isAtEnd()) {\n if (this.synchronizationTokens.has(this.peek().type)) {\n return;\n }\n this.advance();\n }\n }\n \n // Cursor-specific transforms moved to augmentor\n // Cursor services moved to lsp/cursor-services\n}\n\nexport function parse(input: string, options?: ParserOptions): ParseResult {\n const parser = new Parser(input, options);\n return parser.parse();\n}\n\n/**\n * Pretty print AST in Lisp style\n * @param node - The AST node to print\n * @param indent - Current indentation level\n * @returns Lisp-style string representation\n */\n// moved to src/utils/pprint\n","import type { BaseASTNode } from '../types';\n\nexport enum CursorContext {\n Operator = 'operator',\n Identifier = 'identifier',\n Argument = 'argument',\n Index = 'index',\n Type = 'type',\n}\n\nexport interface CursorNode extends BaseASTNode {\n type: 'CursorNode';\n context: CursorContext;\n position: number;\n}\n\nexport interface CursorOperatorNode extends CursorNode {\n context: CursorContext.Operator;\n}\n\nexport interface CursorIdentifierNode extends CursorNode {\n context: CursorContext.Identifier;\n partialText?: string;\n}\n\nexport interface CursorArgumentNode extends CursorNode {\n context: CursorContext.Argument;\n functionName: string;\n argumentIndex: number;\n}\n\nexport interface CursorIndexNode extends CursorNode {\n context: CursorContext.Index;\n}\n\nexport interface CursorTypeNode extends CursorNode {\n context: CursorContext.Type;\n typeOperator: 'is' | 'as' | 'ofType';\n partialText?: string;\n}\n\nexport type AnyCursorNode = \n | CursorOperatorNode\n | CursorIdentifierNode\n | CursorArgumentNode\n | CursorIndexNode\n | CursorTypeNode;\n\nexport function isCursorNode(node: any): node is CursorNode {\n return node && node.type === 'CursorNode';\n}\n\nexport function createCursorOperatorNode(position: number): CursorOperatorNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Operator,\n position,\n range: { start: point, end: point },\n };\n}\n\nexport function createCursorIdentifierNode(position: number, partialText?: string): CursorIdentifierNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Identifier,\n position,\n partialText,\n range: { start: point, end: point },\n };\n}\n\nexport function createCursorArgumentNode(\n position: number,\n functionName: string,\n argumentIndex: number\n): CursorArgumentNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Argument,\n position,\n functionName,\n argumentIndex,\n range: { start: point, end: point },\n };\n}\n\nexport function createCursorIndexNode(position: number): CursorIndexNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Index,\n position,\n range: { start: point, end: point },\n };\n}\n\nexport function createCursorTypeNode(\n position: number,\n typeOperator: 'is' | 'as' | 'ofType',\n partialText?: string\n): CursorTypeNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Type,\n position,\n typeOperator,\n partialText,\n range: { start: point, end: point },\n };\n}","import { NodeType } from '../types';\nimport type { ASTNode, BinaryNode, UnaryNode, FunctionNode, IndexNode, CollectionNode, MembershipTestNode, TypeCastNode, TypeReferenceNode, QuantityNode } from '../types';\nimport type { TriviaInfo } from '../types';\nimport type { AnyCursorNode } from '../parser/cursor-nodes';\nimport { isCursorNode, createCursorTypeNode } from '../parser/cursor-nodes';\n\nexport interface AugmentationIndexes {\n nodeById: Map<string, ASTNode>;\n nodesByType: Map<NodeType | 'Error' | 'CursorNode', ASTNode[]>;\n identifiers: Map<string, ASTNode[]>;\n}\n\nexport interface AugmentationOptions {\n input: string;\n preserveTrivia?: boolean;\n trivia?: {\n leadingByStart?: Map<number, TriviaInfo[]>;\n trailingByEnd?: Map<number, TriviaInfo[]>;\n };\n cursorPosition?: number;\n}\n\nexport interface AugmentationResult {\n ast: ASTNode;\n indexes: AugmentationIndexes;\n}\n\nexport function augment(ast: ASTNode, opts: AugmentationOptions): AugmentationResult {\n const indexes: AugmentationIndexes = {\n nodeById: new Map(),\n nodesByType: new Map(),\n identifiers: new Map(),\n };\n let nodeIdCounter = 0;\n\n function enrich(node: ASTNode, parent?: ASTNode): void {\n (node as any).id = `node_${nodeIdCounter++}`;\n const start = node.range.start.offset ?? 0;\n const end = node.range.end.offset ?? start;\n (node as any).raw = opts.input.substring(start, end);\n if (opts.preserveTrivia && opts.trivia) {\n const s = node.range.start.offset ?? -1;\n const e = node.range.end.offset ?? -1;\n (node as any).leadingTrivia = opts.trivia.leadingByStart?.get(s) ?? [];\n (node as any).trailingTrivia = opts.trivia.trailingByEnd?.get(e) ?? [];\n }\n if (parent) {\n (node as any).parent = parent;\n }\n indexes.nodeById.set((node as any).id, node);\n const bucket = indexes.nodesByType.get(node.type) || [];\n bucket.push(node);\n indexes.nodesByType.set(node.type, bucket);\n if ((node as any).type === NodeType.Identifier) {\n const name = (node as any).name as string;\n const arr = indexes.identifiers.get(name) || [];\n arr.push(node);\n indexes.identifiers.set(name, arr);\n }\n }\n\n function visit(node: ASTNode, parent?: ASTNode): void {\n enrich(node, parent);\n switch (node.type) {\n case NodeType.Binary: {\n const bin = node as BinaryNode;\n (node as any).children = [bin.left, bin.right];\n visit(bin.left, node);\n visit(bin.right, node);\n break;\n }\n case NodeType.Unary: {\n const un = node as UnaryNode;\n (node as any).children = [un.operand];\n visit(un.operand, node);\n break;\n }\n case NodeType.Function: {\n const fn = node as FunctionNode;\n (node as any).children = [fn.name, ...fn.arguments];\n visit(fn.name, node);\n for (const arg of fn.arguments) visit(arg, node);\n break;\n }\n case NodeType.Index: {\n const idx = node as IndexNode;\n (node as any).children = [idx.expression, idx.index];\n visit(idx.expression, node);\n visit(idx.index, node);\n break;\n }\n case NodeType.Collection: {\n const coll = node as CollectionNode;\n (node as any).children = [...coll.elements];\n for (const el of coll.elements) visit(el, node);\n break;\n }\n case NodeType.MembershipTest: {\n const mt = node as MembershipTestNode;\n (node as any).children = [mt.expression];\n visit(mt.expression, node);\n break;\n }\n case NodeType.TypeCast: {\n const tc = node as TypeCastNode;\n (node as any).children = [tc.expression];\n visit(tc.expression, node);\n break;\n }\n default:\n break;\n }\n }\n\n // First pass: enrich and index\n visit(ast);\n\n // Cursor-specific transform for ofType arguments\n if (opts.cursorPosition !== undefined) {\n const cursorPos = opts.cursorPosition;\n function transform(node: ASTNode): ASTNode {\n switch (node.type) {\n case NodeType.Binary: {\n const binary = node as BinaryNode;\n if (binary.right.type === NodeType.Function) {\n const func = binary.right as FunctionNode;\n if ((func.name as any).name === 'ofType') {\n func.arguments = func.arguments.map((arg) => {\n if (isCursorNode(arg)) {\n const cursorNode = arg as AnyCursorNode;\n return createCursorTypeNode(cursorNode.position, 'ofType') as any;\n }\n if (arg.type === NodeType.Binary) {\n const binaryArg = arg as BinaryNode;\n if (isCursorNode(binaryArg.right)) {\n const cursorNode = binaryArg.right as AnyCursorNode;\n let partialText: string | undefined;\n if (binaryArg.left.type === NodeType.Identifier) {\n partialText = (binaryArg.left as any).name;\n }\n return createCursorTypeNode(cursorNode.position, 'ofType', partialText) as any;\n }\n }\n // New: identifier immediately before cursor inside ofType\n if ((arg.type === NodeType.Identifier) && (arg as any).range?.end?.offset === cursorPos) {\n const name = (arg as any).name as string | undefined;\n return createCursorTypeNode(cursorPos, 'ofType', name) as any;\n }\n return arg;\n });\n }\n binary.left = transform(binary.left);\n } else {\n binary.left = transform(binary.left);\n binary.right = transform(binary.right);\n }\n break;\n }\n case NodeType.Function: {\n const func = node as FunctionNode;\n if ((func.name as any).name === 'ofType') {\n func.arguments = func.arguments.map((arg) => {\n if (isCursorNode(arg)) {\n const cursorNode = arg as AnyCursorNode;\n return createCursorTypeNode(cursorNode.position, 'ofType') as any;\n }\n if (arg.type === NodeType.Binary) {\n const binaryArg = arg as BinaryNode;\n if (isCursorNode(binaryArg.right)) {\n const cursorNode = binaryArg.right as AnyCursorNode;\n let partialText: string | undefined;\n if (binaryArg.left.type === NodeType.Identifier) {\n partialText = (binaryArg.left as any).name;\n }\n return createCursorTypeNode(cursorNode.position, 'ofType', partialText) as any;\n }\n }\n // New: identifier immediately before cursor inside ofType\n if ((arg.type === NodeType.Identifier) && (arg as any).range?.end?.offset === cursorPos) {\n const name = (arg as any).name as string | undefined;\n return createCursorTypeNode(cursorPos, 'ofType', name) as any;\n }\n return arg;\n });\n // If we still have a cursor type node without partial text, try to infer from source between '(' and cursor\n if (func.arguments.length >= 1) {\n const firstArg = func.arguments[0] as any;\n if (isCursorNode(firstArg) && (firstArg as any).context === 'type' && (firstArg as any).partialText == null) {\n const nameEnd = (func.name as any).range?.end?.offset ?? -1;\n const start = nameEnd + 1; // after '('\n const end = (firstArg as any).position ?? start;\n if (start >= 0 && end >= start) {\n const slice = opts.input.slice(start, end).trim();\n const m = slice.match(/[A-Za-z][A-Za-z0-9.]*$/);\n const inferred = m ? m[0] : undefined;\n if (inferred && inferred.length > 0) {\n func.arguments[0] = createCursorTypeNode(end, 'ofType', inferred) as any;\n }\n }\n }\n }\n } else {\n func.arguments = func.arguments.map(arg => transform(arg));\n }\n break;\n }\n case NodeType.Unary: {\n const unary = node as UnaryNode;\n unary.operand = transform(unary.operand);\n break;\n }\n case NodeType.Index: {\n const idx = node as IndexNode;\n idx.expression = transform(idx.expression);\n idx.index = transform(idx.index);\n break;\n }\n case NodeType.Collection: {\n const coll = node as CollectionNode;\n coll.elements = coll.elements.map(el => transform(el));\n break;\n }\n case NodeType.MembershipTest: {\n const mt = node as MembershipTestNode;\n mt.expression = transform(mt.expression);\n break;\n }\n case NodeType.TypeCast: {\n const tc = node as TypeCastNode;\n tc.expression = transform(tc.expression);\n break;\n }\n }\n return node;\n }\n transform(ast);\n }\n\n return { ast, indexes };\n}\n\n// (legacy transform function removed; handled inline above)\n","import { TokenType } from '../lexer';\nimport { NodeType } from '../types';\nimport type { ASTNode, IdentifierNode, BinaryNode, UnaryNode, FunctionNode, IndexNode, MembershipTestNode, TypeCastNode } from '../types';\n\nexport function findNodeAtPosition(root: ASTNode, offset: number): ASTNode | null {\n if (offset < root.range.start.offset! || offset > root.range.end.offset!) {\n return null;\n }\n if ('children' in root && Array.isArray((root as any).children)) {\n for (const child of (root as any).children as ASTNode[]) {\n const found = findNodeAtPosition(child, offset);\n if (found) return found;\n }\n }\n switch (root.type) {\n case NodeType.Binary: {\n const bin = root as BinaryNode;\n return findNodeAtPosition(bin.left, offset) || findNodeAtPosition(bin.right, offset) || root;\n }\n case NodeType.Unary: {\n const un = root as UnaryNode;\n return findNodeAtPosition(un.operand, offset) || root;\n }\n case NodeType.Function: {\n const fn = root as FunctionNode;\n const nameRes = findNodeAtPosition(fn.name, offset);\n if (nameRes) return nameRes;\n for (const arg of fn.arguments) {\n const argRes = findNodeAtPosition(arg, offset);\n if (argRes) return argRes;\n }\n return root;\n }\n default:\n return root;\n }\n}\n\nexport function getExpectedTokens(node: ASTNode | null): TokenType[] {\n if (!node) return getExpectedTokensForError();\n switch (node.type) {\n case NodeType.Binary:\n return [TokenType.DOT, TokenType.LBRACKET];\n case NodeType.Identifier:\n return [TokenType.DOT, TokenType.LPAREN, TokenType.LBRACKET];\n default:\n return getExpectedTokensForError();\n }\n}\n\nexport function getExpectedTokensForError(): TokenType[] {\n return [\n TokenType.EOF,\n TokenType.DOT,\n TokenType.LBRACKET,\n TokenType.LPAREN,\n TokenType.OPERATOR,\n TokenType.IDENTIFIER,\n ];\n}\n\nexport function getCompletions(node: ASTNode | null, identifiers?: Map<string, ASTNode[]>): string[] {\n if (!node) return [];\n const completions: string[] = [];\n if (identifiers) {\n for (const name of Array.from(identifiers.keys())) {\n completions.push(name);\n }\n }\n completions.push(\n 'where', 'select', 'first', 'last', 'tail',\n 'skip', 'take', 'count', 'empty', 'exists'\n );\n return completions;\n}\n","import { Channel, TokenType } from '../lexer';\nimport type { Token } from '../lexer';\nimport type { TriviaInfo } from '../types';\n\nexport interface TriviaSpans {\n leadingByStart: Map<number, TriviaInfo[]>;\n trailingByEnd: Map<number, TriviaInfo[]>;\n tokenByStart: Map<number, Token>;\n tokenByEnd: Map<number, Token>;\n}\n\nexport function computeTriviaSpans(allTokens: Token[]): TriviaSpans {\n const leadingByStart = new Map<number, TriviaInfo[]>();\n const trailingByEnd = new Map<number, TriviaInfo[]>();\n const tokenByStart = new Map<number, Token>();\n const tokenByEnd = new Map<number, Token>();\n\n let acc: TriviaInfo[] = [];\n let lastDefault: Token | undefined;\n\n const toTrivia = (token: Token): TriviaInfo | null => {\n const range = token.range || {\n start: { line: 0, character: 0, offset: token.start },\n end: { line: 0, character: 0, offset: token.end }\n };\n if (token.type === TokenType.WHITESPACE) {\n return { type: 'whitespace', value: token.value, range };\n }\n if (token.type === TokenType.LINE_COMMENT) {\n return { type: 'lineComment', value: token.value, range };\n }\n if (token.type === TokenType.BLOCK_COMMENT) {\n return { type: 'comment', value: token.value, range };\n }\n return null;\n };\n\n for (const tok of allTokens) {\n const isHidden = tok.channel === Channel.HIDDEN;\n if (isHidden) {\n const trivia = toTrivia(tok);\n if (trivia) acc.push(trivia);\n continue;\n }\n const accCopy = acc.length ? acc.slice() : [];\n if (lastDefault) {\n trailingByEnd.set(lastDefault.end, accCopy);\n }\n leadingByStart.set(tok.start, accCopy);\n tokenByStart.set(tok.start, tok);\n tokenByEnd.set(tok.end, tok);\n acc = [];\n lastDefault = tok;\n }\n\n return { leadingByStart, trailingByEnd, tokenByStart, tokenByEnd };\n}\n\n","import { NodeType } from '../types';\nimport type {\n ASTNode,\n IdentifierNode,\n LiteralNode,\n UnaryNode,\n BinaryNode,\n FunctionNode,\n IndexNode,\n MembershipTestNode,\n TypeCastNode,\n CollectionNode,\n TypeReferenceNode,\n QuantityNode,\n} from '../types';\n\nexport function pprint(node: ASTNode, indent: number = 0): string {\n const spaces = ' '.repeat(indent);\n\n switch (node.type) {\n case NodeType.Literal: {\n const lit = node as LiteralNode;\n if (lit.valueType === 'string') {\n return `\"${lit.value}\"`;\n } else if (lit.valueType === 'null') {\n return 'null';\n }\n return String(lit.value);\n }\n\n case NodeType.Identifier: {\n const id = node as IdentifierNode;\n return id.name;\n }\n\n case NodeType.Variable: {\n return (node as any).name;\n }\n\n case NodeType.Binary: {\n const bin = node as BinaryNode;\n const op = bin.operator;\n\n const leftStr = pprint(bin.left, 0);\n const rightStr = pprint(bin.right, 0);\n\n if (leftStr.length + rightStr.length + op.length + 4 < 60 &&\n !leftStr.includes('\\n') && !rightStr.includes('\\n')) {\n return `(${op} ${leftStr} ${rightStr})`;\n }\n\n return `(${op}\\n${spaces} ${pprint(bin.left, indent + 2)}\\n${spaces} ${pprint(bin.right, indent + 2)})`;\n }\n\n case NodeType.Unary: {\n const un = node as UnaryNode;\n const operandStr = pprint(un.operand, 0);\n\n if (operandStr.length < 40 && !operandStr.includes('\\n')) {\n return `(${un.operator} ${operandStr})`;\n }\n\n return `(${un.operator}\\n${spaces} ${pprint(un.operand, indent + 2)})`;\n }\n\n case NodeType.Function: {\n const fn = node as FunctionNode;\n const nameStr = pprint(fn.name, 0);\n\n if (fn.arguments.length === 0) {\n return `(${nameStr})`;\n }\n\n const argStrs = fn.arguments.map(arg => pprint(arg, 0));\n const totalLen = nameStr.length + argStrs.reduce((sum, s) => sum + s.length + 1, 0) + 2;\n\n if (totalLen < 60 && argStrs.every(s => !s.includes('\\n'))) {\n return `(${nameStr} ${argStrs.join(' ')})`;\n }\n\n const argLines = fn.arguments.map(arg => `${spaces} ${pprint(arg, indent + 2)}`);\n return `(${nameStr}\\n${argLines.join('\\n')})`;\n }\n\n case NodeType.Index: {\n const idx = node as IndexNode;\n const exprStr = pprint(idx.expression, 0);\n const indexStr = pprint(idx.index, 0);\n\n if (exprStr.length + indexStr.length < 50 &&\n !exprStr.includes('\\n') && !indexStr.includes('\\n')) {\n return `([] ${exprStr} ${indexStr})`;\n }\n\n return `([]\\n${spaces} ${pprint(idx.expression, indent + 2)}\\n${spaces} ${pprint(idx.index, indent + 2)})`;\n }\n\n case NodeType.MembershipTest: {\n const mt = node as MembershipTestNode;\n const exprStr = pprint(mt.expression, 0);\n\n if (exprStr.length + mt.targetType.length < 50 && !exprStr.includes('\\n')) {\n return `(is ${exprStr} ${mt.targetType})`;\n }\n\n return `(is\\n${spaces} ${pprint(mt.expression, indent + 2)}\\n${spaces} ${mt.targetType})`;\n }\n\n case NodeType.TypeCast: {\n const tc = node as TypeCastNode;\n const exprStr = pprint(tc.expression, 0);\n\n if (exprStr.length + tc.targetType.length < 50 && !exprStr.includes('\\n')) {\n return `(as ${exprStr} ${tc.targetType})`;\n }\n\n return `(as\\n${spaces} ${pprint(tc.expression, indent + 2)}\\n${spaces} ${tc.targetType})`;\n }\n\n case NodeType.Collection: {\n const coll = node as CollectionNode;\n\n if (coll.elements.length === 0) {\n return '{}';\n }\n\n const elemStrs = coll.elements.map(e => pprint(e, 0));\n const totalLen = elemStrs.reduce((sum, s) => sum + s.length + 1, 2);\n\n if (totalLen < 60 && elemStrs.every(s => !s.includes('\\n'))) {\n return `{${elemStrs.join(' ')}}`;\n }\n\n const elemLines = coll.elements.map(e => `${spaces} ${pprint(e, indent + 2)}`);\n return `{\\n${elemLines.join('\\n')}\\n${spaces}}`;\n }\n\n case NodeType.TypeReference: {\n const tr = node as TypeReferenceNode;\n return `Type[${tr.typeName}]`;\n }\n\n case NodeType.Quantity: {\n const q = node as QuantityNode;\n return `${q.value} '${q.unit}'`;\n }\n\n default:\n return `<unknown:${(node as any).type}>`;\n }\n}\n","import type {\n ASTNode,\n LiteralNode,\n IdentifierNode,\n BinaryNode,\n UnaryNode,\n FunctionNode,\n VariableNode,\n CollectionNode,\n IndexNode,\n MembershipTestNode,\n TypeCastNode,\n QuantityNode\n} from './types';\nimport { NodeType } from './types';\nimport { Registry } from './registry';\nimport * as operations from './operations';\nimport type { EvaluationResult, FunctionEvaluator, NodeEvaluator, OperationEvaluator, RuntimeContext, TypeInfo } from './types';\nimport { createQuantity } from './complex-types/quantity-value';\nimport { box, unbox, ensureBoxed, type FHIRPathValue } from './interpreter/boxing';\nimport { Errors } from './errors';\nimport { detectChoiceValues, getPrimitiveElement, maybeParseTemporal, reboxResource } from './interpreter/navigator';\nimport { RuntimeContextManager } from './interpreter/runtime-context';\nimport { Analyzer } from './analyzer';\nimport { DiagnosticSeverity } from './types';\nimport { FHIRPathError, ErrorCodes } from './errors';\nimport { toTemporalString } from './complex-types/temporal';\n\n/**\n * Runtime context manager that provides efficient prototype-based context operations\n * for both interpreter and compiler.\n */\n// RuntimeContextManager moved to './runtime-context'\n\nexport class Interpreter {\n private registry: Registry;\n private nodeEvaluators: Record<NodeType, NodeEvaluator>;\n private operationEvaluators: Map<string, OperationEvaluator>;\n private functionEvaluators: Map<string, FunctionEvaluator>;\n private modelProvider?: import('./types').ModelProvider<any>;\n\n constructor(registry?: Registry, modelProvider?: import('./types').ModelProvider<any>) {\n this.registry = registry || new Registry();\n this.modelProvider = modelProvider;\n this.operationEvaluators = new Map();\n this.functionEvaluators = new Map();\n \n // Initialize node evaluators using object dispatch pattern\n this.nodeEvaluators = {\n [NodeType.Literal]: this.evaluateLiteral.bind(this),\n [NodeType.TemporalLiteral]: this.evaluateTemporalLiteral.bind(this),\n [NodeType.Identifier]: this.evaluateIdentifier.bind(this),\n [NodeType.Binary]: this.evaluateBinary.bind(this),\n [NodeType.Unary]: this.evaluateUnary.bind(this),\n [NodeType.Function]: this.evaluateFunction.bind(this),\n [NodeType.Variable]: this.evaluateVariable.bind(this),\n [NodeType.Collection]: this.evaluateCollection.bind(this),\n [NodeType.Index]: this.evaluateIndex.bind(this),\n [NodeType.MembershipTest]: this.evaluateMembershipTest.bind(this),\n [NodeType.TypeCast]: this.evaluateTypeCast.bind(this),\n [NodeType.Quantity]: this.evaluateQuantity.bind(this),\n [NodeType.EOF]: async () => ({ value: [], context: {} as RuntimeContext }),\n [NodeType.TypeReference]: async () => ({ value: [], context: {} as RuntimeContext })\n };\n\n // Register operation evaluators\n this.registerOperationEvaluators();\n }\n\n private registerOperationEvaluators(): void {\n // Register evaluators from operations modules\n for (const [name, operation] of Object.entries(operations)) {\n if (typeof operation === 'object' && 'evaluate' in operation) {\n if ('symbol' in operation) {\n // It's an operator\n // Skip unary operators here - they're handled differently\n if (name === 'unaryMinusOperator' || name === 'unaryPlusOperator') {\n continue;\n }\n this.operationEvaluators.set(operation.symbol, operation.evaluate);\n } else if ('signatures' in operation && !('symbol' in operation)) {\n // It's a function\n this.functionEvaluators.set(operation.name, operation.evaluate);\n }\n }\n }\n }\n\n // Main evaluate method\n async evaluate(node: ASTNode, input: any[] = [], context?: RuntimeContext): Promise<EvaluationResult> {\n // Initialize context if not provided\n if (!context) {\n context = this.createInitialContext(input);\n }\n\n // Ensure input is always an array\n if (!Array.isArray(input)) {\n input = input === null || input === undefined ? [] : [input];\n }\n\n // Box the initial input values\n const boxedInput = input.map(value => ensureBoxed(value));\n\n // Set current node in context\n const contextWithNode = RuntimeContextManager.copy(context);\n contextWithNode.currentNode = node;\n\n // Dispatch to appropriate evaluator\n const evaluator = this.nodeEvaluators[node.type];\n if (!evaluator) {\n throw Errors.unknownNodeType(node.type);\n }\n\n return await evaluator(node, boxedInput, contextWithNode);\n }\n\n private createInitialContext(input: any[]): RuntimeContext {\n const context = RuntimeContextManager.create(input);\n // Set $this to initial input\n context.variables['$this'] = input;\n // Add model provider if available\n if (this.modelProvider) {\n context.modelProvider = this.modelProvider;\n }\n return context;\n }\n\n /**\n * Parse, analyze and evaluate a FHIRPath expression with optional\n * model provider, variables and input type. Returns unboxed values\n * with temporal values formatted as FHIRPath literals.\n */\n async evaluateExpression(\n expression: string,\n options: {\n input?: unknown;\n variables?: Record<string, unknown>;\n inputType?: TypeInfo;\n modelProvider?: import('./types').ModelProvider;\n now?: Date;\n } = {}\n ): Promise<any[]> {\n // Analyze expression first (ensures type info and diagnostics)\n const analysis = await Analyzer.analyzeExpression(expression, {\n variables: options.variables,\n modelProvider: options.modelProvider ?? this.modelProvider,\n inputType: options.inputType,\n errorRecovery: false,\n });\n\n const errors = analysis.diagnostics.filter(d => d.severity === DiagnosticSeverity.Error);\n if (errors.length > 0) {\n const first = errors[0]!;\n const code = typeof first.code === 'string' && first.code.length > 0 ? first.code : ErrorCodes.INVALID_OPERATION;\n throw new FHIRPathError(code, first.message, first.range);\n }\n\n // Bootstrap runtime context and boxed input\n const { context, input } = await RuntimeContextManager.bootstrapContext(options.input, {\n modelProvider: options.modelProvider ?? this.modelProvider,\n variables: options.variables,\n now: options.now,\n });\n\n // Evaluate using analyzed AST and BOXED input\n const result = await this.evaluate(analysis.ast, input as any[], context);\n\n // Unbox and format temporal outputs for API parity\n return result.value.map((boxedValue) => {\n const value = unbox(boxedValue);\n if (value && typeof value === 'object' && 'kind' in value) {\n if ((value as any).kind === 'FHIRDate' || (value as any).kind === 'FHIRDateTime') {\n return '@' + toTemporalString(value as any);\n } else if ((value as any).kind === 'FHIRTime') {\n return '@T' + toTemporalString(value as any);\n }\n }\n return value;\n });\n }\n\n // Helper: classify a boolean operand for short-circuit decisions\n private getBooleanKind(values: FHIRPathValue[]): 'empty' | 'true' | 'false' | 'other' {\n if (values.length === 0) {\n return 'empty';\n }\n const v = unbox(values[0]!);\n if (v === true) {\n return 'true';\n }\n if (v === false) {\n return 'false';\n }\n return 'other';\n }\n\n private boxBoolean(b: boolean): FHIRPathValue {\n return box(b, { type: 'Boolean', singleton: true });\n }\n\n // TemporalLiteral node evaluator\n private async evaluateTemporalLiteral(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const temporal = node as import('./types').TemporalLiteralNode;\n \n // The value is already parsed in the parser\n let typeInfo: import('./types').TypeInfo;\n \n if (temporal.valueType === 'date') {\n typeInfo = { type: 'Date', singleton: true };\n } else if (temporal.valueType === 'datetime') {\n typeInfo = { type: 'DateTime', singleton: true };\n } else {\n typeInfo = { type: 'Time', singleton: true };\n }\n \n return {\n value: [box(temporal.value, typeInfo)],\n context\n };\n }\n\n // Literal node evaluator\n private async evaluateLiteral(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const literal = node as LiteralNode;\n \n // Box the literal value with appropriate type info\n let typeInfo: import('./types').TypeInfo | undefined;\n let value: any = literal.value;\n \n // Handle temporal literals (backwards compatibility - should not reach here with new parser)\n if (literal.valueType === 'date' || literal.valueType === 'datetime' || literal.valueType === 'time') {\n // Import temporal parsing function\n const { parseTemporalLiteral } = await import('./complex-types/temporal');\n // Parse the temporal literal (add @ back since it was stripped by parser)\n const temporalValue = parseTemporalLiteral('@' + literal.value);\n \n // Set appropriate type info\n if (literal.valueType === 'date') {\n typeInfo = { type: 'Date', singleton: true };\n } else if (literal.valueType === 'datetime') {\n typeInfo = { type: 'DateTime', singleton: true };\n } else if (literal.valueType === 'time') {\n typeInfo = { type: 'Time', singleton: true };\n }\n \n value = temporalValue;\n } else if (typeof value === 'string') {\n typeInfo = { type: 'String', singleton: true };\n } else if (typeof value === 'number') {\n typeInfo = Number.isInteger(value) ? \n { type: 'Integer', singleton: true } : \n { type: 'Decimal', singleton: true };\n } else if (typeof value === 'boolean') {\n typeInfo = { type: 'Boolean', singleton: true };\n }\n \n return {\n value: [box(value, typeInfo)],\n context\n };\n }\n\n // Helper: Handle extension elements\n private handleExtension(\n boxedItem: FHIRPathValue, \n nodeTypeInfo?: TypeInfo\n ): FHIRPathValue[] {\n const results: FHIRPathValue[] = [];\n if (boxedItem.primitiveElement?.extension) {\n for (const ext of boxedItem.primitiveElement.extension) {\n results.push(box(ext, nodeTypeInfo || { type: 'Any', singleton: false }));\n }\n }\n return results;\n }\n\n // Helper: Handle FHIR choice types (e.g., value[x])\n private async handleChoiceTypes(\n item: object,\n name: string,\n context: RuntimeContext\n ): Promise<FHIRPathValue[]> {\n const results: FHIRPathValue[] = [];\n const choiceHits = await detectChoiceValues(item as Record<string, unknown>, name, context.modelProvider);\n for (const hit of choiceHits) {\n results.push(box(hit.value, hit.typeInfo, hit.primitiveElement));\n }\n return results;\n }\n\n // Helper: Handle union type choices\n private handleUnionChoices(\n item: object,\n nodeTypeInfo?: TypeInfo\n ): FHIRPathValue[] {\n const results: FHIRPathValue[] = [];\n if (\n nodeTypeInfo?.modelContext &&\n typeof nodeTypeInfo.modelContext === 'object' &&\n 'isUnion' in nodeTypeInfo.modelContext &&\n (nodeTypeInfo.modelContext as any).isUnion &&\n 'choices' in nodeTypeInfo.modelContext &&\n Array.isArray((nodeTypeInfo.modelContext as any).choices)\n ) {\n for (const choice of (nodeTypeInfo.modelContext as any).choices) {\n const choiceName = choice.choiceName;\n if (choiceName && choiceName in (item as any)) {\n const value = (item as any)[choiceName];\n const primitiveElement = getPrimitiveElement(item as Record<string, unknown>, choiceName);\n const choiceTypeInfo = { type: choice.type, singleton: !Array.isArray(value), modelContext: choice } as any;\n if (Array.isArray(value)) {\n for (const v of value) {\n results.push(box(v, { ...choiceTypeInfo, singleton: true }, primitiveElement));\n }\n } else if (value !== null && value !== undefined) {\n results.push(box(value, choiceTypeInfo, primitiveElement));\n }\n }\n }\n }\n return results;\n }\n\n // Helper: Handle standard property access\n private async handleStandardProperty(\n item: object,\n name: string,\n nodeTypeInfo: TypeInfo | undefined,\n context: RuntimeContext\n ): Promise<FHIRPathValue[]> {\n const results: FHIRPathValue[] = [];\n if (name in (item as any)) {\n const value = (item as any)[name];\n const primitiveElement = getPrimitiveElement(item as Record<string, unknown>, name);\n\n if (Array.isArray(value)) {\n const elementTypeInfo = nodeTypeInfo ? { ...nodeTypeInfo, singleton: true } : undefined;\n for (const v of value) {\n if (\n v && typeof v === 'object' && 'resourceType' in (v as any) && typeof (v as any).resourceType === 'string'\n ) {\n // Always re-box FHIR resources to get proper type information from ModelProvider\n const boxed = await reboxResource(v, true, context.modelProvider);\n results.push(boxed);\n } else {\n const val = await maybeParseTemporal(v, elementTypeInfo, context.modelProvider);\n results.push(box(val, elementTypeInfo, primitiveElement));\n }\n }\n } else if (value !== null && value !== undefined) {\n if (\n value && typeof value === 'object' && 'resourceType' in (value as any) && typeof (value as any).resourceType === 'string'\n ) {\n // Always re-box FHIR resources to get proper type information from ModelProvider\n const boxed = await reboxResource(value, true, context.modelProvider);\n results.push(boxed);\n } else {\n const val = await maybeParseTemporal(value, nodeTypeInfo, context.modelProvider);\n results.push(box(val, nodeTypeInfo, primitiveElement));\n }\n }\n }\n return results;\n }\n\n // Identifier node evaluator\n private async evaluateIdentifier(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const identifier = node as IdentifierNode;\n const name = identifier.name;\n const nodeTypeInfo = node.typeInfo;\n const results: FHIRPathValue[] = [];\n\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n\n // 1. Handle extension special case\n if (name === 'extension') {\n results.push(...this.handleExtension(boxedItem, nodeTypeInfo));\n continue;\n }\n\n // Process only objects\n if (item && typeof item === 'object') {\n // 2. Handle FHIR choice types (e.g., value[x])\n const choiceResults = await this.handleChoiceTypes(item, name, context);\n if (choiceResults.length > 0) {\n results.push(...choiceResults);\n continue;\n }\n\n // 3. Handle union type choices\n const unionResults = this.handleUnionChoices(item, nodeTypeInfo);\n results.push(...unionResults);\n\n // 4. Handle standard property access\n const propertyResults = await this.handleStandardProperty(item, name, nodeTypeInfo, context);\n results.push(...propertyResults);\n }\n }\n\n // If no properties matched, try type-filter fallback on resources\n if (results.length === 0) {\n const filtered: FHIRPathValue[] = [];\n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n if (item && typeof item === 'object' && (item as any).resourceType === name) {\n if (context.modelProvider) {\n const typeInfo = await context.modelProvider.getType(name);\n if (typeInfo) {\n filtered.push(box(item, { ...typeInfo, singleton: true }));\n } else {\n filtered.push(boxedItem);\n }\n } else {\n filtered.push(boxedItem);\n }\n }\n }\n if (filtered.length > 0) {\n return { value: filtered, context };\n }\n }\n\n return { value: results, context };\n }\n\n // Binary operator evaluator\n private async evaluateBinary(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const binary = node as BinaryNode;\n const operator = binary.operator;\n\n // Special handling for dot operator (sequential pipeline)\n if (operator === '.') {\n // Evaluate left with current input/context\n const leftResult = await this.evaluate(binary.left, input, context);\n \n // Use left's output as right's input, and left's context flows to right\n return await this.evaluate(binary.right, leftResult.value, leftResult.context);\n }\n\n // Special handling for union operator (each side gets fresh context from original)\n if (operator === '|') {\n // Each side of union should have its own variable scope\n // Variables defined on left side should not be visible on right side\n // Evaluate both sides in parallel since both use the same input/context\n const [leftResult, rightResult] = await Promise.all([\n this.evaluate(binary.left, input, context),\n this.evaluate(binary.right, input, context)\n ]);\n \n // Merge the results\n const unionEvaluator = this.operationEvaluators.get('|');\n if (unionEvaluator) {\n return await unionEvaluator(input, context, leftResult.value, rightResult.value);\n }\n // If union evaluator not found, surface a clear error\n throw Errors.noEvaluatorFound('binary operator', '|');\n }\n\n // Get operation evaluator\n const evaluator = this.operationEvaluators.get(operator);\n if (evaluator) {\n // Short-circuit for logical operators when possible\n if (operator === 'and' || operator === 'or' || operator === 'implies') {\n const leftResult = await this.evaluate(binary.left, input, context);\n const kind = this.getBooleanKind(leftResult.value);\n\n if (operator === 'and') {\n // false and _ -> false (short-circuit)\n if (kind === 'false') {\n return { value: [this.boxBoolean(false)], context };\n }\n // true and y -> y; empty and false -> false handled by evaluator; need right\n const rightResult = await this.evaluate(binary.right, input, context);\n const operatorDef = this.registry.getOperatorDefinition(operator);\n if (operatorDef && !operatorDef.doesNotPropagateEmpty) {\n if (leftResult.value.length === 0 || rightResult.value.length === 0) {\n return { value: [], context };\n }\n }\n return await evaluator(input, context, leftResult.value, rightResult.value);\n }\n\n if (operator === 'or') {\n // true or _ -> true (short-circuit)\n if (kind === 'true') {\n return { value: [this.boxBoolean(true)], context };\n }\n // false or y -> y; empty or true -> true handled by evaluator; need right\n const rightResult = await this.evaluate(binary.right, input, context);\n const operatorDef = this.registry.getOperatorDefinition(operator);\n if (operatorDef && !operatorDef.doesNotPropagateEmpty) {\n if (leftResult.value.length === 0 || rightResult.value.length === 0) {\n return { value: [], context };\n }\n }\n return await evaluator(input, context, leftResult.value, rightResult.value);\n }\n\n if (operator === 'implies') {\n // false implies _ -> true (short-circuit)\n if (kind === 'false') {\n return { value: [this.boxBoolean(true)], context };\n }\n // true implies y -> y; empty implies y -> true if y true else empty; need right\n const rightResult = await this.evaluate(binary.right, input, context);\n const operatorDef = this.registry.getOperatorDefinition(operator);\n if (operatorDef && !operatorDef.doesNotPropagateEmpty) {\n if (leftResult.value.length === 0 || rightResult.value.length === 0) {\n return { value: [], context };\n }\n }\n return await evaluator(input, context, leftResult.value, rightResult.value);\n }\n }\n\n // Default path: evaluate both operands in parallel\n const [leftResult, rightResult] = await Promise.all([\n this.evaluate(binary.left, input, context),\n this.evaluate(binary.right, input, context)\n ]);\n\n // Handle empty propagation for operators\n // Rely exclusively on registry metadata\n const operatorDef = this.registry.getOperatorDefinition(operator);\n if (operatorDef && !operatorDef.doesNotPropagateEmpty) {\n // Check if either operand is empty\n if (leftResult.value.length === 0 || rightResult.value.length === 0) {\n return { value: [], context };\n }\n }\n\n return await evaluator(input, context, leftResult.value, rightResult.value);\n }\n\n // If no evaluator found, throw error\n throw Errors.noEvaluatorFound('binary operator', operator);\n }\n\n // Unary operator evaluator\n private async evaluateUnary(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const unary = node as UnaryNode;\n const operator = unary.operator;\n \n const operandResult = await this.evaluate(unary.operand, input, context);\n\n // Check for unary operation evaluators\n let evaluator: OperationEvaluator | undefined;\n if (operator === '-' && operations.unaryMinusOperator?.evaluate) {\n evaluator = operations.unaryMinusOperator.evaluate;\n } else if (operator === '+' && operations.unaryPlusOperator?.evaluate) {\n evaluator = operations.unaryPlusOperator.evaluate;\n }\n\n if (evaluator) {\n return await evaluator(input, context, operandResult.value);\n }\n\n // If no evaluator found, throw error\n throw Errors.noEvaluatorFound('unary operator', operator);\n }\n\n // Variable evaluator\n private async evaluateVariable(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const variable = node as VariableNode;\n const name = variable.name;\n\n const value = RuntimeContextManager.getVariable(context, name);\n \n if (value !== undefined) {\n // Ensure value is always an array\n const arrayValue = Array.isArray(value) ? value : [value];\n // Box each value in the array\n const boxedValues = arrayValue.map(v => ensureBoxed(v));\n return { value: boxedValues, context };\n }\n\n // According to FHIRPath spec: attempting to access an undefined environment variable will result in an error\n throw Errors.variableNotDefined(name);\n }\n\n // Collection evaluator\n private async evaluateCollection(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const collection = node as CollectionNode;\n const results: FHIRPathValue[] = [];\n\n for (const element of collection.elements) {\n const result = await this.evaluate(element, input, context);\n results.push(...result.value);\n }\n\n return { value: results, context };\n }\n\n // Function evaluator\n private async evaluateFunction(node: ASTNode, input: any[], context: RuntimeContext): Promise<EvaluationResult> {\n const func = node as FunctionNode;\n const funcName = (func.name as IdentifierNode).name;\n\n // Get the function definition to check if it propagates empty\n const functionDef = this.registry.getFunction(funcName);\n \n // Check if function is registered with an evaluator\n const functionEvaluator = this.functionEvaluators.get(funcName);\n if (!functionEvaluator) {\n // No function found in registry\n throw Errors.unknownFunction(funcName);\n }\n // Helper: pick a matching signature based on argument count\n const pickSignature = () => {\n if (!functionDef?.signatures || functionDef.signatures.length === 0) {\n return undefined as import('./types').FunctionSignature | undefined;\n }\n const argsCount = func.arguments.length;\n for (const sig of functionDef.signatures) {\n const total = sig.parameters.length;\n const required = sig.parameters.filter(p => !p.optional).length;\n if (argsCount >= required && argsCount <= total) {\n return sig;\n }\n }\n // Fallback to first signature\n return functionDef.signatures[0];\n };\n\n const signature = pickSignature();\n\n // Memoized evaluator to avoid duplicate evaluation of arguments\n // Only memoize when both input and context references are identical to this call's input/context.\n const originalInputRef = input;\n const originalContextRef = context;\n const cache = new WeakMap<ASTNode, Promise<EvaluationResult>>();\n const memoEval = async (n: ASTNode, inVals: any[], ctx: RuntimeContext) => {\n if (inVals === originalInputRef && ctx === originalContextRef) {\n const cached = cache.get(n);\n if (cached) {\n return cached;\n }\n const promise = this.evaluate(n, inVals, ctx);\n cache.set(n, promise);\n return promise;\n }\n // Different input or context – do not reuse cached result\n return this.evaluate(n, inVals, ctx);\n };\n\n // Handle empty propagation centrally (default: propagate)\n if (functionDef && !functionDef.doesNotPropagateEmpty) {\n // If input is empty, propagate empty immediately\n if (input.length === 0) {\n return { value: [], context };\n }\n\n // Evaluate non-expression, non-typeReference arguments once for emptiness\n for (let i = 0; i < func.arguments.length; i++) {\n const arg = func.arguments[i];\n const param = signature?.parameters[i];\n if (!arg || !param) {\n continue;\n }\n // Skip expression or typeReference params (not evaluated here)\n if (param.expression || param.typeReference) {\n continue;\n }\n // Evaluate with memoization\n const argResult = await memoEval(arg, input, context);\n // If argument is empty and it's a required parameter, propagate empty\n const isRequired = !param.optional;\n if (isRequired && argResult.value.length === 0) {\n return { value: [], context };\n }\n }\n }\n\n // Call the function evaluator with memoized evaluator\n return await functionEvaluator(input, context, func.arguments, memoEval);\n }\n\n // Index evaluator\n private async evaluateIndex(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const indexNode = node as IndexNode;\n const exprResult = await this.evaluate(indexNode.expression, input, context);\n const indexResult = await this.evaluate(indexNode.index, input, context);\n\n if (indexResult.value.length === 0 || exprResult.value.length === 0) {\n return { value: [], context };\n }\n\n const boxedIndex = indexResult.value[0];\n if (boxedIndex) {\n const index = unbox(boxedIndex);\n if (typeof index === 'number' && index >= 0 && index < exprResult.value.length) {\n const result = exprResult.value[index];\n return { value: result ? [result] : [], context };\n }\n }\n\n return { value: [], context };\n }\n\n // Type membership test (is operator)\n private async evaluateMembershipTest(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const test = node as MembershipTestNode;\n const exprResult = await this.evaluate(test.expression, input, context);\n \n // Use the is-operator implementation for consistency\n const isOperator = this.operationEvaluators.get('is');\n if (isOperator) {\n return isOperator(input, context, exprResult.value, [test.targetType]);\n }\n \n // Fallback - shouldn't reach here normally\n return { value: [], context };\n }\n\n // Type cast (as operator)\n private async evaluateTypeCast(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const cast = node as TypeCastNode;\n const exprResult = await this.evaluate(cast.expression, input, context);\n \n // Use the as-operator implementation for consistency\n const asOperator = this.operationEvaluators.get('as');\n if (asOperator) {\n return asOperator(input, context, exprResult.value, [cast.targetType]);\n }\n \n // Fallback implementation (shouldn't normally reach here)\n return { value: [], context };\n }\n \n private async evaluateQuantity(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const quantity = node as QuantityNode;\n const quantityValue = createQuantity(quantity.value, quantity.unit);\n return {\n value: [box(quantityValue, { type: 'Quantity', singleton: true })],\n context\n };\n }\n}\n","import type { ModelProvider, TypeInfo, TypeName } from '../types';\nimport { box, type FHIRPathValue } from './boxing';\n\ninterface ChoiceHit {\n readonly value: any;\n readonly typeInfo: TypeInfo;\n readonly primitiveElement?: any;\n}\n\nfunction getPrimitiveElement(item: Record<string, unknown>, prop: string): any | undefined {\n const primitiveElementName = `_${prop}`;\n return Object.prototype.hasOwnProperty.call(item, primitiveElementName)\n ? (item as any)[primitiveElementName]\n : undefined;\n}\n\nasync function maybeParseTemporal(\n value: any,\n expected: TypeInfo | undefined,\n modelProvider?: ModelProvider\n): Promise<any> {\n if (!modelProvider || !expected || typeof value !== 'string') {\n return value;\n }\n if (expected.type === 'Date' || expected.type === 'DateTime' || expected.type === 'Time') {\n const { parseTemporalLiteral } = await import('../complex-types/temporal');\n return parseTemporalLiteral('@' + value);\n }\n return value;\n}\n\nasync function reboxResource(\n value: any,\n singleton: boolean,\n modelProvider?: ModelProvider\n): Promise<FHIRPathValue> {\n let resourceTypeInfo: TypeInfo | undefined;\n if (modelProvider && typeof value?.resourceType === 'string') {\n resourceTypeInfo = await modelProvider.getType(value.resourceType);\n if (resourceTypeInfo) {\n resourceTypeInfo = { ...resourceTypeInfo, singleton };\n }\n }\n if (!resourceTypeInfo) {\n // Default to 'Any' type when no provider or type info not found\n resourceTypeInfo = { type: 'Any', singleton };\n }\n return box(value, resourceTypeInfo);\n}\n\nasync function detectChoiceValues(\n item: Record<string, unknown>,\n base: string,\n modelProvider?: ModelProvider\n): Promise<ChoiceHit[]> {\n // Detect properties like baseXxx where Xxx is a type suffix\n const possible = Object.keys(item).filter((k) => k.startsWith(base) && k !== base && k.length > base.length);\n if (possible.length === 0) {\n return [];\n }\n const hits: ChoiceHit[] = [];\n for (const choiceProp of possible) {\n const value = (item as any)[choiceProp];\n if (value === null || value === undefined) {\n continue;\n }\n const choiceName = choiceProp.substring(base.length);\n const primitiveElement = getPrimitiveElement(item, choiceProp);\n let choiceType: TypeInfo | undefined;\n if (modelProvider) {\n // Ask model provider for precise type if available; fallback to using suffix as TypeName\n const providerType = await modelProvider.getType(choiceName);\n if (providerType) {\n choiceType = providerType;\n }\n }\n if (!choiceType) {\n choiceType = { type: choiceName as TypeName, singleton: !Array.isArray(value) };\n } else {\n choiceType = { ...choiceType, singleton: !Array.isArray(value) };\n }\n if (Array.isArray(value)) {\n for (const v of value) {\n hits.push({ value: v, typeInfo: { ...choiceType, singleton: true }, primitiveElement });\n }\n } else {\n hits.push({ value, typeInfo: choiceType, primitiveElement });\n }\n }\n return hits;\n}\n\nexport { getPrimitiveElement, maybeParseTemporal, reboxResource, detectChoiceValues };\n\n","import type { \n ASTNode, \n BinaryNode, \n IdentifierNode, \n LiteralNode, \n TemporalLiteralNode,\n FunctionNode, \n Diagnostic, \n AnalysisResult, \n UnaryNode, \n IndexNode, \n CollectionNode, \n MembershipTestNode, \n TypeCastNode, \n TypeInfo, \n ModelProvider,\n VariableNode,\n TypeName,\n ErrorNode,\n InternalAnalysisResult,\n QuantityNode\n} from './types';\nimport { NodeType, DiagnosticSeverity, AnalysisContext } from './types';\nimport type { OperatorSignature, FunctionSignature } from './types';\nimport type { FunctionDefinition } from './types';\nimport { registry } from './registry';\nimport { matchOperatorSignature, matchFunctionSignature, resolveResultType } from './analyzer/type-compat';\nimport { checkParamTypes, formatType, isEmptyCollection, isUnionType, getUnionChoices, validateUnionChoice } from './analyzer/utils';\nimport { Errors, toDiagnostic, ErrorCodes } from './errors';\nimport { isCursorNode, CursorContext } from './parser/cursor-nodes';\nimport type { AnyCursorNode } from './parser/cursor-nodes';\nimport { Parser, type ParserOptions } from './parser';\n\nexport interface AnalyzerOptions {\n cursorMode?: boolean;\n}\n\nexport interface AnalysisResultWithCursor extends AnalysisResult {\n stoppedAtCursor?: boolean;\n cursorContext?: {\n typeBeforeCursor?: TypeInfo;\n expectedType?: TypeInfo;\n cursorNode?: AnyCursorNode;\n functionCall?: {\n definition: import('./types').FunctionDefinition;\n argumentIndex: number;\n };\n };\n}\n\nexport class Analyzer {\n private modelProvider?: ModelProvider;\n private cursorMode: boolean = false;\n private stoppedAtCursor: boolean = false;\n private cursorContext?: {\n typeBeforeCursor?: TypeInfo;\n expectedType?: TypeInfo;\n cursorNode?: AnyCursorNode;\n functionCall?: {\n definition: import('./types').FunctionDefinition;\n argumentIndex: number;\n };\n };\n\n constructor(modelProvider?: ModelProvider) {\n this.modelProvider = modelProvider;\n }\n\n /**\n * Parse and analyze a FHIRPath expression end-to-end, returning an AnalysisResult\n * and structured diagnostics. Supports optional error recovery (LSP mode).\n */\n static async analyzeExpression(\n expression: string,\n options: {\n variables?: Record<string, unknown>;\n modelProvider?: ModelProvider;\n inputType?: TypeInfo;\n errorRecovery?: boolean;\n parserOptions?: ParserOptions;\n } = {}\n ): Promise<AnalysisResultWithCursor> {\n const parserOptions: ParserOptions | undefined = options.errorRecovery\n ? { mode: 'lsp', errorRecovery: true, ...(options.parserOptions || {}) }\n : options.parserOptions;\n\n const parser = new Parser(expression, parserOptions);\n const parseResult = parser.parse();\n\n // If error recovery is not enabled and there are parse errors, surface the first one.\n if (!options.errorRecovery && parseResult.errors.length > 0) {\n // Preserve backward compatibility; analyzer doesn't throw custom mapping here.\n throw Errors.invalidSyntax(parseResult.errors[0]!.message);\n }\n\n const analyzer = new Analyzer(options.modelProvider);\n const result = await analyzer.analyze(\n parseResult.ast,\n options.variables,\n options.inputType,\n { cursorMode: !!parserOptions?.mode && parserOptions.mode === 'lsp' }\n );\n\n return result;\n }\n\n /**\n * Main entry point for context-flow analysis.\n * Analyzes a node with the given context.\n */\n private async analyzeNode(node: ASTNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n // Handle cursor nodes for completion\n if (isCursorNode(node)) {\n return this.analyzeCursorNode(node as AnyCursorNode, context);\n }\n\n let result: InternalAnalysisResult;\n \n switch (node.type) {\n case NodeType.Binary:\n result = await this.analyzeBinary(node as BinaryNode, context);\n break;\n case NodeType.Unary:\n result = await this.analyzeUnary(node as UnaryNode, context);\n break;\n case NodeType.Function:\n result = await this.analyzeFunction(node as FunctionNode, context);\n break;\n case NodeType.Variable:\n result = this.analyzeVariable(node as VariableNode, context);\n break;\n case NodeType.Identifier:\n result = await this.analyzeIdentifier(node as IdentifierNode, context);\n break;\n case NodeType.Literal:\n result = this.analyzeLiteral(node as LiteralNode, context);\n break;\n case NodeType.TemporalLiteral:\n result = this.analyzeTemporalLiteral(node as TemporalLiteralNode, context);\n break;\n case NodeType.Index:\n result = await this.analyzeIndex(node as IndexNode, context);\n break;\n case NodeType.Collection:\n result = await this.analyzeCollection(node as CollectionNode, context);\n break;\n case NodeType.MembershipTest:\n result = await this.analyzeMembershipTest(node as MembershipTestNode, context);\n break;\n case NodeType.TypeCast:\n result = await this.analyzeTypeCast(node as TypeCastNode, context);\n break;\n case NodeType.Quantity:\n result = this.analyzeQuantity(node as QuantityNode, context);\n break;\n case 'Error':\n result = this.analyzeError(node as ErrorNode, context);\n break;\n default:\n result = {\n type: { type: 'Any', singleton: false },\n diagnostics: [toDiagnostic(Errors.unknownNodeType(String((node as any)?.type), (node as any)?.range))]\n };\n }\n \n // Annotate the node with type information\n node.typeInfo = result.type;\n \n return result;\n }\n\n /**\n * Analyzes binary operators with special handling for union and dot.\n */\n private async analyzeBinary(node: BinaryNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const diagnostics: Diagnostic[] = [];\n\n // Special handling for union operator - fork context for each branch\n if (node.operator === '|') {\n const leftResult = await this.analyzeNode(node.left, context.fork());\n if (this.stoppedAtCursor) {\n return { type: { type: 'Any', singleton: false }, diagnostics: leftResult.diagnostics };\n }\n \n const rightResult = await this.analyzeNode(node.right, context.fork());\n \n diagnostics.push(...leftResult.diagnostics, ...rightResult.diagnostics);\n \n // Preserve left operand type per operator signature (leftType)\n const type = { ...leftResult.type, singleton: false };\n \n return {\n type,\n diagnostics,\n context // Return original context unchanged - no variable leakage\n };\n }\n\n // Special handling for dot operator - flow context through\n if (node.operator === '.') {\n const leftResult = await this.analyzeNode(node.left, context);\n if (this.stoppedAtCursor) {\n return { type: { type: 'Any', singleton: false }, diagnostics: leftResult.diagnostics };\n }\n \n // Right side gets left's output as input, with any context changes\n const rightContext = (leftResult.context || context).withInputType(leftResult.type);\n const rightResult = await this.analyzeNode(node.right, rightContext);\n \n diagnostics.push(...leftResult.diagnostics, ...rightResult.diagnostics);\n \n return {\n type: rightResult.type,\n diagnostics,\n context: rightResult.context // Propagate context changes (for defineVariable)\n };\n }\n\n // Handle other binary operators\n const leftResult = await this.analyzeNode(node.left, context);\n if (this.stoppedAtCursor) {\n return { type: { type: 'Any', singleton: false }, diagnostics: leftResult.diagnostics };\n }\n \n // Check if right side is a cursor node - if so, set proper context\n if (this.cursorMode && isCursorNode(node.right)) {\n this.stoppedAtCursor = true;\n this.cursorContext = {\n cursorNode: node.right as AnyCursorNode,\n typeBeforeCursor: leftResult.type,\n expectedType: undefined\n };\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: leftResult.diagnostics\n };\n }\n \n // For most operators, right side evaluates with original context (not left's output)\n const rightResult = await this.analyzeNode(node.right, context);\n \n diagnostics.push(...leftResult.diagnostics, ...rightResult.diagnostics);\n\n // Get operator definition for type checking\n const operatorDef = registry.getOperatorDefinition(node.operator);\n if (!operatorDef) {\n diagnostics.push(toDiagnostic(Errors.unknownOperator(node.operator, node.range)));\n return {\n type: { type: 'Any', singleton: false },\n diagnostics\n };\n }\n\n // Check operator signatures for type compatibility\n if (operatorDef.signatures && operatorDef.signatures.length > 0) {\n const matchingSignature = matchOperatorSignature(leftResult.type, rightResult.type, operatorDef) || null;\n if (!matchingSignature) {\n // No matching signature found - report type error\n // But don't report if either side is Any (could be from an error)\n if (leftResult.type.type !== 'Any' && rightResult.type.type !== 'Any') {\n const leftTypeStr = leftResult.type.singleton ? leftResult.type.type : `${leftResult.type.type}[]`;\n const rightTypeStr = rightResult.type.singleton ? rightResult.type.type : `${rightResult.type.type}[]`;\n diagnostics.push(this.createError(\n node,\n `Operator '${node.operator}' cannot be applied to types ${leftTypeStr} and ${rightTypeStr}`,\n ErrorCodes.OPERATOR_TYPE_MISMATCH\n ));\n }\n return {\n type: { type: 'Any', singleton: false },\n diagnostics\n };\n }\n \n // Determine result type from matching signature\n const resultType = resolveResultType(matchingSignature.result as any, {\n input: context.inputType,\n left: leftResult.type,\n right: rightResult.type,\n });\n \n return {\n type: resultType,\n diagnostics\n };\n }\n\n // If no signatures defined, return Any type\n return {\n type: { type: 'Any', singleton: false },\n diagnostics\n };\n }\n\n /**\n * Analyzes function calls, delegating to function's analyze method if available.\n */\n private async analyzeFunction(node: FunctionNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const diagnostics: Diagnostic[] = [];\n\n const functionName = this.getFunctionName(node);\n if (!functionName) {\n diagnostics.push(this.createError(node.name, 'Invalid function name', ErrorCodes.INVALID_SYNTAX));\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n\n const funcDef = registry.getFunction(functionName);\n if (!funcDef) {\n diagnostics.push(toDiagnostic(Errors.unknownFunction(functionName, node.range)));\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n\n const arity = this.validateArity(funcDef, node, functionName);\n diagnostics.push(...arity.diagnostics);\n\n // Early union rules for ofType/is/as\n diagnostics.push(...this.validateUnionTypeFilters(functionName, node, context));\n\n // Custom analyze\n if (funcDef.analyze) {\n const result = funcDef.analyze(context, node.arguments);\n const analysisResult = result instanceof Promise ? await result : result;\n return {\n ...analysisResult,\n diagnostics: [...diagnostics, ...analysisResult.diagnostics]\n };\n }\n\n // Default path: analyze args\n const argAnalysis = await this.analyzeArguments(funcDef, node, context, functionName);\n diagnostics.push(...argAnalysis.diagnostics);\n if (this.stoppedAtCursor) {\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n\n // Signature matching and diagnostics\n const signatureResult = this.matchAndDiagnoseSignature(\n funcDef,\n context.inputType,\n argAnalysis.argTypes,\n node,\n functionName,\n arity.hasError\n );\n diagnostics.push(...signatureResult.diagnostics);\n if (signatureResult.earlyReturn) {\n return { type: signatureResult.earlyReturn, diagnostics };\n }\n\n // Empty propagation\n if (this.propagatesEmpty(funcDef, context.inputType, argAnalysis.argTypes)) {\n return {\n type: { type: 'Any', singleton: false, isEmpty: true },\n diagnostics,\n context\n };\n }\n\n // Result inference\n let resultType = await this.inferFunctionResultType(\n funcDef,\n node,\n context,\n argAnalysis.argTypes,\n signatureResult.match\n );\n\n if (functionName === 'where') {\n resultType = { ...resultType, singleton: false };\n }\n\n return { type: resultType, diagnostics, context };\n }\n\n private getFunctionName(node: FunctionNode): string | null {\n if (node.name.type === NodeType.Identifier) {\n return (node.name as IdentifierNode).name;\n }\n return null;\n }\n\n private validateArity(\n funcDef: FunctionDefinition,\n node: FunctionNode,\n functionName: string\n ): { diagnostics: Diagnostic[]; hasError: boolean } {\n const diagnostics: Diagnostic[] = [];\n let hasError = false;\n if (funcDef.signatures && funcDef.signatures.length > 0) {\n const signature = funcDef.signatures[0];\n if (signature) {\n const params = signature.parameters || [];\n const requiredCount = params.filter(p => !p.optional).length;\n const maxCount = params.length;\n const actualCount = node.arguments.length;\n\n if (actualCount < requiredCount) {\n diagnostics.push(\n this.createError(\n node,\n `${functionName} expects at least ${requiredCount} argument${requiredCount !== 1 ? 's' : ''}, got ${actualCount}`,\n ErrorCodes.WRONG_ARGUMENT_COUNT\n )\n );\n hasError = true;\n } else if (actualCount > maxCount) {\n diagnostics.push(\n this.createError(\n node,\n `${functionName} expects at most ${maxCount} argument${maxCount !== 1 ? 's' : ''}, got ${actualCount}`,\n ErrorCodes.WRONG_ARGUMENT_COUNT\n )\n );\n hasError = true;\n }\n }\n }\n return { diagnostics, hasError };\n }\n\n private validateUnionTypeFilters(\n functionName: string,\n node: FunctionNode,\n context: AnalysisContext\n ): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n if (!['ofType', 'is', 'as'].includes(functionName) || node.arguments.length === 0) {\n return diagnostics;\n }\n const inputType = context.inputType;\n if (!isUnionType(inputType)) {\n return diagnostics;\n }\n const typeArg = node.arguments[0]!;\n let targetType: string | undefined;\n if (typeArg.type === NodeType.Identifier) {\n targetType = (typeArg as IdentifierNode).name;\n }\n if (!targetType) {\n return diagnostics;\n }\n const diag = validateUnionChoice(inputType, targetType, typeArg.range || node.range, 'invalid-type-filter', 'Type');\n if (diag && functionName === 'ofType') diagnostics.push(diag);\n return diagnostics;\n }\n\n private async analyzeArguments(\n funcDef: FunctionDefinition,\n node: FunctionNode,\n context: AnalysisContext,\n functionName: string\n ): Promise<{ argTypes: TypeInfo[]; diagnostics: Diagnostic[] }> {\n const diagnostics: Diagnostic[] = [];\n const argTypes: TypeInfo[] = [];\n const signature = funcDef.signatures?.[0];\n const params = signature?.parameters || [];\n\n for (let i = 0; i < node.arguments.length; i++) {\n const arg = node.arguments[i]!;\n const param = params[i];\n const isTypeParameter = !!param?.typeReference;\n\n if (isTypeParameter) {\n argTypes.push({ type: 'TypeReference' as TypeName, singleton: true });\n continue;\n }\n\n if (param?.expression) {\n const itemType = { ...context.inputType, singleton: true };\n const exprContext = context\n .withSystemVariable('$this', itemType)\n .withSystemVariable('$index', { type: 'Integer', singleton: true });\n const argResult = await this.analyzeNode(arg, exprContext);\n diagnostics.push(...argResult.diagnostics);\n argTypes.push(argResult.type);\n if (this.stoppedAtCursor) {\n break;\n }\n continue;\n }\n\n const thisType = context.systemVariables.get('$this') || context.inputType;\n const argContext = context.withInputType(thisType);\n const argResult = await this.analyzeNode(arg, argContext);\n diagnostics.push(...argResult.diagnostics);\n argTypes.push(argResult.type);\n if (this.stoppedAtCursor) {\n break;\n }\n }\n\n return { argTypes, diagnostics };\n }\n\n private matchAndDiagnoseSignature(\n funcDef: FunctionDefinition,\n actualInput: TypeInfo,\n argTypes: TypeInfo[],\n node: FunctionNode,\n functionName: string,\n hasArityError: boolean\n ): { match: FunctionSignature | null; diagnostics: Diagnostic[]; earlyReturn?: TypeInfo } {\n const diagnostics: Diagnostic[] = [];\n let match: FunctionSignature | null = null;\n\n if (!hasArityError && funcDef.signatures && funcDef.signatures.length > 0) {\n match = matchFunctionSignature(actualInput, argTypes, funcDef) || null;\n\n if (!match) {\n const inputIsEmpty = isEmptyCollection(actualInput);\n if (inputIsEmpty && !funcDef.doesNotPropagateEmpty) {\n const sig = funcDef.signatures[0];\n if (sig) {\n diagnostics.push(\n ...checkParamTypes(sig, argTypes, node.arguments, {\n warnOnSingletonOnly: false,\n doesNotPropagateEmpty: !!funcDef.doesNotPropagateEmpty,\n treatEmptyAsWarning: true,\n errorCode: ErrorCodes.ARGUMENT_TYPE_MISMATCH,\n })\n );\n }\n } else {\n let inputMatchingSignature: FunctionSignature | null = null;\n for (const sig of funcDef.signatures) {\n let inputMatches = true;\n if (sig.input) {\n const expectedInput = sig.input;\n const singletonMatch = !expectedInput.singleton || actualInput.singleton === true;\n const typeMatch =\n expectedInput.type === 'Any' ||\n actualInput.type === 'Any' ||\n expectedInput.type === actualInput.type ||\n (expectedInput.type === 'Decimal' && actualInput.type === 'Integer');\n inputMatches = singletonMatch && typeMatch;\n }\n if (inputMatches) {\n inputMatchingSignature = sig;\n break;\n }\n }\n\n if (inputMatchingSignature && inputMatchingSignature.parameters) {\n diagnostics.push(\n ...checkParamTypes(inputMatchingSignature, argTypes, node.arguments, {\n warnOnSingletonOnly: true,\n doesNotPropagateEmpty: !!funcDef.doesNotPropagateEmpty,\n errorCode: ErrorCodes.ARGUMENT_TYPE_MISMATCH,\n })\n );\n } else {\n const actualTypeStr = actualInput.singleton ? actualInput.type : `${actualInput.type}[]`;\n const hasSingletonSignature = funcDef.signatures.some(sig => sig.input?.singleton && sig.input.type === actualInput.type);\n const permissive = ['anyFalse', 'anyTrue'];\n if (hasSingletonSignature && !actualInput.singleton) {\n diagnostics.push(\n this.createError(\n node,\n `${functionName} expects a singleton value, but received collection type ${actualTypeStr}`,\n ErrorCodes.SINGLETON_REQUIRED\n )\n );\n } else if (!permissive.includes(functionName)) {\n const expectedTypes = funcDef.signatures\n .map(sig => (sig.input ? (sig.input.singleton ? sig.input.type : `${sig.input.type}[]`) : 'Any'))\n .filter((v, i, a) => a.indexOf(v) === i)\n .join(' or ');\n diagnostics.push(\n this.createError(\n node,\n `Cannot apply ${functionName}() to ${actualTypeStr}. Function expects ${expectedTypes}.`,\n ErrorCodes.INVALID_OPERAND_TYPE\n )\n );\n }\n }\n }\n } else {\n if (match.parameters) {\n diagnostics.push(\n ...checkParamTypes(match, argTypes, node.arguments, {\n warnOnSingletonOnly: true,\n doesNotPropagateEmpty: !!funcDef.doesNotPropagateEmpty,\n errorCode: ErrorCodes.ARGUMENT_TYPE_MISMATCH,\n })\n );\n } else {\n const permissive = ['anyFalse', 'anyTrue'];\n if (permissive.includes(functionName)) {\n return { match, diagnostics, earlyReturn: { type: 'Boolean', singleton: true } };\n }\n }\n }\n }\n\n return { match, diagnostics };\n }\n\n private propagatesEmpty(\n funcDef: FunctionDefinition,\n inputType: TypeInfo,\n argTypes: TypeInfo[]\n ): boolean {\n if (funcDef.doesNotPropagateEmpty) {\n return false;\n }\n const inputIsEmpty = isEmptyCollection(inputType);\n const hasEmptyArgument = argTypes.some(argType => isEmptyCollection(argType));\n return inputIsEmpty || hasEmptyArgument;\n }\n\n private async inferFunctionResultType(\n funcDef: FunctionDefinition,\n node: FunctionNode,\n context: AnalysisContext,\n argTypes: TypeInfo[],\n matchingSignature: FunctionSignature | null\n ): Promise<TypeInfo> {\n if (funcDef.inferResultType) {\n return funcDef.inferResultType(this, node, context.inputType);\n }\n if (matchingSignature) {\n return resolveResultType(matchingSignature.result as any, {\n input: context.inputType,\n firstParam: argTypes[0],\n });\n }\n return context.inputType;\n }\n\n /**\n * Analyzes variable references, checking against context.\n */\n private analyzeVariable(node: VariableNode, context: AnalysisContext): InternalAnalysisResult {\n const varName = node.name;\n const diagnostics: Diagnostic[] = [];\n\n // Check if it's a user variable (starts with %)\n if (varName.startsWith('%')) {\n // Special handling for %context - it's a built-in environment variable\n // that always returns the original input to the evaluation engine\n if (varName === '%context') {\n // %context returns the root input type (the original input to evaluate())\n // In the analyzer, we track this as the initial input type\n return { type: context.inputType, diagnostics, context };\n }\n \n const name = varName.substring(1); // Remove % prefix\n const varType = context.userVariables.get(name);\n \n if (!varType) {\n // If we have dynamic variables in scope, we can't be sure this is an error\n if (context.hasDynamicVariables) {\n diagnostics.push(this.createWarning(node, `Variable '${varName}' may not be defined (dynamic variables in scope)`));\n // Return Any type since we don't know the actual type\n return { type: { type: 'Any', singleton: false }, diagnostics };\n } else {\n // No dynamic variables, so this is definitely an error\n diagnostics.push(this.createError(node, Errors.unknownUserVariable(varName).message, ErrorCodes.UNKNOWN_USER_VARIABLE));\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n }\n \n // Attach type info to the node for backward compatibility\n node.typeInfo = varType;\n return { type: varType, diagnostics, context };\n }\n\n // Check system variables\n const sysVarType = context.systemVariables.get(varName);\n if (sysVarType) {\n // Attach type info to the node for backward compatibility\n node.typeInfo = sysVarType;\n return { type: sysVarType, diagnostics, context };\n }\n\n // Unknown variable\n diagnostics.push(this.createError(node, `Unknown variable: ${varName}`, ErrorCodes.UNKNOWN_VARIABLE));\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n\n /**\n * Analyzes identifier nodes (property access).\n */\n private async analyzeIdentifier(node: IdentifierNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const name = 'name' in node ? node.name : '';\n const diagnostics: Diagnostic[] = [];\n \n // Try to use model provider for accurate type information\n if (context.modelProvider) {\n // First try to navigate from input type (property access)\n const elementType = await context.modelProvider.getElementType(context.inputType, name);\n if (elementType) {\n return {\n type: elementType,\n diagnostics,\n context\n };\n }\n // Chain-head rule: at the head of a navigation chain, allow treating the\n // identifier as a known type to seed the chain (e.g., Patient.name)\n if ((context as any)._chainHead === true) {\n const typeInfo = await context.modelProvider.getType(name);\n if (typeInfo) {\n return {\n type: typeInfo,\n diagnostics,\n context\n };\n }\n }\n \n // If property not found and we have a concrete non-union type, report warning\n // FHIRPath returns empty for unknown properties, not an error\n const mc: any = context.inputType.modelContext;\n const isUnion = !!(mc && typeof mc === 'object' && 'isUnion' in mc && mc.isUnion);\n if (context.inputType.namespace && context.inputType.name && context.inputType.modelContext && !isUnion) {\n const typeStr = `${context.inputType.namespace}.${context.inputType.name}`;\n diagnostics.push(toDiagnostic(Errors.unknownProperty(name, typeStr, node.range), DiagnosticSeverity.Warning));\n return {\n type: { type: 'Any', singleton: false },\n diagnostics,\n context\n };\n }\n }\n \n // Without a model provider, we can't know the type\n // Return Any type - don't make assumptions\n return {\n type: { type: 'Any', singleton: false },\n diagnostics,\n context\n };\n }\n\n /**\n * Analyzes literal values.\n */\n private analyzeLiteral(node: LiteralNode, context: AnalysisContext): InternalAnalysisResult {\n let type: TypeInfo;\n \n switch (node.valueType) {\n case 'string':\n type = { type: 'String', singleton: true };\n break;\n case 'number':\n // Check if integer or decimal\n type = Number.isInteger(node.value) \n ? { type: 'Integer', singleton: true }\n : { type: 'Decimal', singleton: true };\n break;\n case 'boolean':\n type = { type: 'Boolean', singleton: true };\n break;\n case 'date':\n type = { type: 'Date', singleton: true };\n break;\n case 'time':\n type = { type: 'Time', singleton: true };\n break;\n case 'datetime':\n type = { type: 'DateTime', singleton: true };\n break;\n default:\n type = { type: 'Any', singleton: true };\n }\n \n return { type, diagnostics: [] };\n }\n \n private analyzeTemporalLiteral(node: TemporalLiteralNode, context: AnalysisContext): InternalAnalysisResult {\n let type: TypeInfo;\n \n switch (node.valueType) {\n case 'date':\n type = { type: 'Date', singleton: true };\n break;\n case 'time':\n type = { type: 'Time', singleton: true };\n break;\n case 'datetime':\n type = { type: 'DateTime', singleton: true };\n break;\n default:\n type = { type: 'Any', singleton: true };\n }\n \n return { type, diagnostics: [] };\n }\n\n /**\n * Analyzes unary operators.\n */\n private async analyzeUnary(node: UnaryNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const operandResult = await this.analyzeNode(node.operand, context);\n const diagnostics: Diagnostic[] = [...operandResult.diagnostics];\n const opDef = registry.getOperatorDefinition(node.operator);\n\n if (opDef && opDef.signatures && opDef.signatures.length > 0) {\n // Use first signature's result if defined\n const sig = opDef.signatures[0]!;\n const resultType = typeof sig.result === 'object' ? sig.result : operandResult.type;\n return { type: resultType, diagnostics };\n }\n\n // Fallback: preserve operand type\n return { type: operandResult.type, diagnostics };\n }\n\n /**\n * Analyzes index operations.\n */\n private async analyzeIndex(node: IndexNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const exprResult = await this.analyzeNode(node.expression, context);\n const indexResult = await this.analyzeNode(node.index, context);\n const diagnostics: Diagnostic[] = [...exprResult.diagnostics, ...indexResult.diagnostics];\n\n // Index should be Integer singleton; if unknown, skip strict error\n const idxType = indexResult.type;\n const isIntegerSingleton = idxType.type === 'Integer' && idxType.singleton === true;\n if (!isIntegerSingleton && idxType.type !== 'Any') {\n diagnostics.push(this.createError(node.index, 'Index must be an Integer singleton', ErrorCodes.ARGUMENT_TYPE_MISMATCH));\n }\n\n // Result is the element type (singleton) of the expression collection\n const exprType = exprResult.type;\n const resultType = { ...exprType, singleton: true };\n return { type: resultType, diagnostics };\n }\n\n /**\n * Analyzes quantity literals.\n */\n private analyzeQuantity(node: QuantityNode, context: AnalysisContext): InternalAnalysisResult {\n return {\n type: { type: 'Quantity', singleton: true },\n diagnostics: [],\n context\n };\n }\n\n /**\n * Analyzes collection literals.\n */\n private async analyzeCollection(node: CollectionNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const diagnostics: Diagnostic[] = [];\n const isEmpty = node.elements.length === 0;\n const elementTypes: TypeInfo[] = [];\n\n for (const element of node.elements) {\n const elemResult = await this.analyzeNode(element, context);\n diagnostics.push(...elemResult.diagnostics);\n elementTypes.push(elemResult.type);\n if (this.stoppedAtCursor) {\n return { type: { type: 'Any', singleton: false }, diagnostics };\n }\n }\n\n // Infer common element type\n let elementType: TypeInfo = { type: 'Any', singleton: true };\n if (!isEmpty) {\n elementType = elementTypes[0]!;\n for (let i = 1; i < elementTypes.length; i++) {\n const t = elementTypes[i]!;\n if (elementType.type === t.type) {\n // keep; if any is non-singleton, result stays collection anyway\n continue;\n }\n // Promote Integer to Decimal when mixed\n if ((elementType.type === 'Integer' && t.type === 'Decimal') || (elementType.type === 'Decimal' && t.type === 'Integer')) {\n elementType = { type: 'Decimal', singleton: true };\n continue;\n }\n // Unknown/heterogeneous → Any\n elementType = { type: 'Any', singleton: true };\n break;\n }\n }\n\n return { type: { ...elementType, singleton: false, isEmpty }, diagnostics };\n }\n\n /**\n * Analyzes membership test (is operator).\n */\n private async analyzeMembershipTest(node: MembershipTestNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const exprResult = await this.analyzeNode(node.expression, context);\n const diagnostics = [...exprResult.diagnostics];\n\n // ModelProvider requirement for non-primitive target types\n const primitiveTypes = ['String', 'Integer', 'Decimal', 'Boolean', 'Date', 'DateTime', 'Time', 'Quantity'];\n if (!context.modelProvider && !primitiveTypes.includes(node.targetType)) {\n diagnostics.push(toDiagnostic(Errors.modelProviderRequired('is', node.range)));\n }\n \n // Check if testing against a union type\n if (isUnionType(exprResult.type)) {\n const targetType = node.targetType;\n const choices = getUnionChoices(exprResult.type);\n if (choices.length > 0 && !choices.includes(targetType)) {\n diagnostics.push({\n severity: DiagnosticSeverity.Warning,\n code: 'invalid-type-test',\n message: `Type test 'is ${targetType}' will always be false - type not present in union. Available types: ${choices.join(', ')}`,\n range: node.range\n });\n }\n }\n \n return {\n type: { type: 'Boolean', singleton: true },\n diagnostics\n };\n }\n\n /**\n * Analyzes type cast (as operator).\n */\n private async analyzeTypeCast(node: TypeCastNode, context: AnalysisContext): Promise<InternalAnalysisResult> {\n const exprResult = await this.analyzeNode(node.expression, context);\n const diagnostics = [...exprResult.diagnostics];\n\n // ModelProvider requirement for non-primitive target types\n const primitiveTypes = ['String', 'Integer', 'Decimal', 'Boolean', 'Date', 'DateTime', 'Time', 'Quantity'];\n if (!context.modelProvider && !primitiveTypes.includes(node.targetType)) {\n diagnostics.push(toDiagnostic(Errors.modelProviderRequired('as', node.range)));\n }\n \n // Check if casting from a union type\n if (isUnionType(exprResult.type)) {\n const targetTypeName = node.targetType;\n const choices = getUnionChoices(exprResult.type);\n if (choices.length > 0 && !choices.includes(targetTypeName)) {\n diagnostics.push({\n severity: DiagnosticSeverity.Warning,\n code: 'invalid-type-cast',\n message: `Type cast 'as ${targetTypeName}' may fail - type not present in union. Available types: ${choices.join(', ')}`,\n range: node.range\n });\n }\n }\n \n // Type cast changes the type\n const targetType: TypeInfo = { \n type: node.targetType as TypeName, \n singleton: exprResult.type.singleton \n };\n \n return {\n type: targetType,\n diagnostics\n };\n }\n\n /**\n * Analyzes error nodes.\n */\n private analyzeError(node: ErrorNode, context: AnalysisContext): InternalAnalysisResult {\n return {\n type: { type: 'Any', singleton: false },\n diagnostics: [this.createError(node, node.message, ErrorCodes.INVALID_SYNTAX)]\n };\n }\n\n /**\n * Analyzes cursor nodes for completion.\n */\n private analyzeCursorNode(node: AnyCursorNode, context: AnalysisContext): InternalAnalysisResult {\n // Store cursor context for completion\n if (this.cursorMode) {\n this.stoppedAtCursor = true;\n this.cursorContext = {\n typeBeforeCursor: context.inputType,\n cursorNode: node,\n expectedType: undefined,\n functionCall: undefined\n };\n \n // Set expected type based on cursor context\n if (node.context === CursorContext.Index) {\n // Index expects an integer\n this.cursorContext.expectedType = { type: 'Integer', singleton: true };\n } else if (node.context === CursorContext.Argument) {\n // Arguments context - check if we're in a function\n const parent = (node as any).parent;\n if (parent && parent.type === NodeType.Function) {\n const funcNode = parent as FunctionNode;\n if (funcNode.name.type === NodeType.Identifier) {\n const funcName = (funcNode.name as IdentifierNode).name;\n const funcDef = registry.getFunction(funcName);\n if (funcDef) {\n // Find argument index\n const argIndex = funcNode.arguments.indexOf(node);\n this.cursorContext.functionCall = {\n definition: funcDef,\n argumentIndex: argIndex >= 0 ? argIndex : 0\n };\n }\n }\n }\n }\n }\n \n return {\n type: { type: 'Any', singleton: false },\n diagnostics: []\n };\n }\n\n // Legacy union combiner removed; union handled in analyzeBinary\n\n /**\n * Helper to create diagnostic errors.\n */\n private createError(node: ASTNode, message: string, code?: string): Diagnostic {\n return {\n range: node.range,\n message,\n severity: DiagnosticSeverity.Error,\n code,\n source: 'fhirpath'\n };\n }\n \n private createWarning(node: ASTNode, message: string, code?: string): Diagnostic {\n return {\n range: node.range,\n message,\n severity: DiagnosticSeverity.Warning,\n code,\n source: 'fhirpath'\n };\n }\n\n /**\n * Helper method to infer TypeInfo from runtime values (used for user variables).\n */\n private inferValueType(value: any): TypeInfo {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return { type: 'Any', singleton: false };\n }\n // Infer from first element\n const elementType = this.inferValueType(value[0]);\n return { ...elementType, singleton: false };\n }\n \n if (typeof value === 'string') {\n return { type: 'String', singleton: true };\n } else if (typeof value === 'number') {\n return Number.isInteger(value) \n ? { type: 'Integer', singleton: true }\n : { type: 'Decimal', singleton: true };\n } else if (typeof value === 'boolean') {\n return { type: 'Boolean', singleton: true };\n } else if (value instanceof Date) {\n return { type: 'DateTime', singleton: true };\n } else {\n return { type: 'Any', singleton: true };\n }\n }\n\n async analyze(\n ast: ASTNode, \n userVariables?: Record<string, any>, \n inputType?: TypeInfo,\n options?: AnalyzerOptions\n ): Promise<AnalysisResultWithCursor> {\n this.cursorMode = options?.cursorMode ?? false;\n this.stoppedAtCursor = false;\n this.cursorContext = undefined;\n \n // Create initial context with system and user variables\n const systemVars = new Map<string, TypeInfo>();\n // $this should be the input type (the root context), not Any\n systemVars.set('$this', inputType || { type: 'Any', singleton: false });\n systemVars.set('$index', { type: 'Integer', singleton: true });\n systemVars.set('$total', { type: 'Any', singleton: false });\n \n const userVars = new Map<string, TypeInfo>();\n if (userVariables) {\n Object.keys(userVariables).forEach(name => {\n const value = userVariables[name];\n if (value !== undefined && value !== null) {\n userVars.set(name, this.inferValueType(value));\n }\n });\n }\n \n // Create context with analyzeNode callback and model provider\n const initialContext = new AnalysisContext(\n inputType || { type: 'Any', singleton: false },\n systemVars,\n userVars,\n (node, ctx) => this.analyzeNode(node, ctx),\n this.modelProvider\n );\n \n // Run context-flow analysis\n const result = await this.analyzeNode(ast, initialContext);\n \n // Legacy annotateAST/visitor path removed from default analysis to avoid duplication.\n \n return {\n diagnostics: result.diagnostics,\n ast,\n type: result.type,\n userVariables: new Map(result.context?.userVariables || initialContext.userVariables),\n stoppedAtCursor: this.cursorMode ? this.stoppedAtCursor : undefined,\n cursorContext: this.cursorMode ? this.cursorContext : undefined\n };\n }\n}\n","import type {\n TypeInfo,\n OperatorDefinition,\n OperatorSignature,\n FunctionDefinition,\n FunctionSignature,\n TypeName,\n} from '../types';\nimport { registry } from '../registry';\n\nexport function isTypeCompatible(source: TypeInfo, target: TypeInfo): boolean {\n return registry.isTypeCompatible(source, target);\n}\n\nexport function matchOperatorSignature(\n left: TypeInfo,\n right: TypeInfo,\n def?: OperatorDefinition\n): OperatorSignature | undefined {\n if (!def || !def.signatures || def.signatures.length === 0) return undefined;\n\n let best: { sig: OperatorSignature; score: number; tieBias: number } | undefined;\n\n for (const sig of def.signatures) {\n const leftOk = isTypeCompatible(left, sig.left);\n const rightOk = isTypeCompatible(right, sig.right);\n if (!leftOk || !rightOk) continue;\n\n const leftScore = specificity(left, sig.left);\n const rightScore = specificity(right, sig.right);\n let score = leftScore + rightScore;\n\n // Prefer decimal math when any operand is Decimal\n const anyActualDecimal = left.type === 'Decimal' || right.type === 'Decimal';\n const sigHasDecimal = sig.left.type === 'Decimal' || sig.right.type === 'Decimal';\n const tieBias = anyActualDecimal && sigHasDecimal ? 1 : 0;\n\n if (!best || score > best.score || (score === best.score && tieBias > best.tieBias)) {\n best = { sig, score, tieBias };\n }\n }\n\n return best?.sig;\n}\n\nfunction specificity(actual: TypeInfo, required: TypeInfo): number {\n if (required.type === 'Any') return 0;\n if (actual.type === required.type) return 3;\n // numeric widening\n const numeric = new Set<TypeName>(['Integer', 'Decimal']);\n if (numeric.has(actual.type) && numeric.has(required.type)) return 2;\n return 1;\n}\n\nexport function matchFunctionSignature(\n input: TypeInfo,\n args: TypeInfo[],\n def?: FunctionDefinition\n): FunctionSignature | undefined {\n if (!def || !def.signatures || def.signatures.length === 0) return undefined;\n\n let best: { sig: FunctionSignature; score: number; tieBias: number } | undefined;\n\n for (const sig of def.signatures) {\n // Input compatibility (if specified)\n if (sig.input && !isFunctionTypeCompatible(input, sig.input)) {\n continue;\n }\n\n let ok = true;\n let score = 0;\n let tieBias = 0;\n const params = sig.parameters || [];\n for (let i = 0; i < Math.min(args.length, params.length); i++) {\n const argType = args[i]!;\n const param = params[i]!;\n if (param.expression) {\n continue; // expression params are analyzed in their own context\n }\n\n const isEmptyArg = argType.isEmpty || (argType.type === 'Any' && !argType.singleton);\n if (isEmptyArg && !def.doesNotPropagateEmpty) {\n continue; // empty propagates; don't penalize\n }\n\n if (!isFunctionTypeCompatible(argType, param.type)) {\n ok = false;\n break;\n }\n score += specificity(argType, param.type);\n\n // Prefer decimal params when actual is Decimal\n if (argType.type === 'Decimal' && param.type.type === 'Decimal') {\n tieBias += 1;\n }\n }\n\n if (!ok) continue;\n\n // Add input specificity\n if (sig.input) {\n score += specificity(input, sig.input);\n if (input.type === 'Decimal' && sig.input.type === 'Decimal') tieBias += 1;\n }\n\n if (!best || score > best.score || (score === best.score && tieBias > best.tieBias)) {\n best = { sig, score, tieBias };\n }\n }\n\n return best?.sig;\n}\n\nfunction isFunctionTypeCompatible(actual: TypeInfo, expected: TypeInfo): boolean {\n // Enforce singleton when required\n if (expected.singleton && !actual.singleton) return false;\n if (expected.type === 'Any') return true;\n if (actual.type === expected.type) return true;\n // Allow Integer to be used where Decimal is expected (promotion)\n if (expected.type === 'Decimal' && actual.type === 'Integer') return true;\n return false;\n}\n\nexport type ResultSpec =\n | TypeInfo\n | 'inputType'\n | 'inputTypeSingleton'\n | 'leftType'\n | 'rightType'\n | 'parameterType';\n\nexport function resolveResultType(\n spec: ResultSpec,\n ctx: {\n input?: TypeInfo;\n left?: TypeInfo;\n right?: TypeInfo;\n firstParam?: TypeInfo;\n }\n): TypeInfo {\n if (typeof spec !== 'string') return spec;\n\n switch (spec) {\n case 'inputType':\n return ctx.input || { type: 'Any', singleton: false };\n case 'inputTypeSingleton':\n return ctx.input ? { ...ctx.input, singleton: true } : { type: 'Any', singleton: true };\n case 'leftType':\n return ctx.left ? { ...ctx.left, singleton: false } : { type: 'Any', singleton: false };\n case 'rightType':\n return ctx.right ? { ...ctx.right, singleton: false } : { type: 'Any', singleton: false };\n case 'parameterType':\n return ctx.firstParam ? { ...ctx.firstParam, singleton: false } : { type: 'Any', singleton: false };\n default:\n return { type: 'Any', singleton: false };\n }\n}\n","import type { ASTNode, Diagnostic, FunctionSignature, TypeInfo, Range } from '../types';\nimport { DiagnosticSeverity } from '../types';\n\n/** Formats a TypeInfo into a user-facing string (e.g., Integer, Decimal[]). */\nexport function formatType(t: TypeInfo): string {\n const base = t.type;\n return t.singleton ? base : `${base}[]`;\n}\n\n/**\n * Determines if a type should be treated as an empty collection for diagnostics.\n * Mirrors existing analyzer semantics: consider explicit isEmpty or Any-collections as empty.\n */\nexport function isEmptyCollection(t: TypeInfo | undefined): boolean {\n if (!t) {\n return false;\n }\n return t.isEmpty === true || (t.type === 'Any' && t.singleton === false);\n}\n\n/** Returns true if the type carries a union modelContext with choices. */\nexport function isUnionType(type: TypeInfo | undefined): boolean {\n const mc: any = type?.modelContext;\n return !!(mc && typeof mc === 'object' && 'isUnion' in mc && mc.isUnion && Array.isArray(mc.choices));\n}\n\n/** Returns union choice identifiers (type or code) if union; otherwise empty list. */\nexport function getUnionChoices(type: TypeInfo | undefined): string[] {\n const mc: any = type?.modelContext;\n if (!mc || !Array.isArray(mc.choices)) {\n return [];\n }\n return mc.choices\n .map((c: any) => c?.type ?? c?.code)\n .filter((t: unknown): t is string => typeof t === 'string' && t.length > 0);\n}\n\n/**\n * If target is not present in the union choices, returns a Warning diagnostic with given code.\n * Otherwise returns null.\n */\nexport function validateUnionChoice(\n type: TypeInfo,\n targetType: string | undefined,\n range: Range,\n code: string,\n messagePrefix: string\n): Diagnostic | null {\n if (!targetType || !isUnionType(type)) {\n return null;\n }\n const choices = getUnionChoices(type);\n if (choices.length === 0) {\n return null;\n }\n if (choices.includes(targetType)) {\n return null;\n }\n return {\n severity: DiagnosticSeverity.Warning,\n code,\n message: `${messagePrefix} '${targetType}' is not present in the union type. Available types: ${choices.join(', ')}`,\n range,\n source: 'fhirpath',\n };\n}\n\n/**\n * Checks parameter types against a signature and returns diagnostics.\n * - Skips expression parameters.\n * - Treats Decimal-expected vs Integer-actual as compatible.\n * - Emits warnings for empty collections when allowed and function propagates empty.\n */\nexport function checkParamTypes(\n sig: FunctionSignature,\n argTypes: TypeInfo[],\n nodes: ASTNode[],\n opts: {\n warnOnSingletonOnly: boolean;\n doesNotPropagateEmpty: boolean;\n treatEmptyAsWarning?: boolean;\n errorCode?: string;\n }\n): Diagnostic[] {\n const diags: Diagnostic[] = [];\n const params = sig.parameters || [];\n for (let i = 0; i < params.length; i++) {\n const param = params[i];\n const arg = argTypes[i];\n const node = (nodes[i] ?? nodes[0])!;\n if (!param || !arg || param.expression) {\n continue;\n }\n\n if (\n isEmptyCollection(arg) &&\n !opts.doesNotPropagateEmpty &&\n opts.treatEmptyAsWarning !== false\n ) {\n diags.push({\n range: node.range,\n severity: DiagnosticSeverity.Warning,\n message: `Argument ${i + 1}: expected ${formatType(param.type)}, got empty collection. Result will be empty.`,\n source: 'fhirpath',\n code: opts.errorCode,\n });\n continue;\n }\n\n const typeMatch =\n param.type.type === 'Any' ||\n arg.type === 'Any' ||\n param.type.type === arg.type ||\n (param.type.type === 'Decimal' && arg.type === 'Integer');\n const singletonMatch = !param.type.singleton || arg.singleton === true;\n\n if (!typeMatch || !singletonMatch) {\n const msg = `Argument ${i + 1}: expected ${formatType(param.type)}, got ${formatType(arg)}`;\n const severity = typeMatch && !singletonMatch && opts.warnOnSingletonOnly\n ? DiagnosticSeverity.Warning\n : DiagnosticSeverity.Error;\n diags.push({\n range: node.range,\n severity,\n message: msg,\n source: 'fhirpath',\n code: opts.errorCode,\n });\n }\n }\n return diags;\n}\n","import { Parser } from './parser';\nimport { Interpreter } from './interpreter';\nimport { Analyzer } from './analyzer';\nimport type { AnalysisResult } from './types';\nimport { DiagnosticSeverity } from './types';\nimport { FHIRPathError, Errors, ErrorCodes } from './errors';\n\nexport interface EvaluateOptions {\n input?: unknown;\n variables?: Record<string, unknown>;\n modelProvider?: import('./types').ModelProvider;\n inputType?: import('./types').TypeInfo;\n}\n\nexport async function evaluate(\n expression: string,\n options: EvaluateOptions = {}\n): Promise<any[]> {\n const interpreter = new Interpreter(undefined, options.modelProvider);\n return interpreter.evaluateExpression(expression, {\n input: options.input,\n variables: options.variables,\n inputType: options.inputType,\n modelProvider: options.modelProvider,\n });\n}\n\nexport async function analyze(\n expression: string,\n options: { \n variables?: Record<string, unknown>;\n modelProvider?: import('./types').ModelProvider;\n inputType?: import('./types').TypeInfo;\n errorRecovery?: boolean;\n } = {}\n): Promise<AnalysisResult> {\n const analysisResult = await Analyzer.analyzeExpression(expression, {\n variables: options.variables,\n modelProvider: options.modelProvider,\n inputType: options.inputType,\n errorRecovery: options.errorRecovery,\n });\n return analysisResult;\n}\n\n// Export key types and classes\nexport { Parser } from './parser';\nexport { Interpreter } from './interpreter';\nexport { Analyzer } from './analyzer';\nexport { parse } from './parser';\nexport { DiagnosticSeverity } from './types';\nexport { Registry, registry } from './registry';\nexport type { \n ParseResult, \n Diagnostic, \n AnalysisResult, \n ASTNode,\n TypeInfo,\n TypeName,\n ModelProvider as ModelTypeProvider,\n OperatorDefinition,\n FunctionDefinition\n} from './types';\n\n// Export FHIR ModelProvider\nexport { FHIRModelProvider } from './model-provider';\nexport type { FHIRModelContext, FHIRModelProviderConfig } from './model-provider';\n\n// Export inspect API\nexport { inspect } from './inspect';\nexport type { InspectOptions, InspectResult, ASTMetadata } from './inspect';\n\n// Export error system\nexport { FHIRPathError, Errors, ErrorCodes } from './errors';\n\n// Export LSP support - completion provider and cursor nodes\n/**\n * Provides context-aware code completions for FHIRPath expressions.\n * @param expression - The FHIRPath expression being edited\n * @param cursorPosition - The cursor position (0-based offset)\n * @param options - Optional configuration including modelProvider and variables\n * @returns Array of completion items with labels, kinds, and documentation\n * \n * @example\n * ```typescript\n * import { provideCompletions } from 'fhirpath';\n * \n * const completions = provideCompletions('Patient.', 8);\n * // Returns completions for properties and functions after 'Patient.'\n * ```\n */\nexport { provideCompletions, CompletionKind } from './completion-provider';\nexport type { \n CompletionItem, \n CompletionOptions\n} from './completion-provider';\n\n// Export cursor node types for LSP integration\nexport { CursorContext, isCursorNode } from './parser/cursor-nodes';\nexport type {\n CursorNode,\n CursorOperatorNode,\n CursorIdentifierNode,\n CursorArgumentNode,\n CursorIndexNode,\n CursorTypeNode,\n AnyCursorNode\n} from './parser/cursor-nodes';\n","import type { ModelProvider, TypeInfo, TypeName } from './types';\nimport { CanonicalManager as createCanonicalManager, type Config, type CanonicalManager, type Resource } from '@atomic-ehr/fhir-canonical-manager';\nimport { translate, type FHIRSchema, type StructureDefinition } from '@atomic-ehr/fhirschema';\n\nexport interface FHIRModelContext {\n // Path in the resource (e.g., \"Patient.name.given\")\n path: string;\n \n // FHIRSchema for the current type and its ancestors\n schemaHierarchy: FHIRSchema[];\n \n // For union types (choice types)\n isUnion?: boolean;\n choices?: Array<{\n type: TypeName;\n code: string; // FHIR type code\n choiceName?: string; // The actual element name (e.g., valueString)\n schema?: FHIRSchema;\n }>;\n \n // Reference to the source schema\n canonicalUrl?: string;\n version?: string;\n}\n\nexport interface FHIRModelProviderConfig {\n packages: Array<{ name: string; version: string }>;\n cacheDir?: string;\n registryUrl?: string;\n}\n\n/**\n * FHIR ModelProvider implementation\n * \n * Note: This provider requires async initialization before use.\n * Call initialize() before using the synchronous methods.\n * \n * For best performance, pre-load common types during initialization.\n */\nexport class FHIRModelProvider implements ModelProvider<FHIRModelContext> {\n private canonicalManager: ReturnType<typeof createCanonicalManager>;\n private schemaCache: Map<string, FHIRSchema> = new Map();\n private hierarchyCache: Map<string, FHIRSchema[]> = new Map();\n private initialized = false;\n \n // Caches for discovered types\n private complexTypesCache?: string[];\n private primitiveTypesCache?: string[];\n private resourceTypesCache?: string[];\n \n // FHIR Primitives to FHIRPath types mapping\n private readonly typeMapping: Record<string, TypeName> = {\n 'boolean': 'Boolean',\n 'integer': 'Integer',\n 'string': 'String',\n 'decimal': 'Decimal',\n 'uri': 'String',\n 'url': 'String',\n 'canonical': 'String',\n 'base64Binary': 'String',\n 'instant': 'DateTime',\n 'date': 'Date',\n 'dateTime': 'DateTime',\n 'time': 'Time',\n 'code': 'String',\n 'oid': 'String',\n 'id': 'String',\n 'markdown': 'String',\n 'unsignedInt': 'Integer',\n 'positiveInt': 'Integer',\n 'uuid': 'String',\n 'xhtml': 'String',\n \n // FHIR Complex types that map to FHIRPath types\n 'Quantity': 'Quantity',\n 'SimpleQuantity': 'Quantity',\n 'Money': 'Quantity',\n 'Duration': 'Quantity',\n 'Age': 'Quantity',\n 'Distance': 'Quantity',\n 'Count': 'Quantity'\n };\n \n // Map FHIR primitive names to FHIRPath type names\n private readonly primitiveTypeMapping: Record<string, string> = {\n 'boolean': 'Boolean',\n 'string': 'String',\n 'integer': 'Integer',\n 'decimal': 'Decimal',\n 'date': 'Date',\n 'dateTime': 'DateTime',\n 'time': 'Time',\n 'instant': 'Instant',\n 'base64Binary': 'Base64Binary',\n 'uri': 'Uri',\n 'url': 'Url',\n 'canonical': 'Canonical',\n 'code': 'Code',\n 'oid': 'Oid',\n 'id': 'Id',\n 'markdown': 'Markdown',\n 'unsignedInt': 'UnsignedInt',\n 'positiveInt': 'PositiveInt',\n 'uuid': 'Uuid',\n 'xhtml': 'Xhtml'\n };\n \n constructor(private config: FHIRModelProviderConfig = {\n packages: [{ name: 'hl7.fhir.r4.core', version: '4.0.1' }]\n }) {\n const canonicalConfig: Config = {\n packages: config.packages.map(p => `${p.name}@${p.version}`),\n workingDir: config.cacheDir || './tmp/.fhir-cache'\n };\n \n if (config.registryUrl) {\n canonicalConfig.registry = config.registryUrl;\n }\n \n this.canonicalManager = createCanonicalManager(canonicalConfig);\n }\n \n async initialize(): Promise<void> {\n if (this.initialized) return;\n \n try {\n await this.canonicalManager.init();\n \n // Just discover type names for completions - schemas load lazily on demand\n await Promise.all([\n this.getResourceTypes(),\n this.getComplexTypes(),\n this.getPrimitiveTypes()\n ]);\n \n this.initialized = true;\n } catch (error) {\n console.error('Failed to initialize FHIRModelProvider:', error);\n // Mark as initialized even on failure to prevent repeated attempts\n // The provider will work in degraded mode (primitives only)\n this.initialized = true;\n }\n }\n \n private buildCanonicalUrl(typeName: string): string {\n // For R4 core types\n return `http://hl7.org/fhir/StructureDefinition/${typeName}`;\n }\n \n // Public method to get schema with automatic caching\n async getSchema(typeName: string): Promise<FHIRSchema | undefined> {\n // Check cache first\n if (this.schemaCache.has(typeName)) {\n return this.schemaCache.get(typeName);\n }\n \n try {\n // Resolve canonical URL for the type\n const canonicalUrl = this.buildCanonicalUrl(typeName);\n const resource = await this.canonicalManager.resolve(canonicalUrl);\n if (!resource || resource.resourceType !== 'StructureDefinition') {\n return undefined;\n }\n const structureDefinition = resource as unknown as StructureDefinition;\n \n // Convert to FHIRSchema\n const schema = translate(structureDefinition);\n this.schemaCache.set(typeName, schema);\n \n // Pre-cache the hierarchy\n await this.getSchemaHierarchyAsync(schema);\n \n return schema;\n } catch (error) {\n // Silently fail for unknown types - this is expected for non-FHIR types\n // like function names or property names that get speculatively checked\n return undefined;\n }\n }\n \n private async getSchemaHierarchyAsync(schema: FHIRSchema): Promise<FHIRSchema[]> {\n const cacheKey = schema.name || schema.url;\n \n // Check cache\n if (this.hierarchyCache.has(cacheKey)) {\n return this.hierarchyCache.get(cacheKey)!;\n }\n \n const hierarchy: FHIRSchema[] = [schema];\n let current = schema;\n \n // Walk up the inheritance chain\n // Include all base types including DomainResource, Resource, and Element\n while (current.base) {\n // Extract just the type name from the base URL if it's a full URL\n let baseTypeName = current.base;\n if (baseTypeName && baseTypeName.startsWith('http://')) {\n const parts = baseTypeName.split('/');\n baseTypeName = parts[parts.length - 1] || baseTypeName;\n }\n \n const baseSchema = await this.getSchema(baseTypeName);\n if (!baseSchema) break;\n \n hierarchy.push(baseSchema);\n current = baseSchema;\n }\n \n this.hierarchyCache.set(cacheKey, hierarchy);\n return hierarchy;\n }\n \n private extractTypeName(url: string): string {\n // Extract type name from FHIR structure definition URL\n // e.g., \"http://hl7.org/fhir/StructureDefinition/Element\" -> \"Element\"\n const parts = url.split('/');\n return parts[parts.length - 1] || url;\n }\n \n private getSchemaHierarchyCached(schema: FHIRSchema): FHIRSchema[] {\n const cacheKey = schema.name || schema.url;\n const cached = this.hierarchyCache.get(cacheKey);\n if (cached) return cached;\n \n // If not cached, build the hierarchy synchronously from cached schemas\n const hierarchy: FHIRSchema[] = [schema];\n let current = schema;\n \n while (current.base) {\n const baseTypeName = this.extractTypeName(current.base);\n const baseSchema = this.schemaCache.get(baseTypeName);\n if (!baseSchema) break;\n \n hierarchy.push(baseSchema);\n current = baseSchema;\n }\n \n // Cache for future use\n this.hierarchyCache.set(cacheKey, hierarchy);\n return hierarchy;\n }\n \n private mapToFHIRPathType(fhirType: string): TypeName {\n // If it's a mapped type (primitive or special types), use the mapping\n if (this.typeMapping[fhirType]) {\n return this.typeMapping[fhirType];\n }\n // Otherwise, keep the FHIR type name (for complex types like CodeableConcept)\n return fhirType as TypeName;\n }\n \n private isChoiceType(element: any): boolean {\n return element.type && Array.isArray(element.type) && element.type.length > 1;\n }\n \n private createUnionContext( element: any, path: string, parentSchema: FHIRSchema): FHIRModelContext {\n // Map choice names to their types\n const choices = element.choices.map((choiceName: string) => {\n // Get the actual element for this choice\n const choiceElement = parentSchema.elements?.[choiceName];\n const choiceType = choiceElement?.type || 'Any';\n \n return {\n type: this.mapToFHIRPathType(choiceType),\n code: choiceType,\n choiceName: choiceName\n };\n });\n \n return {\n path,\n schemaHierarchy: [],\n isUnion: true,\n choices,\n canonicalUrl: parentSchema.url,\n version: parentSchema.version\n };\n }\n \n // Async implementation with lazy loading\n async getType(typeName: string): Promise<TypeInfo<FHIRModelContext> | undefined> {\n // First check if this is a FHIRPath primitive type name\n const fhirpathPrimitives = ['Boolean', 'String', 'Integer', 'Decimal', 'Date', 'DateTime', 'Time', 'Any'];\n if (fhirpathPrimitives.includes(typeName)) {\n // Return the FHIRPath primitive type directly without trying to load a schema\n return {\n type: typeName as TypeName,\n namespace: 'FHIR',\n name: typeName,\n singleton: true,\n modelContext: {\n path: typeName,\n schemaHierarchy: []\n }\n };\n }\n \n // Check if it's a FHIR primitive type that maps to a FHIRPath type\n const mappedType = this.typeMapping[typeName];\n if (mappedType) {\n // For types that are both FHIRPath types and complex FHIR types (like Quantity),\n // we need to check if they have a schema\n // But skip primitive FHIRPath types that definitely don't have schemas\n const primitiveTypes = ['Boolean', 'String', 'Integer', 'Decimal', 'Date', 'DateTime', 'Time'];\n const isPrimitive = primitiveTypes.includes(mappedType);\n \n if (this.initialized && !isPrimitive) {\n const schema = await this.getSchema(typeName);\n if (schema) {\n // It's a complex type with properties\n const schemaHierarchy = await this.getSchemaHierarchyAsync(schema);\n return {\n type: mappedType,\n namespace: 'FHIR',\n name: typeName,\n singleton: true,\n modelContext: {\n path: typeName,\n schemaHierarchy,\n canonicalUrl: schema.url,\n version: schema.version\n }\n };\n }\n }\n \n // It's a pure primitive type without properties\n return {\n type: mappedType,\n namespace: 'FHIR',\n name: typeName,\n singleton: true,\n modelContext: {\n path: typeName,\n schemaHierarchy: []\n }\n };\n }\n \n // Complex types require initialization\n if (!this.initialized) {\n console.warn('FHIRModelProvider not initialized. Only primitive types available.');\n return undefined;\n }\n \n // Try to load schema lazily\n const schema = await this.getSchema(typeName);\n if (!schema) {\n // Schema not found - this is expected for non-type identifiers\n return undefined;\n }\n \n const schemaHierarchy = await this.getSchemaHierarchyAsync(schema);\n \n return {\n type: 'Any', // Complex types are 'Any' in FHIRPath\n namespace: 'FHIR',\n name: typeName,\n singleton: true,\n modelContext: {\n path: typeName,\n schemaHierarchy,\n canonicalUrl: schema.url,\n version: schema.version\n }\n };\n }\n \n async getElementType( parentType: TypeInfo<FHIRModelContext>, propertyName: string): Promise<TypeInfo<FHIRModelContext> | undefined> {\n const context = parentType.modelContext;\n if (!context) return undefined;\n \n // Handle union types (polymorphic fields like value[x])\n if (context.isUnion && context.choices) {\n // For union types, check if the property exists on any of the choice types\n for (const choice of context.choices) {\n // Get the type for this choice - use type field which has the proper case\n const choiceTypeName = choice.type;\n const choiceType = await this.getType(choiceTypeName);\n if (choiceType) {\n // Try to get the property from this choice type\n const elementType = await this.getElementType(choiceType, propertyName);\n if (elementType) {\n // Found the property on this choice type\n return elementType;\n }\n }\n }\n // Property not found on any choice type\n return undefined;\n }\n \n // Search through schema hierarchy for the property\n for (const schema of context.schemaHierarchy) {\n const element = schema.elements?.[propertyName];\n if (!element) continue;\n \n const path = `${context.path}.${propertyName}`;\n \n // Handle choice types - check if element has choices array\n if (element.choices && Array.isArray(element.choices)) {\n return {\n type: 'Any',\n namespace: 'FHIR',\n name: propertyName,\n singleton: !element.array,\n modelContext: this.createUnionContext(element, path, schema)\n };\n }\n \n // Handle regular types\n const elementType = Array.isArray(element.type) ? element.type[0] : element.type;\n const fhirpathType = this.mapToFHIRPathType(elementType);\n \n // Load schema from cache for complex types\n let elementSchemaHierarchy: FHIRSchema[] = [];\n \n // Special handling for BackboneElement - it has inline elements\n if (elementType === 'BackboneElement' && element.elements) {\n // Create a synthetic schema for the inline BackboneElement\n const inlineSchema: FHIRSchema = {\n name: `${schema.name}.${propertyName}`,\n type: 'BackboneElement',\n url: `${schema.url}#${propertyName}`,\n version: schema.version,\n kind: 'complex-type',\n class: 'complex-type',\n elements: element.elements,\n base: 'BackboneElement'\n } as FHIRSchema;\n elementSchemaHierarchy = [inlineSchema];\n } else if (!this.typeMapping[elementType]) {\n // For complex types, we need to load the schema and its hierarchy\n const elementSchema = await this.getSchema(elementType);\n if (elementSchema) {\n elementSchemaHierarchy = await this.getSchemaHierarchyAsync(elementSchema);\n }\n }\n \n return {\n type: fhirpathType,\n namespace: 'FHIR',\n name: elementType,\n singleton: !element.array,\n modelContext: {\n path,\n schemaHierarchy: elementSchemaHierarchy,\n canonicalUrl: schema.url,\n version: schema.version\n }\n };\n }\n \n return undefined;\n }\n \n ofType(\n type: TypeInfo<FHIRModelContext>,\n typeName: TypeName\n ): TypeInfo<FHIRModelContext> | undefined {\n const context = type.modelContext;\n \n // Handle union types\n if (context?.isUnion && context?.choices) {\n for (const choice of context.choices) {\n if (choice.type === typeName) {\n return {\n type: choice.type,\n namespace: 'FHIR',\n name: choice.code,\n singleton: type.singleton,\n modelContext: {\n path: context.path + `[${choice.code}]`,\n schemaHierarchy: [],\n canonicalUrl: context.canonicalUrl,\n version: context.version\n }\n };\n }\n }\n return undefined;\n }\n \n // For non-union types, check if the type matches or is a subtype\n // First check direct match on FHIRPath type\n if (type.type === typeName) {\n return type;\n }\n \n // Check if the type name matches\n if (type.name === typeName) {\n return type;\n }\n \n // Check if any of the schemas in the hierarchy match\n if (context?.schemaHierarchy) {\n for (const schema of context.schemaHierarchy) {\n if (schema.type === typeName || schema.name === typeName) {\n return type;\n }\n }\n }\n \n return undefined;\n }\n \n getElementNames(parentType: TypeInfo<FHIRModelContext>): string[] {\n const context = parentType.modelContext;\n if (!context) return [];\n \n const names: Set<string> = new Set();\n \n // Collect properties from all schemas in hierarchy\n for (const schema of context.schemaHierarchy) {\n if (schema.elements) {\n // Filter out choice-specific elements (e.g., deceasedBoolean when deceased exists)\n Object.keys(schema.elements).forEach(name => {\n const element = schema.elements![name];\n if (element && !element.choiceOf) {\n names.add(name);\n }\n });\n }\n }\n \n return Array.from(names);\n }\n\n async getChildrenType(parentType: TypeInfo<FHIRModelContext>): Promise<TypeInfo<FHIRModelContext> | undefined> {\n const elementNames = this.getElementNames(parentType);\n if (elementNames.length === 0) return undefined;\n \n // Collect all unique child types\n const childTypes = new Map<string, TypeInfo<FHIRModelContext>>();\n \n for (const elementName of elementNames) {\n const elementType = await this.getElementType(parentType, elementName);\n if (elementType) {\n // Use a combination of namespace and name as key to deduplicate\n const key = `${elementType.namespace || ''}.${elementType.name || elementType.type}`;\n childTypes.set(key, elementType);\n }\n }\n \n if (childTypes.size === 0) return undefined;\n \n // Create a union type representing all possible children\n return {\n type: 'Any',\n namespace: parentType.namespace,\n name: 'ChildrenUnion',\n singleton: false, // children() always returns a collection\n modelContext: {\n path: `${parentType.modelContext?.path || ''}.children()`,\n schemaHierarchy: [],\n isUnion: true,\n choices: Array.from(childTypes.values()).map(type => ({\n type: type.type as TypeName,\n code: type.name || type.type,\n namespace: type.namespace,\n modelContext: type.modelContext\n }))\n } as FHIRModelContext\n };\n }\n \n // Async helper methods for loading additional schemas\n async loadType(typeName: string): Promise<TypeInfo<FHIRModelContext> | undefined> {\n await this.getSchema(typeName);\n return this.getType(typeName);\n }\n\n // Get detailed information about elements of a type\n async getElements(typeName: string): Promise<Array<{ name: string; type: string; documentation?: string }>> {\n if (!this.initialized) {\n console.warn('FHIRModelProvider not initialized. Cannot get elements.');\n return [];\n }\n\n // Load schema lazily using the public getSchema method\n const schema = await this.getSchema(typeName);\n if (!schema || !schema.elements) {\n return [];\n }\n\n const elements: Array<{ name: string; type: string; documentation?: string }> = [];\n \n // Get all elements from this schema and its hierarchy\n const schemaHierarchy = await this.getSchemaHierarchyAsync(schema);\n const addedElements = new Set<string>();\n \n for (const currentSchema of schemaHierarchy) {\n if (currentSchema.elements) {\n for (const [elementName, element] of Object.entries(currentSchema.elements)) {\n // Skip choice-specific elements and already added elements\n if (element && !element.choiceOf && !addedElements.has(elementName)) {\n const elementType = Array.isArray(element.type) ? element.type[0] : element.type;\n elements.push({\n name: elementName,\n type: elementType + (element.array ? '[]' : ''),\n documentation: element.short\n });\n addedElements.add(elementName);\n }\n }\n }\n }\n \n return elements;\n }\n \n async getResourceTypes(): Promise<string[]> {\n if (this.resourceTypesCache) {\n return this.resourceTypesCache;\n }\n \n const resources = await this.canonicalManager.search({ \n kind: 'resource' \n });\n \n this.resourceTypesCache = resources\n .filter(r => r.resourceType === 'StructureDefinition')\n .map(r => (r as unknown as StructureDefinition).name)\n .filter((name): name is string => !!name)\n .sort();\n \n return this.resourceTypesCache || [];\n }\n \n async getComplexTypes(): Promise<string[]> {\n if (this.complexTypesCache) {\n return this.complexTypesCache;\n }\n \n const resources = await this.canonicalManager.search({ \n kind: 'complex-type' \n });\n \n this.complexTypesCache = resources\n .filter(r => r.resourceType === 'StructureDefinition')\n .map(r => r as unknown as StructureDefinition)\n .filter(sd => {\n // Only include base complex types, not extensions or constraints\n return sd.type !== 'Extension' &&\n sd.derivation !== 'constraint' &&\n !sd.name?.includes('.') && // Skip nested types\n (!sd.abstract || sd.name === 'BackboneElement'); // Keep BackboneElement\n })\n .map(sd => sd.name)\n .filter((name): name is string => !!name)\n .sort();\n \n return this.complexTypesCache || [];\n }\n \n async getPrimitiveTypes(): Promise<string[]> {\n if (this.primitiveTypesCache) {\n return this.primitiveTypesCache;\n }\n \n const resources = await this.canonicalManager.search({ \n kind: 'primitive-type' \n });\n \n // Get FHIR primitive names and map to FHIRPath names\n const fhirPrimitives = resources\n .filter(r => r.resourceType === 'StructureDefinition')\n .map(r => (r as unknown as StructureDefinition).name)\n .filter((name): name is string => !!name);\n \n this.primitiveTypesCache = fhirPrimitives\n .map(name => this.primitiveTypeMapping[name] || name)\n .sort();\n \n return this.primitiveTypesCache || [];\n }\n\n}","import type { TypeInfo, ASTNode, Diagnostic } from './types';\nimport type { FHIRPathValue } from './interpreter/boxing';\nimport { NodeType, DiagnosticSeverity } from './types';\nimport { parse } from './parser';\nimport { Analyzer } from './analyzer';\nimport { Interpreter } from './interpreter';\nimport { RuntimeContextManager } from './interpreter/runtime-context';\nimport type { RuntimeContext } from './types';\n\nexport interface ASTMetadata {\n complexity: number;\n depth: number;\n operationCount: Map<string, number>;\n}\n\nexport interface InspectResult {\n result: FHIRPathValue[];\n \n ast: {\n node: ASTNode;\n metadata: ASTMetadata;\n };\n \n diagnostics: {\n warnings: Diagnostic[];\n hints: Array<{message: string; suggestion?: string}>;\n };\n \n performance: {\n parseTime: number;\n analyzeTime: number;\n evalTime: number;\n totalTime: number;\n operationTimings: Map<string, number>;\n };\n \n traces?: Array<{\n label: string;\n value: FHIRPathValue[];\n timestamp: number;\n }>;\n}\n\nexport interface InspectOptions {\n input?: any;\n variables?: Record<string, any>;\n includeTraces?: boolean;\n maxDepth?: number;\n}\n\nclass PerformanceTracker {\n private timings = new Map<string, number>();\n private startTimes = new Map<string, number>();\n \n start(name: string): void {\n this.startTimes.set(name, performance.now());\n }\n \n end(name: string): void {\n const startTime = this.startTimes.get(name);\n if (startTime !== undefined) {\n const duration = performance.now() - startTime;\n this.timings.set(name, duration);\n this.startTimes.delete(name);\n }\n }\n \n get(name: string): number {\n return this.timings.get(name) ?? 0;\n }\n \n getAll(): Map<string, number> {\n return new Map(this.timings);\n }\n}\n\nfunction analyzeAST(node: ASTNode, maxDepth = 100): ASTMetadata {\n const operationCount = new Map<string, number>();\n let complexity = 0;\n let maxDepthFound = 0;\n \n function visit(n: ASTNode, depth: number): void {\n if (depth > maxDepth) return;\n maxDepthFound = Math.max(maxDepthFound, depth);\n \n // Count operation types\n const opKey = n.type;\n operationCount.set(opKey, (operationCount.get(opKey) ?? 0) + 1);\n \n // Calculate complexity based on node type\n switch (n.type) {\n case NodeType.Binary:\n complexity += 2;\n const binary = n as any;\n visit(binary.left, depth + 1);\n visit(binary.right, depth + 1);\n break;\n \n case NodeType.Function:\n complexity += 3;\n const func = n as any;\n if (func.name) visit(func.name, depth + 1);\n func.args?.forEach((arg: ASTNode) => visit(arg, depth + 1));\n break;\n \n case NodeType.Unary:\n complexity += 1;\n visit((n as any).operand, depth + 1);\n break;\n \n case NodeType.Index:\n complexity += 2;\n const index = n as any;\n visit(index.expression, depth + 1);\n visit(index.index, depth + 1);\n break;\n \n case NodeType.Collection:\n complexity += 1;\n (n as any).elements?.forEach((el: ASTNode) => visit(el, depth + 1));\n break;\n \n case NodeType.MembershipTest:\n complexity += 2;\n const membership = n as any;\n visit(membership.expression, depth + 1);\n if (membership.typeExpression) visit(membership.typeExpression, depth + 1);\n break;\n \n case NodeType.TypeCast:\n complexity += 2;\n const typeCast = n as any;\n visit(typeCast.expression, depth + 1);\n if (typeCast.typeExpression) visit(typeCast.typeExpression, depth + 1);\n break;\n \n case NodeType.Literal:\n case NodeType.Identifier:\n case NodeType.Variable:\n case NodeType.TypeReference:\n complexity += 1;\n break;\n }\n }\n \n visit(node, 0);\n \n return {\n complexity,\n depth: maxDepthFound,\n operationCount\n };\n}\n\nfunction generateHints(ast: ASTNode): Array<{message: string; suggestion?: string}> {\n const hints: Array<{message: string; suggestion?: string}> = [];\n \n function visit(node: ASTNode): void {\n switch (node.type) {\n case NodeType.Binary:\n const binary = node as any;\n \n // Hint for chain of where() calls\n if (binary.operator === '.' && \n binary.right.type === NodeType.Function && \n (binary.right as any).name?.name === 'where') {\n const leftFunc = binary.left.type === NodeType.Binary && \n (binary.left as any).right?.type === NodeType.Function &&\n (binary.left as any).right?.name?.name === 'where';\n if (leftFunc) {\n hints.push({\n message: 'Multiple where() calls detected',\n suggestion: 'Consider combining conditions with \"and\" for better performance'\n });\n }\n }\n \n // Hint for unnecessary empty() check before first()\n if (binary.operator === '.' && \n binary.right.type === NodeType.Function &&\n (binary.right as any).name?.name === 'first' &&\n binary.left.type === NodeType.Binary &&\n (binary.left as any).right?.type === NodeType.Function &&\n (binary.left as any).right?.name?.name === 'empty') {\n hints.push({\n message: 'Unnecessary empty() check before first()',\n suggestion: 'first() returns empty collection if input is empty'\n });\n }\n \n visit(binary.left);\n visit(binary.right);\n break;\n \n case NodeType.Function:\n const func = node as any;\n \n // Hint for count() > 0 pattern\n if (func.name?.name === 'count' && func.parent?.type === NodeType.Binary) {\n const parent = func.parent as any;\n if (parent.operator === '>' && \n parent.right?.type === NodeType.Literal && \n parent.right?.value === 0) {\n hints.push({\n message: 'count() > 0 pattern detected',\n suggestion: 'Consider using exists() for better clarity'\n });\n }\n }\n \n func.args?.forEach((arg: ASTNode) => visit(arg));\n break;\n \n case NodeType.Collection:\n (node as any).elements?.forEach((el: ASTNode) => visit(el));\n break;\n \n case NodeType.Unary:\n visit((node as any).operand);\n break;\n \n case NodeType.Index:\n const index = node as any;\n visit(index.expression);\n visit(index.index);\n break;\n \n case NodeType.MembershipTest:\n const membership = node as any;\n visit(membership.expression);\n if (membership.typeExpression) visit(membership.typeExpression);\n break;\n \n case NodeType.TypeCast:\n const typeCast = node as any;\n visit(typeCast.expression);\n if (typeCast.typeExpression) visit(typeCast.typeExpression);\n break;\n }\n }\n \n visit(ast);\n return hints;\n}\n\nexport async function inspect(\n expression: string, \n options: InspectOptions = {}\n): Promise<InspectResult> {\n const tracker = new PerformanceTracker();\n const traces: InspectResult['traces'] = [];\n \n tracker.start('total');\n \n // Parse\n tracker.start('parse');\n const parseResult = parse(expression);\n const ast = parseResult.ast;\n tracker.end('parse');\n \n // Analyze\n tracker.start('analyze');\n const analyzer = new Analyzer();\n const analysisResult = await analyzer.analyze(ast, options.variables);\n const warnings = analysisResult.diagnostics.filter(d => d.severity === DiagnosticSeverity.Warning);\n const hints = generateHints(ast);\n tracker.end('analyze');\n \n // Analyze AST metadata\n const metadata = analyzeAST(ast, options.maxDepth);\n \n // Setup context for evaluation\n const input = options.input === undefined ? [] : Array.isArray(options.input) ? options.input : [options.input];\n let context = RuntimeContextManager.create(input);\n context = RuntimeContextManager.setVariable(context, '$this', input);\n \n if (options.variables) {\n for (const [key, value] of Object.entries(options.variables)) {\n const varValue = Array.isArray(value) ? value : [value];\n context = RuntimeContextManager.setVariable(context, key, varValue);\n }\n }\n \n // Setup trace collection if requested\n if (options.includeTraces) {\n // We'll collect traces by intercepting the trace function during evaluation\n // This will be implemented when trace() is called during evaluation\n }\n \n // Evaluate\n tracker.start('eval');\n const interpreter = new Interpreter();\n \n // Track operation timings\n const operationTimings = new Map<string, number>();\n const originalEvaluate = interpreter.evaluate.bind(interpreter);\n interpreter.evaluate = async function(node: ASTNode, inputData: any[], ctx: RuntimeContext) {\n const opStart = performance.now();\n const result = await originalEvaluate(node, inputData, ctx);\n const opTime = performance.now() - opStart;\n \n const opKey = node.type === NodeType.Function ? \n `Function:${(node as any).name?.name || 'unknown'}` : \n node.type === NodeType.Binary ? \n `Binary:${(node as any).operator}` :\n node.type;\n \n operationTimings.set(opKey, (operationTimings.get(opKey) ?? 0) + opTime);\n \n return result;\n };\n \n const result = await interpreter.evaluate(ast, input, context);\n tracker.end('eval');\n \n tracker.end('total');\n \n return {\n result: result.value,\n ast: {\n node: ast,\n metadata\n },\n diagnostics: {\n warnings,\n hints\n },\n performance: {\n parseTime: tracker.get('parse'),\n analyzeTime: tracker.get('analyze'),\n evalTime: tracker.get('eval'),\n totalTime: tracker.get('total'),\n operationTimings\n },\n ...(options.includeTraces && { traces })\n };\n}\n","import { parse } from './parser';\nimport { Analyzer } from './analyzer';\nimport type { TypeInfo, ModelProvider } from './types';\n\nimport { CursorContext, isCursorNode } from './parser/cursor-nodes';\nimport type { AnyCursorNode } from './parser/cursor-nodes';\nimport { registry } from './registry';\n\n/**\n * Type guard for ErrorNode\n */\nfunction isErrorNode(node: any): node is import('./types').ErrorNode {\n return node.type === 'Error';\n}\n\n/**\n * Find the cursor node in the AST\n */\nfunction findCursorNode(node: import('./types').ASTNode): AnyCursorNode | undefined {\n if (isCursorNode(node)) {\n return node as AnyCursorNode;\n }\n\n switch (node.type) {\n case 'Binary':\n return findCursorNode(node.left) || findCursorNode(node.right);\n case 'Unary':\n return findCursorNode(node.operand);\n case 'Function':\n // It's more likely for the cursor to be in the arguments, so check them first.\n for (const arg of node.arguments) {\n const found = findCursorNode(arg);\n if (found) return found;\n }\n return findCursorNode(node.name);\n case 'Index':\n return findCursorNode(node.expression) || findCursorNode(node.index);\n case 'Collection':\n for (const element of node.elements) {\n const found = findCursorNode(element);\n if (found) return found;\n }\n break;\n case 'TypeCast':\n return findCursorNode((node as any).expression);\n case 'MembershipTest':\n return findCursorNode((node as any).expression);\n }\n\n return undefined;\n}\n\n\n/**\n * Kind of completion item\n */\nexport enum CompletionKind {\n Property = 'property',\n Function = 'function',\n Variable = 'variable',\n Operator = 'operator',\n Type = 'type',\n Keyword = 'keyword',\n Constant = 'constant'\n}\n\n/**\n * Represents a completion item\n */\nexport interface CompletionItem {\n /** Display text */\n label: string;\n /** Kind of completion */\n kind: CompletionKind;\n /** Short description */\n detail?: string;\n /** Full documentation */\n documentation?: string;\n /** Text to insert (if different from label) */\n insertText?: string;\n /** Sort text for ordering (if different from label) */\n sortText?: string;\n}\n\n/**\n * Options for completion provider\n */\nexport interface CompletionOptions {\n /** Model provider for FHIR types */\n modelProvider?: ModelProvider;\n /** Variables in scope */\n variables?: Record<string, any>;\n /** Input type for the expression */\n inputType?: TypeInfo;\n /** Maximum number of completions to return */\n maxCompletions?: number;\n}\n\n/**\n * Provides context-aware completions for FHIRPath expressions\n */\nexport async function provideCompletions(\n expression: string,\n cursorPosition: number,\n options: CompletionOptions = {}\n): Promise<CompletionItem[]> {\n const { modelProvider, variables, inputType, maxCompletions = 100 } = options;\n \n try {\n // Parse with cursor\n const parseResult = parse(expression, {\n mode: 'lsp',\n cursorPosition,\n });\n if (!parseResult.ast) {\n return [];\n }\n\n // Find the cursor node\n const cursorNode = findCursorNode(parseResult.ast);\n if (!cursorNode || isErrorNode(cursorNode)) {\n return [];\n }\n \n // Analyze with cursor mode\n const analyzer = new Analyzer(modelProvider);\n const analysis = await analyzer.analyze(\n parseResult.ast,\n variables,\n inputType,\n { cursorMode: true }\n );\n \n // Extract cursor context\n const { typeBeforeCursor, functionCall } = analysis.cursorContext || {};\n \n // Get partial text for filtering\n // Determine partial text for filtering (prefer AST-provided, else infer from source)\n let partialText = (cursorNode as any).partialText || '';\n if (!partialText && cursorNode.context === CursorContext.Type) {\n // Heuristic: scan left from cursor to preceding '(' or whitespace and take the identifier fragment\n const cp = cursorPosition;\n const left = expression.slice(0, cp);\n // Take the trailing run of identifier characters\n const m = left.match(/[A-Za-z][A-Za-z0-9.]*$/);\n if (m) {\n partialText = m[0];\n }\n }\n \n // Generate completions based on cursor context\n let completions: CompletionItem[] = [];\n \n switch (cursorNode.context) {\n case CursorContext.Identifier:\n completions = await getIdentifierCompletions(typeBeforeCursor, modelProvider);\n break;\n \n case CursorContext.Operator:\n // Fallback to provided inputType if analyzer did not provide typeBeforeCursor\n completions = getOperatorCompletions(typeBeforeCursor || (inputType as any));\n // Post-filter: when left side is a collection, exclude operators that require singleton left (e.g., 'in')\n const leftType = (typeBeforeCursor || (inputType as any));\n if (leftType && leftType.singleton === false) {\n completions = completions.filter(c => c.label !== 'in');\n }\n break;\n \n case CursorContext.Type:\n completions = await getTypeCompletions(cursorNode, modelProvider);\n break;\n \n case CursorContext.Argument:\n completions = await getArgumentCompletions(cursorNode, typeBeforeCursor, modelProvider, variables, functionCall);\n break;\n \n case CursorContext.Index:\n completions = getIndexCompletions(typeBeforeCursor, variables);\n break;\n }\n \n // Filter by partial text\n if (partialText) {\n completions = filterCompletions(completions, partialText);\n }\n \n // Sort and limit\n completions = rankCompletions(completions);\n if (maxCompletions > 0 && completions.length > maxCompletions) {\n completions = completions.slice(0, maxCompletions);\n }\n \n return completions;\n } catch (error) {\n // Return empty array on error\n return [];\n }\n}\n\n/**\n * Get general completions when no specific context\n */\nfunction getGeneralCompletions(): CompletionItem[] {\n const completions: CompletionItem[] = [];\n \n // Get operators from registry\n const operatorNames = registry.listOperators();\n for (const opName of operatorNames) {\n const opDef = registry.getOperatorDefinition(opName);\n if (opDef) {\n completions.push({\n label: opDef.symbol,\n kind: CompletionKind.Operator,\n detail: opDef.description || `${opDef.name} operator`\n });\n }\n }\n \n // No hardcoded constants - these should come from context\n \n return completions;\n}\n\n/**\n * Check if a function is applicable to a given type\n */\nfunction isFunctionApplicable(funcDef: any, typeInfo: TypeInfo): boolean {\n if (!typeInfo || !typeInfo.type) return true;\n // Pass type with collection info: append [] if not singleton\n const typeForRegistry = typeInfo.singleton === false \n ? `${typeInfo.type}[]` \n : typeInfo.type;\n return registry.isFunctionApplicableToType(funcDef.name, typeForRegistry);\n}\n\n/**\n * Check if an operator is applicable to a given type\n */\nfunction isOperatorApplicable(opDef: any, typeInfo: TypeInfo): boolean {\n if (!typeInfo || !typeInfo.type) return true;\n const isCollection = typeInfo.singleton === false;\n // If left operand must be singleton for all signatures, do not suggest for collections\n if (isCollection && opDef.signatures && opDef.signatures.length > 0) {\n const allowsCollection = opDef.signatures.some((s: any) => s.left && s.left.singleton === false);\n if (!allowsCollection) {\n return false;\n }\n }\n const typeForRegistry = isCollection ? `${typeInfo.type}[]` : typeInfo.type;\n return registry.isOperatorApplicableToType(opDef.symbol, typeForRegistry);\n}\n\n/**\n * Get sort text for operator to ensure common operators appear first\n */\nfunction getSortTextForOperator(opDef: any): string {\n // Common operators should appear first\n const commonOps = ['.', '=', '!=', '<', '>', '<=', '>=', '+', '-', 'and', 'or'];\n const index = commonOps.indexOf(opDef.symbol);\n if (index >= 0) {\n return `0${index.toString().padStart(2, '0')}_${opDef.symbol}`;\n }\n return `1_${opDef.symbol}`;\n}\n\n/**\n * Get completions for identifier context (after dot)\n */\nasync function getIdentifierCompletions(\n typeBeforeCursor?: TypeInfo,\n modelProvider?: ModelProvider\n): Promise<CompletionItem[]> {\n const completions: CompletionItem[] = [];\n \n // Add elements from type if available\n if (typeBeforeCursor && modelProvider) {\n // Use the name property which contains the actual FHIR type name\n // Skip if type is 'Any' as it's not a real FHIR type\n const typeName = typeBeforeCursor.name || typeBeforeCursor.type;\n if (typeName && typeName !== 'Any') {\n const elements = await modelProvider.getElements(typeName);\n if (elements.length > 0) {\n for (const element of elements) {\n completions.push({\n label: element.name,\n kind: CompletionKind.Property,\n detail: element.type,\n documentation: element.documentation\n });\n }\n }\n }\n }\n \n // Add FHIRPath functions from registry\n const functionNames = registry.listFunctions();\n for (const name of functionNames) {\n const funcDef = registry.getFunction(name);\n if (funcDef) {\n // Check if function is appropriate for the current type context\n const isApplicable = !typeBeforeCursor || isFunctionApplicable(funcDef, typeBeforeCursor);\n \n if (isApplicable) {\n // Determine if any signature takes parameters\n const hasParams = funcDef.signatures?.some(sig => (sig.parameters?.length ?? 0) > 0) ?? false;\n const funcDescription = funcDef.description || `FHIRPath ${name} function`;\n \n completions.push({\n label: name,\n kind: CompletionKind.Function,\n detail: funcDescription,\n insertText: name + (hasParams ? '()' : '')\n });\n }\n }\n }\n \n // Add type-specific functions from registry\n if (typeBeforeCursor && typeBeforeCursor.type) {\n // Pass type with collection info: append [] if not singleton\n const typeForRegistry = typeBeforeCursor.singleton === false \n ? `${typeBeforeCursor.type}[]` \n : typeBeforeCursor.type;\n const typeFunctions = registry.getFunctionsForType(typeForRegistry);\n for (const func of typeFunctions) {\n // Check if function is already added from general functions\n if (!completions.some(c => c.label === func.name)) {\n const hasParams = func.signatures?.some(sig => (sig.parameters?.length ?? 0) > 0) ?? false;\n completions.push({\n label: func.name,\n kind: CompletionKind.Function,\n detail: func.description || `FHIRPath ${func.name} function`,\n insertText: func.name + (hasParams ? '()' : '')\n });\n }\n }\n }\n \n return completions;\n}\n\n/**\n * Get completions for operator context (between expressions)\n */\nfunction getOperatorCompletions(typeBeforeCursor?: TypeInfo): CompletionItem[] {\n const completions: CompletionItem[] = [];\n const addedOperators = new Set<string>();\n \n // Get all operators from registry\n const operatorNames = registry.listOperators();\n \n for (const opName of operatorNames) {\n const opDef = registry.getOperatorDefinition(opName);\n if (opDef) {\n // If we clearly have a collection to the left and no signature allows a collection left operand, skip early\n if (typeBeforeCursor && typeBeforeCursor.singleton === false && opDef.signatures && opDef.signatures.length > 0) {\n const allowsCollection = opDef.signatures.some((s: any) => s.left && s.left.singleton === false);\n if (!allowsCollection) {\n continue;\n }\n }\n // Check if operator is applicable to the current type\n const isApplicable = !typeBeforeCursor || isOperatorApplicable(opDef, typeBeforeCursor);\n \n if (isApplicable && !addedOperators.has(opDef.symbol)) {\n completions.push({\n label: opDef.symbol,\n kind: CompletionKind.Operator,\n detail: opDef.description || `${opDef.name} operator`,\n sortText: getSortTextForOperator(opDef)\n });\n addedOperators.add(opDef.symbol);\n }\n }\n }\n \n return completions;\n}\n\n/**\n * Get completions for type context (after is/as/ofType)\n */\nasync function getTypeCompletions(\n cursorNode: AnyCursorNode,\n modelProvider?: ModelProvider\n): Promise<CompletionItem[]> {\n const completions: CompletionItem[] = [];\n \n // Primitive types - only if modelProvider is available\n if (modelProvider) {\n const primitiveTypes = await modelProvider.getPrimitiveTypes();\n for (const type of primitiveTypes) {\n completions.push({\n label: type,\n kind: CompletionKind.Type,\n detail: 'FHIRPath primitive type',\n sortText: `0_${type}` // Priority 0 for primitives\n });\n }\n \n // Complex types\n const complexTypes = await modelProvider.getComplexTypes();\n for (const type of complexTypes) {\n completions.push({\n label: type,\n kind: CompletionKind.Type,\n detail: 'FHIR complex type',\n sortText: `1_${type}` // Priority 1 for complex types\n });\n }\n }\n \n // Always add resource types when we have a model provider\n // They're valid type names in contexts like ofType()\n if (modelProvider) {\n const resourceTypes = await modelProvider.getResourceTypes();\n for (const type of resourceTypes) {\n completions.push({\n label: type,\n kind: CompletionKind.Type,\n detail: 'FHIR resource type',\n sortText: `2_${type}` // Priority 2 for resource types\n });\n }\n }\n \n return completions;\n}\n\n/**\n * Get completions for argument context (in function arguments)\n */\nasync function getArgumentCompletions(\n cursorNode: AnyCursorNode,\n typeBeforeCursor?: TypeInfo,\n modelProvider?: ModelProvider,\n variables?: Record<string, any>,\n functionCall?: {\n definition: import('./types').FunctionDefinition;\n argumentIndex: number;\n }\n): Promise<CompletionItem[]> {\n // Inspect all overloads to determine parameter kinds for this argument position\n if (functionCall?.definition && functionCall.argumentIndex >= 0) {\n const argIndex = functionCall.argumentIndex;\n let expectsTypeReference = false;\n let expectsLambda = false;\n\n for (const sig of functionCall.definition.signatures) {\n const param = sig.parameters[argIndex];\n if (!param) {\n continue;\n }\n if (param.typeReference) {\n expectsTypeReference = true;\n }\n if (param.expression) {\n expectsLambda = true;\n }\n }\n\n if (expectsTypeReference) {\n // This parameter expects a type name, provide type completions\n return getTypeCompletions(cursorNode, modelProvider);\n }\n\n // If lambda is expected, suggest element properties from the item type below\n // (continue to build completions; variables will also be added)\n const completions: CompletionItem[] = [];\n\n // Add user variables if available\n if (variables) {\n for (const varName of Object.keys(variables)) {\n if (varName === '$this') {\n completions.push({\n label: '$this',\n kind: CompletionKind.Variable,\n detail: 'Current item in iteration'\n });\n } else if (varName === '$index') {\n completions.push({\n label: '$index',\n kind: CompletionKind.Variable,\n detail: 'Current index in iteration'\n });\n } else {\n completions.push({\n label: varName.startsWith('%') ? varName : '%' + varName,\n kind: CompletionKind.Variable,\n detail: 'User-defined variable'\n });\n }\n }\n }\n\n if (expectsLambda && typeBeforeCursor && modelProvider) {\n const itemType = { ...typeBeforeCursor, singleton: true };\n const typeName = itemType.name || itemType.type;\n if (typeName && typeName !== 'Any') {\n const elements = await modelProvider.getElements(typeName);\n if (elements.length > 0) {\n for (const element of elements) {\n completions.push({\n label: element.name,\n kind: CompletionKind.Property,\n detail: element.type\n });\n }\n }\n }\n }\n\n // If overloads do not indicate typeRef or lambda, fall through to variables-only completions below\n if (completions.length > 0) {\n return completions;\n }\n }\n const completions: CompletionItem[] = [];\n const argNode = cursorNode as any;\n\n // Default: suggest variables in scope\n if (variables) {\n for (const varName of Object.keys(variables)) {\n if (varName === '$this') {\n completions.push({\n label: '$this',\n kind: CompletionKind.Variable,\n detail: 'Current item in iteration'\n });\n } else if (varName === '$index') {\n completions.push({\n label: '$index',\n kind: CompletionKind.Variable,\n detail: 'Current index in iteration'\n });\n } else {\n completions.push({\n label: varName.startsWith('%') ? varName : '%' + varName,\n kind: CompletionKind.Variable,\n detail: 'User-defined variable'\n });\n }\n }\n }\n\n // No hardcoded constants - these should come from context or be typed by user\n return completions;\n}\n\n/**\n * Get completions for index context (in brackets)\n */\nfunction getIndexCompletions(\n typeBeforeCursor?: TypeInfo,\n variables?: Record<string, any>\n): CompletionItem[] {\n const completions: CompletionItem[] = [];\n \n // Add user variables if available\n if (variables) {\n // Add $this if it's in scope (for consistency with argument context)\n if ('$this' in variables) {\n completions.push({\n label: '$this',\n kind: CompletionKind.Variable,\n detail: 'Current item'\n });\n }\n\n // Add $index if it's in scope (should be provided by context)\n if ('$index' in variables) {\n completions.push({\n label: '$index',\n kind: CompletionKind.Variable,\n detail: 'Current index'\n });\n }\n \n // Add other user variables\n for (const varName of Object.keys(variables)) {\n if (!varName.startsWith('$')) {\n completions.push({\n label: varName.startsWith('%') ? varName : '%' + varName,\n kind: CompletionKind.Variable,\n detail: 'User-defined variable'\n });\n }\n }\n }\n \n // Get index-related functions from registry\n const functionNames = registry.listFunctions();\n for (const name of functionNames) {\n if (name === 'first' || name === 'last') {\n const funcDef = registry.getFunction(name);\n if (funcDef) {\n completions.push({\n label: name + '()',\n kind: CompletionKind.Function,\n detail: funcDef.description || `${name} function`,\n insertText: name + '()'\n });\n }\n }\n }\n \n return completions;\n}\n\n\n/**\n * Filter completions by partial text\n */\nfunction filterCompletions(completions: CompletionItem[], partialText: string): CompletionItem[] {\n const lowerPartial = partialText.toLowerCase();\n return completions.filter(item => \n item.label.toLowerCase().startsWith(lowerPartial)\n );\n}\n\n/**\n * Rank completions by relevance\n */\nfunction rankCompletions(completions: CompletionItem[]): CompletionItem[] {\n return completions.sort((a, b) => {\n // First check if items have sortText\n if (a.sortText || b.sortText) {\n const aSortText = a.sortText || a.label;\n const bSortText = b.sortText || b.label;\n return aSortText.localeCompare(bSortText);\n }\n \n // Sort by kind priority\n const kindPriority: Record<CompletionKind, number> = {\n [CompletionKind.Property]: 1,\n [CompletionKind.Variable]: 2,\n [CompletionKind.Function]: 3,\n [CompletionKind.Operator]: 4,\n [CompletionKind.Type]: 5,\n [CompletionKind.Keyword]: 6,\n [CompletionKind.Constant]: 7\n };\n \n const aPriority = kindPriority[a.kind] || 10;\n const bPriority = kindPriority[b.kind] || 10;\n \n if (aPriority !== bPriority) {\n return aPriority - bPriority;\n }\n \n // Then alphabetically\n return a.label.localeCompare(b.label);\n });\n}\n"]}
|