@atomic-ehr/fhirpath 0.0.1 → 0.0.2-canary.261bb9b.20250811212042

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.
Files changed (104) hide show
  1. package/README.md +62 -56
  2. package/dist/index.d.ts +368 -99
  3. package/dist/index.js +3623 -1253
  4. package/dist/index.js.map +1 -1
  5. package/package.json +1 -1
  6. package/src/analyzer.ts +779 -120
  7. package/src/boxing.ts +124 -0
  8. package/src/completion-provider.ts +636 -0
  9. package/src/cursor-nodes.ts +111 -0
  10. package/src/errors.ts +247 -0
  11. package/src/index.ts +97 -14
  12. package/src/inspect.ts +309 -176
  13. package/src/interpreter.ts +380 -71
  14. package/src/lexer.ts +1 -0
  15. package/src/model-provider.ts +282 -39
  16. package/src/operations/abs-function.ts +40 -16
  17. package/src/operations/aggregate-function.ts +21 -10
  18. package/src/operations/all-function.ts +23 -11
  19. package/src/operations/allFalse-function.ts +14 -9
  20. package/src/operations/allTrue-function.ts +14 -9
  21. package/src/operations/and-operator.ts +21 -12
  22. package/src/operations/anyFalse-function.ts +11 -7
  23. package/src/operations/anyTrue-function.ts +11 -7
  24. package/src/operations/as-operator.ts +2 -1
  25. package/src/operations/ceiling-function.ts +14 -8
  26. package/src/operations/children-function.ts +98 -0
  27. package/src/operations/combine-function.ts +10 -6
  28. package/src/operations/combine-operator.ts +19 -5
  29. package/src/operations/contains-function.ts +26 -12
  30. package/src/operations/contains-operator.ts +15 -7
  31. package/src/operations/count-function.ts +7 -4
  32. package/src/operations/defineVariable-function.ts +11 -7
  33. package/src/operations/descendants-function.ts +64 -0
  34. package/src/operations/distinct-function.ts +21 -7
  35. package/src/operations/div-operator.ts +16 -3
  36. package/src/operations/divide-operator.ts +11 -6
  37. package/src/operations/dot-operator.ts +4 -2
  38. package/src/operations/empty-function.ts +7 -4
  39. package/src/operations/endsWith-function.ts +28 -14
  40. package/src/operations/equal-operator.ts +19 -7
  41. package/src/operations/equivalent-operator.ts +16 -11
  42. package/src/operations/exclude-function.ts +18 -14
  43. package/src/operations/exists-function.ts +19 -10
  44. package/src/operations/first-function.ts +12 -7
  45. package/src/operations/floor-function.ts +14 -8
  46. package/src/operations/greater-operator.ts +10 -5
  47. package/src/operations/greater-or-equal-operator.ts +10 -5
  48. package/src/operations/iif-function.ts +27 -23
  49. package/src/operations/implies-operator.ts +23 -8
  50. package/src/operations/in-operator.ts +18 -8
  51. package/src/operations/index.ts +3 -0
  52. package/src/operations/indexOf-function.ts +28 -14
  53. package/src/operations/intersect-function.ts +23 -24
  54. package/src/operations/is-operator.ts +67 -15
  55. package/src/operations/isDistinct-function.ts +17 -9
  56. package/src/operations/join-function.ts +22 -9
  57. package/src/operations/last-function.ts +12 -7
  58. package/src/operations/length-function.ts +17 -8
  59. package/src/operations/less-operator.ts +10 -5
  60. package/src/operations/less-or-equal-operator.ts +10 -5
  61. package/src/operations/less-than.ts +26 -2
  62. package/src/operations/lower-function.ts +17 -8
  63. package/src/operations/minus-operator.ts +10 -5
  64. package/src/operations/mod-operator.ts +20 -3
  65. package/src/operations/multiply-operator.ts +12 -7
  66. package/src/operations/not-equal-operator.ts +16 -7
  67. package/src/operations/not-equivalent-operator.ts +16 -11
  68. package/src/operations/not-function.ts +17 -7
  69. package/src/operations/ofType-function.ts +139 -0
  70. package/src/operations/or-operator.ts +21 -12
  71. package/src/operations/plus-operator.ts +19 -7
  72. package/src/operations/power-function.ts +27 -13
  73. package/src/operations/replace-function.ts +33 -14
  74. package/src/operations/round-function.ts +29 -12
  75. package/src/operations/select-function.ts +17 -9
  76. package/src/operations/single-function.ts +10 -6
  77. package/src/operations/skip-function.ts +18 -9
  78. package/src/operations/split-function.ts +30 -13
  79. package/src/operations/sqrt-function.ts +14 -8
  80. package/src/operations/startsWith-function.ts +26 -12
  81. package/src/operations/subsetOf-function.ts +20 -15
  82. package/src/operations/substring-function.ts +43 -24
  83. package/src/operations/supersetOf-function.ts +20 -15
  84. package/src/operations/tail-function.ts +8 -4
  85. package/src/operations/take-function.ts +18 -9
  86. package/src/operations/toBoolean-function.ts +23 -14
  87. package/src/operations/toDecimal-function.ts +18 -9
  88. package/src/operations/toInteger-function.ts +22 -12
  89. package/src/operations/toString-function.ts +26 -16
  90. package/src/operations/trace-function.ts +19 -10
  91. package/src/operations/trim-function.ts +16 -7
  92. package/src/operations/truncate-function.ts +14 -8
  93. package/src/operations/unary-minus-operator.ts +23 -13
  94. package/src/operations/unary-plus-operator.ts +2 -1
  95. package/src/operations/union-function.ts +25 -28
  96. package/src/operations/union-operator.ts +2 -1
  97. package/src/operations/upper-function.ts +17 -8
  98. package/src/operations/where-function.ts +20 -11
  99. package/src/operations/xor-operator.ts +9 -4
  100. package/src/parser.ts +527 -8
  101. package/src/quantity-value.ts +4 -8
  102. package/src/registry.ts +147 -5
  103. package/src/types.ts +42 -19
  104. package/src/parser-base.ts +0 -400
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lexer.ts","../src/types.ts","../src/operations/index.ts","../src/quantity-value.ts","../src/operations/plus-operator.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/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/union-operator.ts","../src/operations/combine-operator.ts","../src/operations/dot-operator.ts","../src/interpreter.ts","../src/operations/where-function.ts","../src/operations/select-function.ts","../src/operations/first-function.ts","../src/operations/last-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/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/substring-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/trace-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/registry.ts","../src/parser-base.ts","../src/parser.ts","../src/analyzer.ts","../src/model-provider.ts","../src/inspect.ts","../src/index.ts"],"names":["TokenType","charCode","DiagnosticSeverity","evaluate","registry","result","createCanonicalManager"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 \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 \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 lspLine: number = 0; // LSP: zero-based\n private lspCharacter: number = 0; // LSP: zero-based character within line\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 this.advance();\n return this.createToken(TokenType.OPERATOR, '+', start, this.position, startLine, startColumn);\n \n case '-':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '-', start, this.position, startLine, startColumn);\n \n case '*':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '*', start, this.position, startLine, startColumn);\n \n case '/':\n // Check for comments\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 this.advance();\n return this.createToken(TokenType.OPERATOR, '/', start, this.position, startLine, startColumn);\n \n case '<':\n this.advance();\n if (this.current() === '=') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '<=', start, this.position, startLine, startColumn);\n }\n return this.createToken(TokenType.OPERATOR, '<', start, this.position, startLine, startColumn);\n \n case '>':\n this.advance();\n if (this.current() === '=') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '>=', start, this.position, startLine, startColumn);\n }\n return this.createToken(TokenType.OPERATOR, '>', start, this.position, startLine, startColumn);\n \n case '=':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '=', start, this.position, startLine, startColumn);\n \n case '!':\n this.advance();\n if (this.current() === '=') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '!=', start, this.position, startLine, startColumn);\n } else if (this.current() === '~') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '!~', start, this.position, startLine, startColumn);\n }\n // '!' alone is not a valid token in FHIRPath\n throw this.error(`Unexpected character '!' at position ${start}`);\n \n case '~':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '~', start, this.position, startLine, startColumn);\n \n case '|':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '|', start, this.position, startLine, startColumn);\n \n case '&':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '&', start, this.position, 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 // 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 while (this.position < this.input.length) {\n const charCode = this.input.charCodeAt(this.position);\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n (charCode >= 48 && charCode <= 57) || // 0-9\n charCode === 95) { // _\n this.advance();\n } else {\n break;\n }\n }\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 this.advance(); // Skip opening `\n \n while (this.position < this.input.length) {\n const char = this.current();\n \n if (char === '`') {\n this.advance(); // Skip closing `\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.IDENTIFIER, value, start, this.position, startLine, startColumn);\n }\n \n if (char === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated delimited identifier');\n }\n }\n \n this.advance();\n }\n \n throw this.error('Unterminated delimited identifier');\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\n while (this.position < this.input.length) {\n const charCode = this.input.charCodeAt(this.position);\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n (charCode >= 48 && charCode <= 57) || // 0-9\n charCode === 95) { // _\n this.advance();\n } else {\n break;\n }\n }\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.advance(); // Skip opening `\n \n while (this.position < this.input.length) {\n const ch = this.current();\n \n if (ch === '`') {\n this.advance(); // Skip closing `\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 if (ch === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated environment variable');\n }\n }\n \n this.advance();\n }\n \n throw this.error('Unterminated environment variable');\n } else if (char === \"'\") {\n // String format (backwards compatibility): %'identifier'\n this.advance(); // Skip opening '\n \n while (this.position < this.input.length) {\n const ch = this.current();\n \n if (ch === \"'\") {\n this.advance(); // Skip closing '\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 if (ch === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated environment variable');\n }\n }\n \n this.advance();\n }\n \n throw this.error('Unterminated environment variable');\n } else {\n // Simple identifier: %identifier\n const charCode = this.input.charCodeAt(this.position);\n if (!((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n charCode === 95)) { // _\n throw this.error('Invalid environment variable name');\n }\n \n // Read the identifier part\n while (this.position < this.input.length) {\n const charCode = this.input.charCodeAt(this.position);\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n (charCode >= 48 && charCode <= 57) || // 0-9\n charCode === 95) { // _\n this.advance();\n } else {\n break;\n }\n }\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: string): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n this.advance(); // Skip opening quote\n \n while (this.position < this.input.length) {\n const char = this.current();\n \n if (char === quote) {\n this.advance(); // Skip closing quote\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.STRING, value, start, this.position, startLine, startColumn);\n }\n \n if (char === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated string');\n }\n // Skip the escaped character\n this.advance();\n } else {\n this.advance();\n }\n }\n \n throw this.error('Unterminated string');\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 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 // 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 // Optional time part\n if (this.current() === 'T') {\n this.advance();\n this.readTimeFormat();\n }\n \n // Optional timezone\n this.readTimezone();\n \n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.DATETIME, 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 if (this.current() === '.') {\n this.advance();\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid time format');\n }\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 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 this.lspLine++;\n this.lspCharacter = 0;\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 this.lspLine++;\n this.lspCharacter = 0;\n }\n } else {\n this.column++;\n this.lspCharacter++;\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 /**\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 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}","import type { Token, TokenType } from './lexer';\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 // 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): TypeInfo<TypeContext> | undefined;\n \n // get element type from complex type\n getElementType(parentType: TypeInfo<TypeContext>, propertyName: string): 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}\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 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 FunctionDefinition {\n name: string;\n category: string[];\n description: string;\n examples: string[];\n signature: {\n input: TypeInfo;\n parameters: Array<{\n name: string;\n optional?: boolean;\n type: TypeInfo;\n expression?: boolean;\n }>;\n result: TypeInfo | 'inputType' | 'inputTypeSingleton' | 'parameterType';\n };\n evaluate: FunctionEvaluator;\n}\n\n// Node types enum - string-based for better debugging\nexport enum NodeType {\n EOF = 'EOF',\n Binary = 'Binary',\n Unary = 'Unary',\n TypeOrIdentifier = 'TypeOrIdentifier',\n Identifier = 'Identifier',\n Literal = 'Literal',\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';\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 TypeOrIdentifierNode extends BaseASTNode {\n type: NodeType.TypeOrIdentifier;\n name: string;\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 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 isCalendarUnit?: boolean;\n}\n\n// Unified ASTNode type - discriminated union\nexport type ASTNode = \n | IdentifierNode\n | TypeOrIdentifierNode\n | LiteralNode\n | BinaryNode\n | UnaryNode\n | FunctionNode\n | VariableNode\n | IndexNode\n | MembershipTestNode\n | TypeCastNode\n | CollectionNode\n | TypeReferenceNode\n | QuantityNode\n | ErrorNode;\n\nexport interface RuntimeContext {\n input: any[];\n focus: any[];\n variables: Record<string, any>;\n}\n\n// Evaluation result - everything is a collection\nexport interface EvaluationResult {\n value: any[];\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}\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', 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: any[], context: RuntimeContext) => EvaluationResult;\n\nexport type OperationEvaluator = (input: any[], context: RuntimeContext, ...args: any[]) => EvaluationResult;\n\nexport type FunctionEvaluator = (\n input: any[],\n context: RuntimeContext,\n args: ASTNode[],\n evaluator: (node: ASTNode, input: any[], context: RuntimeContext) => EvaluationResult\n) => 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","// 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';\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 { firstFunction } from './first-function';\nexport { lastFunction } from './last-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';\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 { substringFunction } from './substring-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';\n\n// Utility functions\nexport { traceFunction } from './trace-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 { 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 unit to UCUM unit mapping\n */\nexport const CALENDAR_TO_UCUM: Record<string, string> = {\n 'year': 'a', // annum\n 'years': 'a',\n 'month': 'mo', // month\n 'months': 'mo',\n 'week': 'wk', // week\n 'weeks': 'wk',\n 'day': 'd', // day\n 'days': 'd',\n 'hour': 'h', // hour\n 'hours': 'h',\n 'minute': 'min', // minute\n 'minutes': 'min',\n 'second': 's', // second\n 'seconds': 's',\n 'millisecond': 'ms', // millisecond\n 'milliseconds': 'ms'\n};\n\n/**\n * Create a quantity value\n */\nexport function createQuantity(value: number, unit: string, isCalendarUnit: boolean = false): QuantityValue {\n const actualUnit = isCalendarUnit && CALENDAR_TO_UCUM[unit] ? CALENDAR_TO_UCUM[unit] : unit;\n return {\n value,\n unit: actualUnit\n };\n}\n\n/**\n * Get or create the UCUM quantity for a QuantityValue\n */\nexport function getUcumQuantity(quantity: QuantityValue): Quantity | null {\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 */\nexport function isValidQuantity(quantity: QuantityValue): boolean {\n return getUcumQuantity(quantity) !== null;\n}\n\n/**\n * Add two quantities\n */\nexport function addQuantities(left: QuantityValue, right: QuantityValue): QuantityValue | null {\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 _ucumQuantity: result\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 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 _ucumQuantity: result\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 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 _ucumQuantity: result\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 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 _ucumQuantity: result\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 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 { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { addQuantities } from '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result] : [], context };\n }\n \n if (typeof l === 'string' || typeof r === 'string') {\n return { value: [String(l) + String(r)], context };\n }\n \n if (typeof l === 'number' && typeof r === 'number') {\n return { value: [l + r], context };\n }\n \n // For other types, convert to string\n return { value: [String(l) + String(r)], 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 type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\n\nexport const evaluate: OperationEvaluator = (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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result] : [], context };\n }\n \n // Handle numeric subtraction\n if (typeof l === 'number' && typeof r === 'number') {\n return { value: [l - r], 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 '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, operand) => {\n // Unary minus negates each value\n return { \n value: operand.map(v => {\n if (v && typeof v === 'object' && 'unit' in v) {\n // Handle quantity\n const q = v as QuantityValue;\n return { value: -q.value, unit: q.unit };\n }\n return -v;\n }), \n context \n };\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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result] : [], 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: [{ value: q.value * r, unit: q.unit }], 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: [{ value: l * q.value, unit: q.unit }], context };\n }\n \n // Handle numeric multiplication\n if (typeof l === 'number' && typeof r === 'number') {\n return { value: [l * r], 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 evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { divideQuantities } from '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 = divideQuantities(l as QuantityValue, r as QuantityValue);\n return { value: result ? [result] : [], context };\n }\n \n // Handle quantity / number\n if (l && typeof l === 'object' && 'unit' in l && typeof r === 'number') {\n if (r === 0) {\n return { value: [], context };\n }\n const q = l as QuantityValue;\n return { value: [{ value: q.value / r, unit: q.unit }], context };\n }\n \n // Handle numeric division\n if (typeof l === 'number' && typeof r === 'number') {\n if (r === 0) {\n return { value: [], context };\n }\n return { value: [l / r], 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 returns empty.',\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';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n if (right[0] === 0) {\n return { value: [], context };\n }\n return { value: [Math.floor(left[0] / right[0])], 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';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n if (right[0] === 0) {\n return { value: [], context };\n }\n return { value: [left[0] % right[0]], 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result < 0] : [], context };\n }\n \n return { value: [l < r], 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result > 0] : [], context };\n }\n \n return { value: [l > r], 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result <= 0] : [], context };\n }\n \n return { value: [l <= r], 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 ? [result >= 0] : [], context };\n }\n \n return { value: [l >= r], 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 } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { equalQuantities } from '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 return { value: [equalQuantities(l as QuantityValue, r as QuantityValue)], context };\n }\n \n return { value: [l === r], 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 name: 'equal',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', 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 { equalQuantities } from '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n if (left.length === 0 || right.length === 0) {\n return { value: [], context };\n }\n \n const l = left[0];\n const r = right[0];\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 return { value: [!equalQuantities(l as QuantityValue, r as QuantityValue)], context };\n }\n \n return { value: [l !== r], 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 name: 'not-equal',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', 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';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n // Empty collections are equivalent\n if (left.length === 0 && right.length === 0) {\n return { value: [true], context };\n }\n \n // Different sizes are not equivalent\n if (left.length !== right.length) {\n return { value: [false], context };\n }\n \n // For single items, check type-specific equivalence\n if (left.length === 1 && right.length === 1) {\n const l = left[0];\n const r = right[0];\n \n // String equivalence: case-insensitive with normalized whitespace\n if (typeof l === 'string' && typeof r === 'string') {\n const normalizeString = (s: string) => s.trim().toLowerCase().replace(/\\s+/g, ' ');\n return { value: [normalizeString(l) === normalizeString(r)], context };\n }\n \n // Number equivalence (for Integer and Decimal)\n if (typeof l === 'number' && typeof r === 'number') {\n // For decimals with different precision, round to least precise\n // This is a simplified implementation\n return { value: [Math.abs(l - r) < Number.EPSILON], context };\n }\n \n // Boolean equivalence\n if (typeof l === 'boolean' && typeof r === 'boolean') {\n return { value: [l === r], context };\n }\n \n // For complex types and other cases, use equality for now\n // TODO: Implement full equivalence logic for Date/DateTime/Time and complex types\n return { value: [l === r], context };\n }\n \n // For multiple items, comparison is order-independent\n // Create sorted copies for comparison\n // TODO: Implement proper order-independent comparison with recursive equivalence\n const leftSorted = [...left].sort();\n const rightSorted = [...right].sort();\n \n for (let i = 0; i < leftSorted.length; i++) {\n if (leftSorted[i] !== rightSorted[i]) {\n return { value: [false], context };\n }\n }\n \n return { value: [true], context };\n};\n\nexport const equivalentOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '~',\n name: 'equivalent',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\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';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n // Empty collections are equivalent, so not-equivalent returns false\n if (left.length === 0 && right.length === 0) {\n return { value: [false], context };\n }\n \n // Different sizes are not equivalent, so not-equivalent returns true\n if (left.length !== right.length) {\n return { value: [true], context };\n }\n \n // For single items, check type-specific non-equivalence\n if (left.length === 1 && right.length === 1) {\n const l = left[0];\n const r = right[0];\n \n // String non-equivalence: case-insensitive with normalized whitespace\n if (typeof l === 'string' && typeof r === 'string') {\n const normalizeString = (s: string) => s.trim().toLowerCase().replace(/\\s+/g, ' ');\n return { value: [normalizeString(l) !== normalizeString(r)], context };\n }\n \n // Number non-equivalence (for Integer and Decimal)\n if (typeof l === 'number' && typeof r === 'number') {\n // For decimals with different precision, round to least precise\n // This is a simplified implementation\n return { value: [Math.abs(l - r) >= Number.EPSILON], context };\n }\n \n // Boolean non-equivalence\n if (typeof l === 'boolean' && typeof r === 'boolean') {\n return { value: [l !== r], context };\n }\n \n // For complex types and other cases, use inequality for now\n // TODO: Implement full non-equivalence logic for Date/DateTime/Time and complex types\n return { value: [l !== r], context };\n }\n \n // For multiple items, comparison is order-independent\n // Create sorted copies for comparison\n // TODO: Implement proper order-independent comparison with recursive equivalence\n const leftSorted = [...left].sort();\n const rightSorted = [...right].sort();\n \n for (let i = 0; i < leftSorted.length; i++) {\n if (leftSorted[i] !== rightSorted[i]) {\n return { value: [true], context };\n }\n }\n \n return { value: [false], context };\n};\n\nexport const notEquivalentOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '!~',\n name: 'notEquivalent',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\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';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n // Three-valued logic implementation\n if (left.length === 0 || right.length === 0) {\n // If either operand is false, result is false\n if (left.length > 0 && left[0] === false) {\n return { value: [false], context };\n }\n if (right.length > 0 && right[0] === false) {\n return { value: [false], context };\n }\n // Otherwise unknown\n return { value: [], context };\n }\n return { value: [left[0] && right[0]], context };\n};\n\nexport const andOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'and',\n name: 'and',\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';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n // Three-valued logic implementation\n if (left.length === 0 || right.length === 0) {\n // If either operand is true, result is true\n if (left.length > 0 && left[0] === true) {\n return { value: [true], context };\n }\n if (right.length > 0 && right[0] === true) {\n return { value: [true], context };\n }\n // Otherwise unknown\n return { value: [], context };\n }\n return { value: [left[0] || right[0]], context };\n};\n\nexport const orOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'or',\n name: 'or',\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';\n\nexport const evaluate: OperationEvaluator = (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 l = left[0];\n const r = right[0];\n if (typeof l === 'boolean' && typeof r === 'boolean') {\n return { value: [l !== r], 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';\n\nexport const evaluate: OperationEvaluator = (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 if (right[0] === false) {\n return { value: [], context }; // empty implies false = empty\n }\n return { value: [true], context }; // empty implies true = true\n }\n \n // Handle false left operand\n if (left[0] === false) {\n return { value: [true], context }; // false implies anything = true\n }\n \n // Handle true left operand\n if (right.length === 0) {\n return { value: [], context }; // true implies empty = empty\n }\n \n return { value: [right[0]], context }; // true implies y = y\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 { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\n\nexport const evaluate: OperationEvaluator = (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 new Error('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: [false], context };\n }\n \n // Check if the single left item is in right using equality\n const leftItem = left[0];\n for (const rightItem of right) {\n if (leftItem === rightItem) {\n return { value: [true], context };\n }\n }\n \n return { value: [false], 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 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 { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\n\nexport const evaluate: OperationEvaluator = (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 new Error('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: [false], context };\n }\n \n // Check if the single right item is in left using equality\n const rightItem = right[0];\n for (const leftItem of left) {\n if (leftItem === rightItem) {\n return { value: [true], context };\n }\n }\n \n return { value: [false], context };\n};\n\nexport const containsOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: 'contains',\n name: 'contains',\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 } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n // Note: 'is' operator requires special handling for type checking\n // Right operand should be a type identifier\n // For now, implementing basic type checking\n if (left.length === 0) {\n return { value: [false], context };\n }\n \n // TODO: Implement proper FHIRPath type checking\n // This is a simplified version\n const item = left[0];\n const typeName = right[0]; // Should be a type name like 'String', 'Integer', etc.\n \n switch (typeName) {\n case 'String':\n return { value: [typeof item === 'string'], context };\n case 'Boolean':\n return { value: [typeof item === 'boolean'], context };\n case 'Integer':\n return { value: [Number.isInteger(item)], context };\n case 'Decimal':\n return { value: [typeof item === 'number'], context };\n default:\n return { value: [false], 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};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\n\nexport const evaluate: OperationEvaluator = (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 // TODO: Implement proper FHIRPath type casting\n // For now, just return the value as-is if it matches the type\n const results: any[] = [];\n const typeName = right[0]; // Should be a type name\n \n for (const item of left) {\n let matches = false;\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 = Number.isInteger(item);\n break;\n case 'Decimal':\n matches = typeof item === 'number';\n break;\n }\n if (matches) {\n results.push(item);\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 { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\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 = (input, context, left, right) => {\n // Union merges collections and eliminates duplicates using equals (=) operator\n const result: any[] = [];\n const seen = new Set<any>();\n \n // Add items from left collection\n for (const item of left) {\n let isDuplicate = false;\n for (const existing of result) {\n // Use equals operator semantics for duplicate detection\n if (existing === item) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n result.push(item);\n }\n }\n \n // Add items from right collection if not already present\n for (const item of right) {\n let isDuplicate = false;\n for (const existing of result) {\n // Use equals operator semantics for duplicate detection\n if (existing === item) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n result.push(item);\n }\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 any duplicate values using the equals (=) operator. There is no expectation of order in the resulting collection',\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};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\n\nexport const evaluate: OperationEvaluator = (input, context, left, right) => {\n // Combine operator concatenates all values as strings\n const leftStr = left.map(v => String(v)).join('');\n const rightStr = right.map(v => String(v)).join('');\n \n if (leftStr === '' && rightStr === '') {\n return { value: [], context };\n }\n \n return { value: [leftStr + rightStr], context };\n};\n\nexport const combineOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '&',\n name: 'combine',\n category: ['string'],\n precedence: PRECEDENCE.ADDITIVE,\n associativity: 'left',\n description: 'String concatenation operator',\n examples: ['first & \" \" & last'],\n signatures: [],\n evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\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 = (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 new Error('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 type {\n ASTNode,\n LiteralNode,\n IdentifierNode,\n BinaryNode,\n UnaryNode,\n FunctionNode,\n VariableNode,\n CollectionNode,\n IndexNode,\n TypeOrIdentifierNode,\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 } from './types';\nimport { createQuantity } from './quantity-value';\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 // Silently return original context for system variable redefinition\n return context;\n }\n \n // Check if variable already exists (unless redefinition is allowed)\n if (!allowRedefinition && context.variables && Object.prototype.hasOwnProperty.call(context.variables, varKey)) {\n // Silently return original context for variable redefinition\n return context;\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 return context.variables[varKey];\n }\n}\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\n constructor(registry?: Registry) {\n this.registry = registry || new Registry();\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.Identifier]: this.evaluateIdentifier.bind(this),\n [NodeType.TypeOrIdentifier]: this.evaluateTypeOrIdentifier.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]: () => ({ value: [], context: {} as RuntimeContext }),\n [NodeType.TypeReference]: () => ({ 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 ('signature' 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 evaluate(node: ASTNode, input: any[] = [], context?: RuntimeContext): 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 // Dispatch to appropriate evaluator\n const evaluator = this.nodeEvaluators[node.type];\n if (!evaluator) {\n throw new Error(`Unknown node type: ${node.type}`);\n }\n\n return evaluator(node, input, context);\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 return context;\n }\n\n // Literal node evaluator\n private evaluateLiteral(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const literal = node as LiteralNode;\n return {\n value: [literal.value],\n context\n };\n }\n\n // Identifier node evaluator\n private evaluateIdentifier(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const identifier = node as IdentifierNode;\n const name = identifier.name;\n\n // Navigate property on each item in input\n const results: any[] = [];\n for (const item of input) {\n if (item && typeof item === 'object' && name in item) {\n const value = item[name];\n if (Array.isArray(value)) {\n results.push(...value);\n } else if (value !== null && value !== undefined) {\n results.push(value);\n }\n }\n }\n\n return {\n value: results,\n context\n };\n }\n\n // TypeOrIdentifier node evaluator (handles Patient, Observation, etc.)\n private evaluateTypeOrIdentifier(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const typeOrId = node as TypeOrIdentifierNode;\n const name = typeOrId.name;\n\n // First try as type filter\n const filtered = input.filter(item => \n item && typeof item === 'object' && item.resourceType === name\n );\n\n if (filtered.length > 0) {\n return { value: filtered, context };\n }\n\n // Otherwise treat as identifier\n return this.evaluateIdentifier(node, input, context);\n }\n\n // Binary operator evaluator\n private evaluateBinary(node: ASTNode, input: any[], context: RuntimeContext): 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 = this.evaluate(binary.left, input, context);\n // Use left's output as right's input, and left's context flows to right\n return 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 const leftResult = this.evaluate(binary.left, input, context);\n const rightResult = this.evaluate(binary.right, input, context); // Use original context, not leftResult.context\n \n // Merge the results\n const unionEvaluator = this.operationEvaluators.get('union');\n if (unionEvaluator) {\n return unionEvaluator(input, context, leftResult.value, rightResult.value);\n }\n \n // Fallback if union evaluator not found\n return {\n value: [...leftResult.value, ...rightResult.value],\n context // Original context preserved\n };\n }\n\n // Get operation evaluator\n const evaluator = this.operationEvaluators.get(operator);\n if (evaluator) {\n // Most operators evaluate arguments in parallel with same input/context\n const leftResult = this.evaluate(binary.left, input, context);\n const rightResult = this.evaluate(binary.right, input, context);\n return evaluator(input, context, leftResult.value, rightResult.value);\n }\n\n // If no evaluator found, throw error\n throw new Error(`No evaluator found for binary operator: ${operator}`);\n }\n\n // Unary operator evaluator\n private evaluateUnary(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const unary = node as UnaryNode;\n const operator = unary.operator;\n \n const operandResult = 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 evaluator(input, context, operandResult.value);\n }\n\n // If no evaluator found, throw error\n throw new Error(`No evaluator found for unary operator: ${operator}`);\n }\n\n // Variable evaluator\n private evaluateVariable(node: ASTNode, input: any[], context: RuntimeContext): 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 return { value: arrayValue, context };\n }\n\n // According to FHIRPath spec: attempting to access an undefined environment variable will result in an error\n throw new Error(`Variable '${name}' is not defined in the current scope`);\n }\n\n // Collection evaluator\n private evaluateCollection(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const collection = node as CollectionNode;\n const results: any[] = [];\n\n for (const element of collection.elements) {\n const result = this.evaluate(element, input, context);\n results.push(...result.value);\n }\n\n return { value: results, context };\n }\n\n // Function evaluator\n private evaluateFunction(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const func = node as FunctionNode;\n const funcName = (func.name as IdentifierNode).name;\n\n // Check if function is registered with an evaluator\n const functionEvaluator = this.functionEvaluators.get(funcName);\n if (functionEvaluator) {\n return functionEvaluator(input, context, func.arguments, this.evaluate.bind(this));\n }\n\n // No function found in registry\n throw new Error(`Unknown function: ${funcName}`);\n }\n\n // Index evaluator\n private evaluateIndex(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const indexNode = node as IndexNode;\n const exprResult = this.evaluate(indexNode.expression, input, context);\n const indexResult = 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 index = indexResult.value[0];\n if (typeof index === 'number' && index >= 0 && index < exprResult.value.length) {\n return { value: [exprResult.value[index]], context };\n }\n\n return { value: [], context };\n }\n\n // Type membership test (is operator)\n private evaluateMembershipTest(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const test = node as MembershipTestNode;\n const exprResult = this.evaluate(test.expression, input, context);\n \n // Simple type checking\n const results = exprResult.value.map(item => {\n switch (test.targetType) {\n case 'String': return typeof item === 'string';\n case 'Boolean': return typeof item === 'boolean';\n case 'Integer': return Number.isInteger(item);\n case 'Decimal': return typeof item === 'number';\n default: return false;\n }\n });\n\n return { value: results, context };\n }\n\n // Type cast (as operator)\n private evaluateTypeCast(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const cast = node as TypeCastNode;\n const exprResult = this.evaluate(cast.expression, input, context);\n \n // For now, just return the values as-is\n // In a real implementation, would perform type conversion\n return { value: exprResult.value, context };\n }\n \n private evaluateQuantity(node: ASTNode, input: any[], context: RuntimeContext): EvaluationResult {\n const quantity = node as QuantityNode;\n const quantityValue = createQuantity(quantity.value, quantity.unit, quantity.isCalendarUnit);\n return {\n value: [quantityValue],\n context\n };\n }\n}","import type { FunctionDefinition, ASTNode } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (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 item with modified context\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\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(item);\n continue;\n }\n\n // Evaluate condition with temporary context\n const condResult = evaluator(condition, [item], tempContext);\n \n // Include item if condition is true\n if (condResult.value.length > 0 && condResult.value[0] === true) {\n results.push(item);\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 signature: {\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};","import type { FunctionDefinition } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Select requires exactly one argument\n if (args.length !== 1) {\n throw new Error('select() requires exactly 1 argument');\n }\n\n const expression = args[0];\n if (!expression) {\n throw new Error('select() requires a projection expression');\n }\n \n const results: any[] = [];\n\n // Process each item with modified context\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\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 = evaluator(expression, [item], tempContext);\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 signature: {\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};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n return { \n value: input.length > 0 ? [input[0]] : [], \n context \n };\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n return { \n value: input.length > 0 ? [input[input.length - 1]] : [], \n context \n };\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw new Error('skip() requires exactly one argument');\n }\n \n const numNode = args[0];\n if (!numNode) {\n throw new Error('skip() requires an argument');\n }\n \n // Evaluate the argument to get the number\n const numResult = evaluator(numNode, input, context);\n \n if (numResult.value.length === 0) {\n throw new Error('skip() argument cannot be empty');\n }\n \n const skipValue = numResult.value[0];\n \n if (typeof skipValue !== 'number' || !Number.isInteger(skipValue)) {\n throw new Error('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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Validate arguments\n if (args.length !== 1) {\n throw new Error('take() requires exactly 1 argument');\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 new Error('take() requires a number argument');\n }\n const numResult = evaluator(args[0], input, context);\n \n // Validate that num is a singleton integer\n if (numResult.value.length !== 1) {\n throw new Error('take() argument must be a single value');\n }\n \n const num = numResult.value[0];\n \n // Check that num is an integer\n if (!Number.isInteger(num)) {\n throw new Error('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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // tail() takes no arguments\n if (args.length !== 0) {\n throw new Error('tail() takes no arguments');\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 signature: {\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: false }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // single takes no arguments\n if (args.length !== 0) {\n throw new Error('single() takes no arguments');\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]], context };\n }\n\n // If there are multiple items, signal an error\n throw new Error('single() requires collection to have exactly one item');\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n return { \n value: [input.length], \n context \n };\n};\n\nexport const countFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'count',\n category: ['collection'],\n description: 'Returns the number of items in the collection',\n examples: ['Patient.name.count()'],\n signature: {\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Integer', singleton: true },\n },\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // No arguments - just check if input is not empty\n if (args.length === 0) {\n return { value: [input.length > 0], context };\n }\n\n const condition = args[0];\n if (!condition) {\n throw new Error('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 item = input[i];\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 = evaluator(condition, [item], tempContext);\n \n // Return true if any item matches\n if (condResult.value.length > 0 && condResult.value[0] === true) {\n return { value: [true], context };\n }\n }\n\n return { value: [false], context };\n};\n\nexport const existsFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'exists',\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 signature: {\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};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // all() requires exactly one argument (the criteria expression)\n if (!args || args.length !== 1) {\n throw new Error('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: [true], context };\n }\n\n const criteriaExpression = args[0];\n if (!criteriaExpression) {\n throw new Error('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 item = input[i];\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 = evaluator(criteriaExpression, [item], 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 || result.value[0] !== true) {\n return { value: [false], context };\n }\n }\n\n // All criteria evaluations were true\n return { value: [true], context };\n};\n\nexport const allFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'all',\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 signature: {\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};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n return { \n value: [input.length === 0], \n context \n };\n};\n\nexport const emptyFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'empty',\n category: ['collection', 'logical'],\n description: 'Returns true if the collection is empty',\n examples: ['Patient.name.empty()'],\n signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (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 if (input[0] === true) {\n return { value: [false], context };\n }\n \n if (input[0] === false) {\n return { value: [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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Use Set to remove duplicates\n // Note: This uses JavaScript's default equality which may not handle\n // complex objects correctly. A full implementation would need deep equality.\n return { \n value: [...new Set(input)], \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 signature: {\n input: { type: 'Any', singleton: false },\n parameters: [],\n result: { type: 'Any', singleton: false },\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // isDistinct takes no arguments\n if (args.length !== 0) {\n throw new Error('isDistinct() takes no arguments');\n }\n\n // If input is empty, return true\n if (input.length === 0) {\n return { value: [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 // Using === for primitive comparison (matching the equal operator behavior)\n if (input[i] === input[j]) {\n return { value: [false], context };\n }\n }\n }\n\n // All items are distinct\n return { value: [true], context };\n};\n\nexport const isDistinctFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'isDistinct',\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length < 2) {\n throw new Error('iif requires at least 2 arguments');\n }\n \n if (args.length > 3) {\n throw new Error('iif takes at most 3 arguments');\n }\n\n // Check for multiple items in input collection\n if (input.length > 1) {\n throw new Error('iif() can only be used on single item or empty collections');\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 new Error('iif requires condition and true-result arguments');\n }\n \n // When evaluating expressions within iif, ensure $this refers to the input\n // Create a new context with $this set to the current input\n const evalContext = {\n ...context,\n variables: {\n ...context.variables,\n '$this': input\n },\n input: input,\n focus: input\n };\n \n const condResult = 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 evaluator(elseExpr, input, context);\n }\n\n const condition = condResult.value[0];\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 (using the same context with $this set)\n if (condition === true) {\n return evaluator(thenExpr, input, evalContext);\n } else {\n // If no else expression provided, return empty\n if (!elseExpr) {\n return { value: [], context };\n }\n return evaluator(elseExpr, input, evalContext);\n }\n};\n\nexport const iifFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'iif',\n category: ['control'],\n description: 'If-then-else expression (immediate if)',\n examples: ['iif(gender = \"male\", \"Mr.\", \"Ms.\")'],\n signature: {\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};","import type { FunctionDefinition, LiteralNode } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length < 1) {\n throw new Error('defineVariable requires at least 1 argument');\n }\n\n const nameNode = args[0] as LiteralNode;\n if (nameNode.valueType !== 'string') {\n throw new Error('Variable name must be a string');\n }\n\n const varName = nameNode.value as string;\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 const tempContext = RuntimeContextManager.setVariable(context, '$this', input);\n const valueExpr = args[1];\n if (!valueExpr) {\n throw new Error('defineVariable requires a value expression');\n }\n const valueResult = evaluator(valueExpr, input, tempContext);\n value = valueResult.value;\n }\n\n // Set the variable using RuntimeContextManager (handles prefixes and checks)\n const newContext = RuntimeContextManager.setVariable(context, varName, value);\n \n // If newContext is same as context, variable already existed - return empty\n if (newContext === context) {\n return { value: [], context };\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 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 signature: {\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 },\n ],\n result: { type: 'Any', singleton: false },\n },\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (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 = evaluator(args[0], input, context);\n if (sepResult.value.length > 0 && typeof sepResult.value[0] === 'string') {\n separator = sepResult.value[0];\n }\n }\n\n // Convert all input items to strings and join\n const stringValues = input.map(item => {\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: [result], \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 signature: {\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 type { FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Check if we have exactly 2 arguments\n if (args.length !== 2) {\n throw new Error('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 new Error('replace() can only be used on a single string value');\n }\n \n const inputValue = input[0];\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 = 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 new Error('replace() pattern must be a single string value');\n }\n \n const pattern = patternResult.value[0];\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 = 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 new Error('replace() substitution must be a single string value');\n }\n \n const substitution = substitutionResult.value[0];\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: [result], context };\n }\n \n // Normal replacement: replace all occurrences\n const result = inputValue.split(pattern).join(substitution);\n \n return { value: [result], 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw new Error('union() requires exactly 1 argument');\n }\n\n // Evaluate the argument to get the other collection\n const argNode = args[0];\n if (!argNode) {\n throw new Error('union() requires an argument');\n }\n const otherResult = 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 \n // Add items from input collection\n for (const item of input) {\n let isDuplicate = false;\n for (const existing of result) {\n // Use equals operator semantics for duplicate detection\n if (existing === item) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n result.push(item);\n }\n }\n \n // Add items from other collection if not already present\n for (const item of other) {\n let isDuplicate = false;\n for (const existing of result) {\n // Use equals operator semantics for duplicate detection\n if (existing === item) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n result.push(item);\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // combine() requires exactly one argument (the other collection)\n if (!args || args.length !== 1) {\n throw new Error('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 new Error('combine() requires a 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 context.input which contains the root data\n const otherResult = evaluator(otherArg, context.input || [], 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 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw new Error('intersect() requires exactly 1 argument');\n }\n\n // Evaluate the argument to get the other collection\n const argNode = args[0];\n if (!argNode) {\n throw new Error('intersect() requires an argument');\n }\n const otherResult = evaluator(argNode, input, context);\n const other = otherResult.value;\n\n // Find elements that are in both collections, eliminating duplicates\n // Note: This uses JavaScript's === equality which may not handle\n // complex objects correctly. A full implementation would need deep equality\n // as specified in FHIRPath equals (=) semantics.\n const result: any[] = [];\n const processedItems = new Set<any>();\n \n // Check each item from input collection\n for (const item of input) {\n // Skip if we've already processed this item (to eliminate duplicates)\n let alreadyProcessed = false;\n for (const processed of processedItems) {\n if (processed === item) {\n alreadyProcessed = true;\n break;\n }\n }\n if (alreadyProcessed) {\n continue;\n }\n \n // Check if item exists in other collection\n let foundInOther = false;\n for (const otherItem of other) {\n if (item === otherItem) {\n foundInOther = true;\n break;\n }\n }\n \n // If found in both collections, add to result\n if (foundInOther) {\n result.push(item);\n processedItems.add(item);\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw new Error('exclude() requires exactly 1 argument');\n }\n\n // Evaluate the argument to get the other collection\n const argNode = args[0];\n if (!argNode) {\n throw new Error('exclude() requires an argument');\n }\n const otherResult = 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 item of input) {\n // Check if item exists in other collection\n let foundInOther = false;\n for (const otherItem of other) {\n // Note: This uses JavaScript's === equality which may not handle\n // complex objects correctly. A full implementation would need deep equality\n // as specified in FHIRPath equals (=) semantics.\n if (item === otherItem) {\n foundInOther = true;\n break;\n }\n }\n \n // If not found in other collection, add to result\n if (!foundInOther) {\n result.push(item);\n }\n }\n \n return { value: result, context };\n};\n\nexport const excludeFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'exclude',\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('indexOf() can only be used on single string values');\n }\n\n const inputValue = input[0];\n if (typeof inputValue !== 'string') {\n throw new Error('indexOf() can only be used on string values');\n }\n\n // Check arguments\n if (args.length !== 1) {\n throw new Error('indexOf() requires exactly 1 argument');\n }\n\n // Evaluate substring argument\n const substringArg = args[0];\n if (!substringArg) {\n throw new Error('indexOf() requires a substring argument');\n }\n \n const substringResult = 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 new Error('indexOf() substring argument must be a single value');\n }\n \n const substring = substringResult.value[0];\n if (typeof substring !== 'string') {\n throw new Error('indexOf() substring argument must be a string');\n }\n\n // Handle empty substring - returns 0 per spec\n if (substring === '') {\n return { value: [0], context };\n }\n\n // Find the index\n const index = inputValue.indexOf(substring);\n \n return { value: [index], 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('substring() can only be used on single string values');\n }\n\n const inputValue = input[0];\n if (typeof inputValue !== 'string') {\n throw new Error('substring() can only be used on string values');\n }\n\n // Check arguments - requires at least 1 (start), optionally 2 (start, length)\n if (args.length === 0 || args.length > 2) {\n throw new Error('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 = 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 new Error('substring() start argument must be a single value');\n }\n \n const start = startResult.value[0];\n if (typeof start !== 'number' || !Number.isInteger(start)) {\n throw new Error('substring() start argument must be an 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: [''], 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 = 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 new Error('substring() length argument must be a single value');\n }\n \n const lengthValue = lengthResult.value[0];\n if (typeof lengthValue !== 'number' || !Number.isInteger(lengthValue)) {\n throw new Error('substring() length argument must be an integer');\n }\n \n // Negative or zero length returns empty string\n if (lengthValue <= 0) {\n return { value: [''], context };\n }\n \n length = lengthValue;\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: [result], 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 signature: {\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 } from '../types';\nimport type { FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // contains() requires exactly 1 argument\n if (args.length !== 1) {\n throw new Error('contains() requires exactly 1 argument');\n }\n\n const substringExpr = args[0];\n if (!substringExpr) {\n throw new Error('contains() requires a 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 new Error('contains() can only be applied to a single string');\n }\n\n // Input must be a string\n const inputValue = input[0];\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 = 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 new Error('contains() substring argument must evaluate to a single value');\n }\n \n const substring = substringResult.value[0];\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: [true], context };\n }\n\n // Check if input string contains the substring\n const result = inputValue.includes(substring);\n return { value: [result], 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // startsWith() requires exactly 1 argument\n if (args.length !== 1) {\n throw new Error('startsWith() requires exactly 1 argument');\n }\n\n const prefixExpr = args[0];\n if (!prefixExpr) {\n throw new Error('startsWith() requires a 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 new Error('startsWith() can only be applied to a single string');\n }\n\n // Input must be a string\n const inputValue = input[0];\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 = 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 new Error('startsWith() prefix argument must evaluate to a single value');\n }\n \n const prefix = prefixResult.value[0];\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: [true], context };\n }\n\n // Check if input string starts with the prefix\n const result = inputValue.startsWith(prefix);\n return { value: [result], 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Validate arguments\n if (args.length !== 1) {\n throw new Error('endsWith() requires exactly 1 argument');\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 new Error('endsWith() can only be used on single string values');\n }\n\n const inputValue = input[0];\n\n // Check that input is a string\n if (typeof inputValue !== 'string') {\n throw new Error('endsWith() can only be used on string values');\n }\n\n // Evaluate the suffix argument\n if (!args[0]) {\n throw new Error('endsWith() requires a suffix argument');\n }\n const suffixResult = evaluator(args[0], input, context);\n \n // Validate that suffix is a singleton string\n if (suffixResult.value.length !== 1) {\n throw new Error('endsWith() suffix argument must be a single value');\n }\n \n const suffix = suffixResult.value[0];\n \n // Check that suffix is a string\n if (typeof suffix !== 'string') {\n throw new Error('endsWith() suffix argument must be a string');\n }\n \n // If suffix is empty string, result is true\n if (suffix === '') {\n return { value: [true], context };\n }\n \n // Check if input ends with suffix\n const result = inputValue.endsWith(suffix);\n \n return { value: [result], 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('length() can only be used on single string values');\n }\n\n const inputValue = input[0];\n if (typeof inputValue !== 'string') {\n throw new Error('length() can only be used on string values');\n }\n\n // length() takes no arguments\n if (args.length !== 0) {\n throw new Error('length() takes no arguments');\n }\n\n // Return the length of the string\n return { value: [inputValue.length], 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 signature: {\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // trim() takes no arguments\n if (args.length !== 0) {\n throw new Error('trim() takes no arguments');\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 new Error('trim() can only be applied to a single string');\n }\n\n // Input must be a string\n const inputValue = input[0];\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: [trimmed], 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 signature: {\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // If the input is empty, the result is true\n if (input.length === 0) {\n return { value: [true], context };\n }\n \n // Verify all inputs are booleans\n for (let i = 0; i < input.length; i++) {\n if (typeof input[i] !== 'boolean') {\n throw new Error(`allTrue() expects all items to be Boolean values, but item at index ${i} is ${typeof input[i]}`);\n }\n }\n \n // Return true if all items are true, false if any item is false\n const result = input.every(item => item === true);\n \n return { value: [result], context };\n};\n\nexport const allTrueFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'allTrue',\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 signature: {\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('split() requires a singleton input');\n }\n\n const inputValue = input[0];\n \n // Type check the input - must be a string\n if (typeof inputValue !== 'string') {\n throw new Error('split() can only be applied to string values');\n }\n\n // Validate arguments - requires exactly one argument\n if (!args || args.length !== 1) {\n throw new Error('split() requires exactly one argument');\n }\n\n // Evaluate the separator argument\n const separatorArg = args[0];\n if (!separatorArg) {\n throw new Error('split() requires exactly one argument');\n }\n const separatorResult = evaluator(separatorArg, input, context);\n \n if (separatorResult.value.length !== 1) {\n throw new Error('split() separator must be a singleton');\n }\n \n const separator = separatorResult.value[0];\n \n if (typeof separator !== 'string') {\n throw new Error('split() separator must be a string');\n }\n\n // Perform the split operation\n const result = inputValue.split(separator);\n\n return { value: result, 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('upper() can only be applied to a singleton string');\n }\n \n const inputValue = input[0];\n \n // Type check the input - must be a string\n if (typeof inputValue !== 'string') {\n throw new Error('upper() can only be applied to string values');\n }\n \n // upper() takes no arguments\n if (args && args.length > 0) {\n throw new Error('upper() does not take any arguments');\n }\n \n // Convert to uppercase\n const result = inputValue.toUpperCase();\n \n return { value: [result], 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 signature: {\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('lower() can only be applied to a singleton string');\n }\n \n const inputValue = input[0];\n \n // Type check the input - must be a string\n if (typeof inputValue !== 'string') {\n throw new Error('lower() can only be applied to string values');\n }\n \n // lower() takes no arguments\n if (args && args.length > 0) {\n throw new Error('lower() does not take any arguments');\n }\n \n // Convert to lowercase\n const result = inputValue.toLowerCase();\n \n return { value: [result], 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 signature: {\n input: { type: 'String', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // If the input is empty, the result is true\n if (input.length === 0) {\n return { value: [true], context };\n }\n \n // Verify all inputs are booleans\n for (let i = 0; i < input.length; i++) {\n if (typeof input[i] !== 'boolean') {\n throw new Error(`allFalse() expects all items to be Boolean values, but item at index ${i} is ${typeof input[i]}`);\n }\n }\n \n // Return true if all items are false, false if any item is true\n const result = input.every(item => item === false);\n \n return { value: [result], context };\n};\n\nexport const allFalseFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'allFalse',\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 signature: {\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Empty input returns false per spec\n if (input.length === 0) {\n return { value: [false], context };\n }\n \n // Check if any item in the collection is true\n for (const item of input) {\n if (typeof item !== 'boolean') {\n continue; // Skip non-boolean values\n }\n if (item === true) {\n return { value: [true], context };\n }\n }\n \n // All items are false or non-boolean\n return { value: [false], context };\n};\n\nexport const anyTrueFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'anyTrue',\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 signature: {\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // Empty input returns false per spec\n if (input.length === 0) {\n return { value: [false], context };\n }\n \n // Check if any item in the collection is false\n for (const item of input) {\n if (typeof item !== 'boolean') {\n continue; // Skip non-boolean values\n }\n if (item === false) {\n return { value: [true], context };\n }\n }\n \n // All items are true or non-boolean\n return { value: [false], context };\n};\n\nexport const anyFalseFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'anyFalse',\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 signature: {\n input: { type: 'Boolean', singleton: false },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw new Error('subsetOf() requires exactly 1 argument');\n }\n\n // If the input collection is empty, the result is true\n if (input.length === 0) {\n return { value: [true], context };\n }\n\n // Evaluate the other collection argument\n const argNode = args[0];\n if (!argNode) {\n throw new Error('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 const rootInput = context.variables['$this'] || context.input;\n const otherResult = 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: [false], context };\n }\n\n // Check if all items in input are members of other using equals semantics\n for (const inputItem of input) {\n let found = false;\n for (const otherItem of other) {\n // Use JavaScript === for now, matching the equals operator behavior\n // A full implementation would need deep equality as specified in FHIRPath\n if (inputItem === 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: [false], context };\n }\n }\n\n // All items in input are members of other\n return { value: [true], context };\n};\n\nexport const subsetOfFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'subsetOf',\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n if (args.length !== 1) {\n throw new Error('supersetOf() requires exactly 1 argument');\n }\n\n // Evaluate the other collection argument\n const argNode = args[0];\n if (!argNode) {\n throw new Error('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 const rootInput = context.variables['$this'] || context.input;\n const otherResult = 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: [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: [false], context };\n }\n\n // Check if all items in other are members of input using equals semantics\n for (const otherItem of other) {\n let found = false;\n for (const inputItem of input) {\n // Use JavaScript === for now, matching the equals operator behavior\n // A full implementation would need deep equality as specified in FHIRPath\n if (otherItem === 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: [false], context };\n }\n }\n\n // All items in other are members of input\n return { value: [true], context };\n};\n\nexport const supersetOfFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'supersetOf',\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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // toInteger() takes no arguments\n if (args.length !== 0) {\n throw new Error('toInteger() takes no arguments');\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 new Error('toInteger() can only be applied to a single item');\n }\n\n const inputValue = input[0];\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: [inputValue], 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: [intValue], 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: [inputValue ? 1 : 0], 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 signature: {\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('toDecimal() can only be applied to a singleton');\n }\n \n // toDecimal() takes no arguments\n if (args && args.length > 0) {\n throw new Error('toDecimal() does not take any arguments');\n }\n \n const inputValue = input[0];\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: [inputValue], context };\n }\n \n // Boolean - true -> 1.0, false -> 0.0\n if (typeof inputValue === 'boolean') {\n return { value: [inputValue ? 1.0 : 0.0], 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: [parsedValue], 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 signature: {\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // toString takes no arguments\n if (args.length !== 0) {\n throw new Error('toString() takes no arguments');\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 new Error('toString() can only be used on single values');\n }\n\n const inputValue = input[0];\n\n // Handle different types according to the spec\n if (typeof inputValue === 'string') {\n // Already a string\n return { value: [inputValue], context };\n }\n \n if (typeof inputValue === 'number') {\n // Integer or Decimal\n return { value: [inputValue.toString()], context };\n }\n \n if (typeof inputValue === 'boolean') {\n // Boolean: true -> 'true', false -> 'false'\n return { value: [inputValue ? 'true' : 'false'], 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: [inputValue.value], 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: [inputValue.value], 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: [inputValue.value], context };\n }\n \n // Check for Quantity type\n if (inputValue.type === 'Quantity' && inputValue.value !== undefined && inputValue.unit) {\n return { value: [`${inputValue.value} '${inputValue.unit}'`], 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 signature: {\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'String', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // toBoolean() takes no arguments\n if (args.length !== 0) {\n throw new Error('toBoolean() takes no arguments');\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 new Error('toBoolean() can only be applied to a single item');\n }\n\n const inputValue = input[0];\n\n // Handle different input types according to spec\n \n // Boolean - return as is\n if (typeof inputValue === 'boolean') {\n return { value: [inputValue], context };\n }\n \n // Integer - 1 -> true, 0 -> false\n if (typeof inputValue === 'number' && Number.isInteger(inputValue)) {\n if (inputValue === 1) {\n return { value: [true], context };\n } else if (inputValue === 0) {\n return { value: [false], 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: [true], context };\n } else if (inputValue === 0.0) {\n return { value: [false], 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: [true], context };\n }\n \n // False representations\n if (['false', 'f', 'no', 'n', '0', '0.0'].includes(lowerValue)) {\n return { value: [false], 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 signature: {\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Boolean', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (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 new Error('trace() takes at most 2 arguments');\n }\n\n // Evaluate the name argument\n if (!args[0]) {\n throw new Error('trace() requires a name argument');\n }\n const nameResult = evaluator(args[0], input, context);\n \n // Validate that name is a singleton string\n if (nameResult.value.length !== 1) {\n throw new Error('trace() name argument must be a single value');\n }\n \n const name = nameResult.value[0];\n if (typeof name !== 'string') {\n throw new Error('trace() name argument must be a string');\n }\n\n // If projection argument is provided, evaluate it and log the result\n if (args.length === 2 && args[1]) {\n const projectionResult = 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 signature: {\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};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // aggregator expression is required\n if (args.length < 1) {\n throw new Error('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 = evaluator(initExpr, input, context);\n total = initResult.value;\n } else {\n total = [];\n }\n\n // For each item in the input collection, evaluate the aggregator expression\n input.forEach((item, index) => {\n // Create a new context with $this, $index, and $total\n let aggregatorContext = RuntimeContextManager.withIterator(context, item, index);\n aggregatorContext = RuntimeContextManager.setVariable(aggregatorContext, '$total', total);\n\n // Evaluate the aggregator expression\n const result = 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 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 signature: {\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};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // abs() takes no arguments\n if (args.length !== 0) {\n throw new Error('abs() takes no arguments');\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 new Error('abs() can only be applied to a single item');\n }\n\n const value = input[0];\n\n // Handle different types\n if (typeof value === 'number') {\n return { value: [Math.abs(value)], context };\n }\n\n // Handle Quantity type\n if (value && typeof value === 'object' && 'value' in value && 'unit' in value) {\n return { \n value: [{\n value: Math.abs(value.value),\n unit: value.unit,\n ...(value._ucumQuantity && { _ucumQuantity: { ...value._ucumQuantity, value: Math.abs(value._ucumQuantity.value) } })\n }], \n context \n };\n }\n\n throw new Error(`Cannot apply abs() to ${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 signature: {\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Any', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // ceiling() takes no arguments\n if (args.length !== 0) {\n throw new Error('ceiling() takes no arguments');\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 new Error('ceiling() can only be applied to a single item');\n }\n\n const value = input[0];\n\n // Must be a number\n if (typeof value !== 'number') {\n throw new Error(`Cannot apply ceiling() to ${typeof value}`);\n }\n\n // Math.ceil can return -0, normalize it to 0\n const result = Math.ceil(value);\n return { value: [Object.is(result, -0) ? 0 : result], 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 signature: {\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // floor() takes no arguments\n if (args.length !== 0) {\n throw new Error('floor() takes no arguments');\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 new Error('floor() can only be applied to a single item');\n }\n\n const value = input[0];\n\n // Must be a number\n if (typeof value !== 'number') {\n throw new Error(`Cannot apply floor() to ${typeof value}`);\n }\n\n return { value: [Math.floor(value)], 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 signature: {\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // round() takes 0 or 1 argument (precision)\n if (args.length > 1) {\n throw new Error('round() takes at most 1 argument');\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 new Error('round() can only be applied to a single item');\n }\n\n const value = input[0];\n\n // Must be a number\n if (typeof value !== 'number') {\n throw new Error(`Cannot apply round() to ${typeof value}`);\n }\n\n // Get precision if provided\n let precision = 0;\n if (args.length === 1) {\n const precisionResult = evaluator(args[0]!, input, context);\n if (precisionResult.value.length === 0) {\n return { value: [], context };\n }\n if (precisionResult.value.length > 1) {\n throw new Error('round() precision must be a single value');\n }\n precision = precisionResult.value[0];\n if (!Number.isInteger(precision) || precision < 0) {\n throw new Error('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 return { value: [rounded / multiplier], 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 signature: {\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';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // truncate() takes no arguments\n if (args.length !== 0) {\n throw new Error('truncate() takes no arguments');\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 new Error('truncate() can only be applied to a single item');\n }\n\n const value = input[0];\n\n // Must be a number\n if (typeof value !== 'number') {\n throw new Error(`Cannot apply truncate() to ${typeof value}`);\n }\n\n // Math.trunc removes decimal part (towards zero)\n return { value: [Math.trunc(value)], 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 signature: {\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Integer', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // sqrt() takes no arguments\n if (args.length !== 0) {\n throw new Error('sqrt() takes no arguments');\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 new Error('sqrt() can only be applied to a single item');\n }\n\n const value = input[0];\n\n // Must be a number\n if (typeof value !== 'number') {\n throw new Error(`Cannot apply sqrt() to ${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: [Math.sqrt(value)], 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 signature: {\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n },\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\n\nexport const evaluate: FunctionEvaluator = (input, context, args, evaluator) => {\n // power() takes exactly one argument (exponent)\n if (args.length !== 1) {\n throw new Error('power() requires exactly 1 argument');\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 new Error('power() can only be applied to a single item');\n }\n\n const base = input[0];\n\n // Base must be a number\n if (typeof base !== 'number') {\n throw new Error(`Cannot apply power() to ${typeof base}`);\n }\n\n // Evaluate exponent\n const exponentResult = evaluator(args[0]!, input, context);\n if (exponentResult.value.length === 0) {\n return { value: [], context };\n }\n if (exponentResult.value.length > 1) {\n throw new Error('power() exponent must be a single value');\n }\n\n const exponent = exponentResult.value[0];\n if (typeof exponent !== 'number') {\n throw new Error('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: [result], context };\n }\n\n return { value: [result], 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 signature: {\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 evaluate\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 ('signature' in operation && !('symbol' in operation)) {\n // It's a function (has signature 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.toLowerCase(), def);\n }\n \n getFunction(name: string): FunctionDefinition | undefined {\n return this.functions.get(name.toLowerCase());\n }\n \n isFunction(name: string): boolean {\n return this.functions.has(name.toLowerCase());\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\n// Export singleton instance\nexport const registry = new Registry();","import { Lexer, TokenType, Channel, isOperator, isOperatorValue } from './lexer';\nimport type { Token, LexerOptions } from './lexer';\nimport { registry } from './registry';\nimport { NodeType } from './types';\nimport type { Position, BaseASTNode, Range } from './types';\n\n// Re-export from types for backward compatibility\nexport { NodeType } from './types';\nexport type { Position, BaseASTNode, Range } from './types';\n\n/**\n * Abstract base parser with shared parsing logic\n * Subclasses must implement node creation and error handling\n */\nexport abstract class BaseParser<TNode extends BaseASTNode = BaseASTNode> {\n protected lexer: Lexer;\n protected tokens: Token[] = [];\n protected current = 0;\n \n constructor(input: string, lexerOptions?: LexerOptions) {\n this.lexer = new Lexer(input, lexerOptions);\n this.tokens = this.lexer.tokenize();\n \n // Filter out trivia tokens if they exist (tokens on hidden channel)\n if (lexerOptions?.preserveTrivia) {\n this.tokens = this.tokens.filter(token => \n token.channel === undefined || token.channel === Channel.DEFAULT\n );\n }\n }\n \n // Abstract methods that subclasses must implement\n protected abstract createIdentifierNode(name: string, token: Token): TNode;\n protected abstract createLiteralNode(value: any, valueType: 'string' | 'number' | 'boolean' | 'date' | 'time' | 'datetime' | 'null', token: Token): TNode;\n protected abstract createBinaryNode(token: Token, left: TNode, right: TNode): TNode;\n protected abstract createUnaryNode(token: Token, operand: TNode): TNode;\n protected abstract createFunctionNode(name: TNode, args: TNode[], startToken: Token): TNode;\n protected abstract createVariableNode(name: string, token: Token): TNode;\n protected abstract createIndexNode(expression: TNode, index: TNode, startToken: Token): TNode;\n protected abstract createMembershipTestNode(expression: TNode, targetType: string, startToken: Token): TNode;\n protected abstract createTypeCastNode(expression: TNode, targetType: string, startToken: Token): TNode;\n protected abstract createCollectionNode(elements: TNode[], startToken: Token): TNode;\n protected abstract createQuantityNode(value: number, unit: string, isCalendarUnit: boolean, startToken: Token, endToken: Token): TNode;\n protected abstract handleError(message: string, token?: Token): never | TNode;\n \n // Shared expression parsing with precedence climbing\n protected expression(): TNode {\n return this.parseExpressionWithPrecedence(0);\n }\n \n protected parseExpressionWithPrecedence(minPrecedence: number): TNode {\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 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 const index = this.expression();\n this.consume(TokenType.RBRACKET, \"Expected ']'\");\n left = this.createIndexNode(left, index, token);\n continue;\n }\n \n if (token.type === TokenType.LPAREN && this.isFunctionCall(left)) {\n // Function calls - always bind tightly\n this.current++; // inline advance()\n const args = this.parseArgumentList();\n this.consume(TokenType.RPAREN, \"Expected ')'\");\n // For function calls, we need to find the start token from the name node\n const startToken = this.tokens[this.current - args.length - 2] || token;\n left = this.createFunctionNode(left, args, startToken);\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 const typeName = this.parseTypeName();\n left = this.createMembershipTestNode(left, typeName, token);\n } else if (token.type === TokenType.IDENTIFIER && token.value === 'as') {\n this.current++; // inline advance()\n const typeName = this.parseTypeName();\n left = this.createTypeCastNode(left, typeName, token);\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(): TNode {\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 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, false, 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, true, 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.DATETIME) {\n this.advance();\n const value = token.value.substring(1); // Remove @\n return this.createLiteralNode(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.createLiteralNode(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 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 return this.handleError(`Unexpected token: ${token.value || TokenType[token.type]}`, token);\n }\n \n protected parseInvocation(): TNode {\n const token = this.peek();\n \n // Allow identifiers and keywords that can be used as member names\n if (token.type === TokenType.IDENTIFIER) {\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 this.advance();\n const args = this.parseArgumentList();\n this.consume(TokenType.RPAREN, \"Expected ')'\");\n const startToken = this.tokens[this.current - args.length - 2] || this.previous();\n return this.createFunctionNode(node, args, startToken);\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 return this.handleError(`Expected identifier after '.', got: ${token.value || TokenType[token.type]}`, token);\n }\n \n protected parseArgumentList(): TNode[] {\n const args: TNode[] = [];\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 args.push(this.expression());\n }\n\n return args;\n }\n \n protected parseCollectionElements(): TNode[] {\n const elements: TNode[] = [];\n \n if (this.peek().type === TokenType.RBRACE) {\n return elements;\n }\n\n elements.push(this.expression());\n \n while (this.match(TokenType.COMMA)) {\n elements.push(this.expression());\n }\n\n return elements;\n }\n \n protected parseTypeName(): string {\n const token = this.advance();\n if (token.type !== TokenType.IDENTIFIER) {\n this.handleError(`Expected type name, got: ${token.value || TokenType[token.type]}`, token);\n return ''; // For TypeScript, though handleError should throw/return error node\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: TNode): boolean {\n return (node as any).type === NodeType.Identifier || (node as any).type === NodeType.TypeOrIdentifier;\n }\n \n // Helper method to check if a token is a binary operator\n protected isBinaryOperatorToken(token: Token): boolean {\n if (token.type === TokenType.OPERATOR || token.type === TokenType.DOT) {\n return registry.isBinaryOperator(token.value);\n }\n if (token.type === TokenType.IDENTIFIER) {\n return registry.isKeywordOperator(token.value);\n }\n return false;\n }\n \n protected isKeywordAllowedAsMember(token: Token): boolean {\n // Keywords that can be used as member names\n if (token.type !== TokenType.IDENTIFIER) return false;\n \n const keywordsAllowed = [\n 'contains', 'and', 'or', 'xor', 'implies', \n 'as', 'is', 'div', 'mod', 'in', 'true', 'false'\n ];\n \n return keywordsAllowed.includes(token.value.toLowerCase());\n }\n \n protected isKeywordAllowedAsIdentifier(token: Token): boolean {\n // Keywords that can be used as identifiers in certain contexts\n return this.isKeywordAllowedAsMember(token);\n }\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)) return this.advance();\n const token = this.peek();\n return this.handleError(message + ` at token: ${token.value || TokenType[token.type]}`, token) as any;\n }\n}","import { TokenType } from './lexer';\nimport type { Token, LexerOptions } from './lexer';\nimport { BaseParser } from './parser-base';\nimport { NodeType } from './types';\nimport type {\n Position,\n Range,\n ASTNode,\n IdentifierNode,\n TypeOrIdentifierNode,\n LiteralNode,\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';\n\n// Re-export types for backward compatibility\nexport {\n NodeType,\n type Position,\n type ASTNode,\n type IdentifierNode,\n type TypeOrIdentifierNode,\n type LiteralNode,\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';\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}\n\nexport class Parser extends BaseParser<ASTNode> {\n private mode: 'simple' | 'lsp';\n private options: ParserOptions;\n private errors?: ParseError[];\n private nodeIdCounter?: number;\n private nodeIndex?: Map<string, ASTNode>;\n private nodesByType?: Map<NodeType | 'Error', ASTNode[]>;\n private identifierIndex?: Map<string, ASTNode[]>;\n private currentParent?: ASTNode | null;\n private input: string;\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 \n super(input, lexerOptions);\n \n this.input = input;\n this.mode = mode;\n this.options = options;\n \n // Initialize LSP features only if needed\n if (this.mode === 'lsp') {\n this.errors = [];\n this.nodeIdCounter = 0;\n this.nodeIndex = new Map();\n this.nodesByType = new Map();\n this.identifierIndex = new Map();\n this.currentParent = null;\n }\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 new Error(`Unexpected token: ${token.value || TokenType[token.type]}`);\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 this.nodeIndex!.clear();\n this.nodesByType!.clear();\n this.identifierIndex!.clear();\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(`Unexpected token: ${token.value || TokenType[token.type]}`, token);\n }\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 const result: ParseResult = {\n ast,\n errors: this.errors!,\n indexes: {\n nodeById: this.nodeIndex!,\n nodesByType: this.nodesByType!,\n identifiers: this.identifierIndex!\n }\n };\n \n // Add cursor context if partial parsing\n if (this.options.partialParse) {\n const nodeAtCursor = this.findNodeAtPosition(ast, this.options.partialParse.cursorPosition);\n result.cursorContext = {\n node: nodeAtCursor,\n expectedTokens: this.getExpectedTokens(nodeAtCursor),\n availableCompletions: this.getCompletions(nodeAtCursor)\n };\n }\n \n return result;\n }\n\n // Implement abstract methods for node creation\n protected createIdentifierNode(name: string, token: Token): ASTNode {\n const range = this.getRangeFromToken(token);\n const isType = name[0] && name[0] >= 'A' && name[0] <= 'Z';\n const nodeType = isType ? NodeType.TypeOrIdentifier : NodeType.Identifier;\n \n const node: ASTNode = {\n type: nodeType,\n name,\n range\n };\n \n // Add LSP features if in LSP mode\n if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token);\n \n // Index identifier\n const identifiers = this.identifierIndex!.get(name) || [];\n identifiers.push(node);\n this.identifierIndex!.set(name, identifiers);\n }\n \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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token);\n }\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 if (this.mode === 'lsp') {\n // For binary nodes, we need to find the actual start and end tokens\n const startToken = this.tokens.find(t => t.start === left.range.start.offset) || token;\n const endToken = this.tokens.find(t => t.end === right.range.end.offset) || token;\n this.enrichNodeForLSP(node, startToken, endToken);\n \n // Set up parent-child relationships\n if (node.id) {\n left.parent = node;\n right.parent = node;\n node.children = [left, right];\n }\n }\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 if (this.mode === 'lsp') {\n const endToken = this.tokens.find(t => t.end === operand.range.end.offset) || token;\n this.enrichNodeForLSP(node, token, endToken);\n \n if (node.id) {\n operand.parent = node;\n node.children = [operand];\n }\n }\n \n return node;\n }\n\n protected createFunctionNode(name: ASTNode, args: ASTNode[], startToken: Token): 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 if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === name.range.start.offset) || startToken;\n const endToken = this.tokens.find(t => t.end === endNode.range.end.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n name.parent = node;\n args.forEach(arg => { arg.parent = node; });\n node.children = [name, ...args];\n }\n }\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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token);\n }\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 if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === expression.range.start.offset) || startToken;\n const endToken = this.tokens.find(t => t.end === index.range.end.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n expression.parent = node;\n index.parent = node;\n node.children = [expression, index];\n }\n }\n \n return node;\n }\n\n\n protected createMembershipTestNode(expression: ASTNode, targetType: string, startToken: Token): MembershipTestNode {\n // The range should extend from expression 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: this.getRangeFromTokens(startToken, endToken)\n };\n \n if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === expression.range.start.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n expression.parent = node;\n node.children = [expression];\n }\n }\n \n return node;\n }\n\n protected createTypeCastNode(expression: ASTNode, targetType: string, startToken: Token): TypeCastNode {\n // The range should extend from expression 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: this.getRangeFromTokens(startToken, endToken)\n };\n \n if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === expression.range.start.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n expression.parent = node;\n node.children = [expression];\n }\n }\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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, startToken, endToken);\n \n if (node.id) {\n elements.forEach(elem => { elem.parent = node; });\n node.children = elements;\n }\n }\n \n return node;\n }\n\n protected createQuantityNode(value: number, unit: string, isCalendarUnit: boolean, startToken: Token, endToken: Token): QuantityNode {\n const node: QuantityNode = {\n type: NodeType.Quantity,\n value,\n unit,\n isCalendarUnit,\n range: this.getRangeFromTokens(startToken, endToken)\n };\n \n if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, startToken, endToken);\n }\n \n return node;\n }\n\n protected handleError(message: string, token?: Token): never {\n if (this.mode === 'lsp' && this.options.errorRecovery) {\n // In LSP mode with error recovery, add error and try to recover\n this.addError(message, token);\n \n // Try to synchronize\n this.synchronize();\n \n // Return error node (cast to never to satisfy type system)\n return this.createErrorNode(message, token) as never;\n }\n \n // In simple mode, throw error\n throw new Error(message);\n }\n \n // LSP mode helper methods\n private enrichNodeForLSP(node: ASTNode, startToken: Token, endToken?: Token): void {\n if (this.mode !== 'lsp') return;\n \n // Add unique ID\n node.id = `node_${this.nodeIdCounter!++}`;\n \n // Add raw source text\n const start = startToken.start;\n const end = endToken ? endToken.end : startToken.end;\n node.raw = this.input.substring(start, end);\n \n // Add trivia if preserving\n if (this.options.preserveTrivia) {\n node.leadingTrivia = []; // TODO: Implement trivia collection\n node.trailingTrivia = [];\n }\n \n // Set parent relationship\n if (this.currentParent) {\n node.parent = this.currentParent;\n }\n \n // Index node\n this.nodeIndex!.set(node.id, node);\n const nodesByType = this.nodesByType!.get(node.type) || [];\n nodesByType.push(node);\n this.nodesByType!.set(node.type, nodesByType);\n }\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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token || this.peek());\n }\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 private findNodeAtPosition(root: ASTNode, offset: number): ASTNode | null {\n // DFS to find the most specific node containing the position\n if (offset < root.range.start.offset! || offset > root.range.end.offset!) {\n return null;\n }\n \n // Check children if they exist\n if ('children' in root && Array.isArray(root.children)) {\n for (const child of root.children) {\n const found = this.findNodeAtPosition(child, offset);\n if (found) return found;\n }\n }\n \n // Check specific node types\n if (root.type === NodeType.Binary) {\n const binaryNode = root as BinaryNode;\n const leftResult = this.findNodeAtPosition(binaryNode.left, offset);\n if (leftResult) return leftResult;\n const rightResult = this.findNodeAtPosition(binaryNode.right, offset);\n if (rightResult) return rightResult;\n } else if (root.type === NodeType.Unary) {\n const unaryNode = root as UnaryNode;\n return this.findNodeAtPosition(unaryNode.operand, offset);\n } else if (root.type === NodeType.Function) {\n const funcNode = root as FunctionNode;\n const nameResult = this.findNodeAtPosition(funcNode.name, offset);\n if (nameResult) return nameResult;\n for (const arg of funcNode.arguments) {\n const argResult = this.findNodeAtPosition(arg, offset);\n if (argResult) return argResult;\n }\n }\n \n return root;\n }\n \n private getExpectedTokens(node: ASTNode | null): TokenType[] {\n if (!node) return this.getExpectedTokensForError();\n \n // Context-specific expectations\n switch (node.type) {\n case NodeType.Binary:\n return [TokenType.DOT, TokenType.LBRACKET];\n case NodeType.Identifier:\n case NodeType.TypeOrIdentifier:\n return [TokenType.DOT, TokenType.LPAREN, TokenType.LBRACKET];\n default:\n return this.getExpectedTokensForError();\n }\n }\n \n private getExpectedTokensForError(): TokenType[] {\n // Common continuations\n return [\n TokenType.EOF,\n TokenType.DOT,\n TokenType.LBRACKET,\n TokenType.LPAREN,\n TokenType.OPERATOR,\n TokenType.IDENTIFIER\n ];\n }\n \n private getCompletions(node: ASTNode | null): string[] {\n if (!node) return [];\n \n const completions: string[] = [];\n \n // Add all identifiers seen so far\n if (this.identifierIndex) {\n for (const name of Array.from(this.identifierIndex.keys())) {\n completions.push(name);\n }\n }\n \n // Add common FHIRPath functions\n completions.push(\n 'where', 'select', 'first', 'last', 'tail',\n 'skip', 'take', 'count', 'empty', 'exists'\n );\n \n return completions;\n }\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 */\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 case NodeType.TypeOrIdentifier: {\n const id = node as IdentifierNode | TypeOrIdentifierNode;\n return id.name;\n }\n \n case NodeType.Variable: {\n const v = node as VariableNode;\n return v.name;\n }\n \n case NodeType.Binary: {\n const bin = node as BinaryNode;\n const op = bin.operator;\n \n // For simple expressions, put on one line\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 // For complex expressions, use multiple lines\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 // Multi-line format\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 if (q.isCalendarUnit) {\n return `${q.value} ${q.unit}`;\n }\n return `${q.value} '${q.unit}'`;\n }\n \n default:\n return `<unknown:${node.type}>`;\n }\n}","import type { \n ASTNode, \n BinaryNode, \n IdentifierNode, \n LiteralNode, \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 TypeOrIdentifierNode,\n ErrorNode\n} from './types';\nimport { NodeType, DiagnosticSeverity } from './types';\nimport { registry } from './registry';\n\n// Diagnostic codes as constants to avoid magic strings\nconst DiagnosticCode = {\n UnknownOperator: 'UNKNOWN_OPERATOR',\n UnknownVariable: 'UNKNOWN_VARIABLE',\n UnknownUserVariable: 'UNKNOWN_USER_VARIABLE',\n UnknownFunction: 'UNKNOWN_FUNCTION',\n TooFewArgs: 'TOO_FEW_ARGS',\n TooManyArgs: 'TOO_MANY_ARGS',\n TypeMismatch: 'TYPE_MISMATCH',\n InputTypeMismatch: 'INPUT_TYPE_MISMATCH',\n ArgumentTypeMismatch: 'ARGUMENT_TYPE_MISMATCH',\n ParseError: 'PARSE_ERROR',\n} as const;\n\nexport class Analyzer {\n private diagnostics: Diagnostic[] = [];\n private variables: Set<string> = new Set(['$this', '$index', '$total']);\n private modelProvider?: ModelProvider;\n private userVariableTypes: Map<string, TypeInfo> = new Map();\n\n constructor(modelProvider?: ModelProvider) {\n this.modelProvider = modelProvider;\n }\n\n analyze(ast: ASTNode, userVariables?: Record<string, any>, inputType?: TypeInfo): AnalysisResult {\n this.diagnostics = [];\n this.userVariableTypes.clear();\n \n if (userVariables) {\n Object.keys(userVariables).forEach(name => {\n this.variables.add(name);\n // Try to infer types from values\n const value = userVariables[name];\n if (value !== undefined && value !== null) {\n this.userVariableTypes.set(name, this.inferValueType(value));\n }\n });\n }\n \n // Annotate AST with type information\n this.annotateAST(ast, inputType);\n \n // Perform validation with type checking\n this.visitNode(ast);\n \n return {\n diagnostics: this.diagnostics,\n ast\n };\n }\n\n private visitNode(node: ASTNode): void {\n // Handle error nodes - process them for diagnostics but don't traverse\n if (node.type === 'Error') {\n // Diagnostics already added in annotateAST\n return;\n }\n \n switch (node.type) {\n case NodeType.Binary:\n this.visitBinaryOperator(node as BinaryNode);\n break;\n case NodeType.Identifier:\n this.visitIdentifier(node as IdentifierNode);\n break;\n case NodeType.Function:\n this.visitFunctionCall(node as FunctionNode);\n break;\n case NodeType.Index:\n const indexNode = node as IndexNode;\n this.visitNode(indexNode.expression);\n this.visitNode(indexNode.index);\n break;\n case NodeType.Collection:\n (node as CollectionNode).elements.forEach(el => this.visitNode(el));\n break;\n case NodeType.Unary:\n this.visitNode((node as UnaryNode).operand);\n break;\n case NodeType.MembershipTest:\n this.visitNode((node as MembershipTestNode).expression);\n break;\n case NodeType.TypeCast:\n this.visitNode((node as TypeCastNode).expression);\n break;\n case NodeType.Variable:\n this.validateVariable((node as VariableNode).name, node);\n break;\n case NodeType.Literal:\n case NodeType.TypeOrIdentifier:\n case NodeType.TypeReference:\n // These are always valid\n break;\n }\n }\n\n private visitBinaryOperator(node: BinaryNode): void {\n this.visitNode(node.left);\n \n // Special handling for dot operator with function on right side\n if (node.operator === '.' && node.right.type === NodeType.Function) {\n const funcNode = node.right as FunctionNode;\n if (funcNode.name.type === NodeType.Identifier) {\n const funcName = (funcNode.name as IdentifierNode).name;\n const func = registry.getFunction(funcName);\n if (func && func.signature.input && node.left.typeInfo) {\n if (!this.isTypeCompatible(node.left.typeInfo, func.signature.input)) {\n const inputTypeStr = this.typeToString(node.left.typeInfo);\n const expectedTypeStr = this.typeToString(func.signature.input);\n this.addDiagnostic(\n DiagnosticSeverity.Error,\n `Type mismatch: function '${func.name}' expects input type ${expectedTypeStr} but got ${inputTypeStr}`,\n funcNode,\n DiagnosticCode.InputTypeMismatch\n );\n }\n }\n }\n }\n \n this.visitNode(node.right);\n \n // For dot operator, we don't need to check operator types\n if (node.operator === '.') {\n return;\n }\n \n const op = registry.getOperatorDefinition(node.operator);\n if (!op) {\n this.addDiagnostic(DiagnosticSeverity.Error, `Unknown operator: ${node.operator}`, node, DiagnosticCode.UnknownOperator);\n return;\n }\n \n // Type check if we have type information\n if (node.left.typeInfo && node.right.typeInfo) {\n this.checkBinaryOperatorTypes(node, op);\n }\n }\n\n private visitIdentifier(node: IdentifierNode): void {\n this.validateVariable(node.name, node);\n }\n\n private visitFunctionCall(node: FunctionNode): void {\n if (node.name.type === NodeType.Identifier) {\n const funcName = (node.name as IdentifierNode).name;\n const func = registry.getFunction(funcName);\n \n if (!func) {\n this.addDiagnostic(DiagnosticSeverity.Error, `Unknown function: ${funcName}`, node, DiagnosticCode.UnknownFunction);\n } else {\n // Check argument count based on signature\n const params = func.signature.parameters;\n const requiredParams = params.filter(p => !p.optional).length;\n const maxParams = params.length;\n \n if (node.arguments.length < requiredParams) {\n this.addDiagnostic(DiagnosticSeverity.Error, `Function '${funcName}' requires at least ${requiredParams} arguments, got ${node.arguments.length}`, node, DiagnosticCode.TooFewArgs);\n } else if (node.arguments.length > maxParams) {\n this.addDiagnostic(DiagnosticSeverity.Error, `Function '${funcName}' accepts at most ${maxParams} arguments, got ${node.arguments.length}`, node, DiagnosticCode.TooManyArgs);\n }\n \n // Type check arguments if we have type information\n if (node.typeInfo || node.arguments.some(arg => arg.typeInfo)) {\n this.checkFunctionArgumentTypes(node, func);\n }\n }\n }\n \n node.arguments.forEach(arg => this.visitNode(arg));\n }\n\n // Unified variable validation to eliminate duplication\n private validateVariable(name: string, node: ASTNode): void {\n if (name.startsWith('$')) {\n if (!this.variables.has(name)) {\n this.addDiagnostic(DiagnosticSeverity.Error, `Unknown variable: ${name}`, node, DiagnosticCode.UnknownVariable);\n }\n } else if (name.startsWith('%')) {\n const varName = name.substring(1);\n if (!this.variables.has(varName)) {\n this.addDiagnostic(DiagnosticSeverity.Error, `Unknown user variable: ${name}`, node, DiagnosticCode.UnknownUserVariable);\n }\n }\n }\n\n private addDiagnostic(severity: DiagnosticSeverity, message: string, node: ASTNode, code: string): void {\n this.diagnostics.push({\n range: node.range,\n severity,\n message,\n code,\n source: 'fhirpath-analyzer'\n });\n }\n\n // Type inference methods\n private inferType(node: ASTNode, inputType?: TypeInfo): TypeInfo {\n // Handle error nodes\n if (node.type === 'Error') {\n return this.inferErrorNodeType(node as ErrorNode, inputType);\n }\n \n switch (node.type) {\n case NodeType.Literal:\n return this.inferLiteralType(node as LiteralNode);\n \n case NodeType.Binary:\n return this.inferBinaryType(node as BinaryNode, inputType);\n \n case NodeType.Unary:\n return this.inferUnaryType(node as UnaryNode);\n \n case NodeType.Function:\n return this.inferFunctionType(node as FunctionNode, inputType);\n \n case NodeType.Identifier:\n return this.inferIdentifierType(node as IdentifierNode, inputType);\n \n case NodeType.Variable:\n return this.inferVariableType(node as VariableNode);\n \n case NodeType.Collection:\n return this.inferCollectionType(node as CollectionNode);\n \n case NodeType.TypeCast:\n return this.inferTypeCastType(node as TypeCastNode);\n \n case NodeType.MembershipTest:\n return { type: 'Boolean', singleton: true };\n \n case NodeType.TypeOrIdentifier:\n return this.inferTypeOrIdentifierType(node as TypeOrIdentifierNode, inputType);\n \n default:\n return { type: 'Any', singleton: false };\n }\n }\n \n private inferErrorNodeType(errorNode: ErrorNode, inputType?: TypeInfo): TypeInfo {\n // For error nodes, return a generic type that allows partial analysis to continue\n // This enables type checking for valid parts of broken expressions\n return { type: 'Any', singleton: false };\n }\n \n private inferLiteralType(node: LiteralNode): TypeInfo {\n switch (node.valueType) {\n case 'string':\n return { type: 'String', singleton: true };\n case 'number':\n const num = node.value as number;\n return { \n type: Number.isInteger(num) ? 'Integer' : 'Decimal', \n singleton: true \n };\n case 'boolean':\n return { type: 'Boolean', singleton: true };\n case 'date':\n return { type: 'Date', singleton: true };\n case 'datetime':\n return { type: 'DateTime', singleton: true };\n case 'time':\n return { type: 'Time', singleton: true };\n case 'null':\n return { type: 'Any', singleton: false }; // Empty collection\n default:\n return { type: 'Any', singleton: true };\n }\n }\n \n private inferBinaryType(node: BinaryNode, inputType?: TypeInfo): TypeInfo {\n const operator = registry.getOperatorDefinition(node.operator);\n if (!operator) {\n return { type: 'Any', singleton: false };\n }\n \n // For navigation (dot operator), we need special handling\n if (node.operator === '.') {\n return this.inferNavigationType(node, inputType);\n }\n \n // Infer types of operands\n const leftType = this.inferType(node.left, inputType);\n const rightType = this.inferType(node.right, inputType);\n \n // Find matching signature\n for (const sig of operator.signatures) {\n if (this.isTypeCompatible(leftType, sig.left) && \n this.isTypeCompatible(rightType, sig.right)) {\n return this.resolveResultType(sig.result, inputType, leftType, rightType);\n }\n }\n \n // Default to first signature's result type\n const defaultResult = operator.signatures[0]?.result || { type: 'Any', singleton: false };\n return this.resolveResultType(defaultResult, inputType, leftType, rightType);\n }\n \n private inferNavigationType(node: BinaryNode, inputType?: TypeInfo): TypeInfo {\n const leftType = this.inferType(node.left, inputType);\n \n // If the right side is a function, return the function's type\n if (node.right.type === NodeType.Function) {\n return this.inferType(node.right, leftType);\n }\n \n // If we have a model provider and the right side is an identifier\n if (this.modelProvider && node.right.type === NodeType.Identifier) {\n const propertyName = (node.right as IdentifierNode).name;\n \n // Use getElementType to navigate the property\n const resultType = this.modelProvider.getElementType(leftType, propertyName);\n if (resultType) {\n return resultType;\n }\n \n // If property not found and we have a concrete type from model provider, report error\n // Skip diagnostics for union types - they may have dynamic properties\n if (leftType.namespace && leftType.name && leftType.modelContext && \n !(leftType.modelContext as any).isUnion) {\n this.addDiagnostic(\n DiagnosticSeverity.Error,\n `Unknown property '${propertyName}' on type ${leftType.namespace}.${leftType.name}`,\n node.right,\n 'UNKNOWN_PROPERTY'\n );\n }\n }\n \n // Default navigation behavior\n return { type: 'Any', singleton: false };\n }\n \n private inferUnaryType(node: UnaryNode): TypeInfo {\n const operator = registry.getOperatorDefinition(node.operator);\n if (!operator) {\n return { type: 'Any', singleton: false };\n }\n \n // Unary operators typically have one signature\n const signature = operator.signatures[0];\n if (signature && typeof signature.result === 'object') {\n return signature.result;\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private inferFunctionType(node: FunctionNode, inputType?: TypeInfo): TypeInfo {\n if (node.name.type !== NodeType.Identifier) {\n return { type: 'Any', singleton: false };\n }\n \n const funcName = (node.name as IdentifierNode).name;\n const func = registry.getFunction(funcName);\n \n if (!func) {\n return { type: 'Any', singleton: false };\n }\n \n // Special handling for functions with dynamic result types\n if (func.signature.result === 'inputType') {\n // Functions like where() return the same type as input but always as collection\n return inputType ? { ...inputType, singleton: false } : { type: 'Any', singleton: false };\n } else if (func.signature.result === 'inputTypeSingleton') {\n // Functions like first(), last() return the same type as input but as singleton\n return inputType ? { ...inputType, singleton: true } : { type: 'Any', singleton: true };\n } else if (func.signature.result === 'parameterType' && node.arguments.length > 0) {\n // Functions like select() return the type of the first parameter expression as collection\n const paramType = this.inferType(node.arguments[0]!, inputType);\n return { ...paramType, singleton: false };\n } else if (typeof func.signature.result === 'object') {\n return func.signature.result;\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private inferIdentifierType(node: IdentifierNode, inputType?: TypeInfo): TypeInfo {\n // First, try to navigate from input type (most common case)\n if (inputType && this.modelProvider) {\n const elementType = this.modelProvider.getElementType(inputType, node.name);\n if (elementType) {\n return elementType;\n }\n }\n \n // Only check if it's a type name if it starts with uppercase (FHIR convention)\n // or if there's no input type context\n if (this.modelProvider && (!inputType || /^[A-Z]/.test(node.name))) {\n const typeInfo = this.modelProvider.getType(node.name);\n if (typeInfo) {\n return typeInfo;\n }\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private inferTypeOrIdentifierType(node: TypeOrIdentifierNode, inputType?: TypeInfo): TypeInfo {\n // TypeOrIdentifier can be either a type name or a property navigation\n \n // First, try navigation from input type (most common case)\n if (inputType && this.modelProvider) {\n const elementType = this.modelProvider.getElementType(inputType, node.name);\n if (elementType) {\n return elementType;\n }\n }\n \n // Then check if it's a type name (only for uppercase names or no input context)\n if (this.modelProvider && (!inputType || /^[A-Z]/.test(node.name))) {\n const typeInfo = this.modelProvider.getType(node.name);\n if (typeInfo) {\n return typeInfo;\n }\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private inferVariableType(node: VariableNode): TypeInfo {\n // Built-in variables\n if (node.name === '$this') {\n return { type: 'Any', singleton: false }; // $this is usually a collection\n } else if (node.name === '$index' || node.name === '$total') {\n return { type: 'Integer', singleton: true };\n }\n \n // User-defined variables - check with or without % prefix\n let varName = node.name;\n if (varName.startsWith('%')) {\n varName = varName.substring(1);\n }\n \n const userType = this.userVariableTypes.get(varName);\n if (userType) {\n return userType;\n }\n \n return { type: 'Any', singleton: true };\n }\n \n private inferCollectionType(node: CollectionNode): TypeInfo {\n if (node.elements.length === 0) {\n return { type: 'Any', singleton: false };\n }\n \n // Infer types of all elements\n const elementTypes = node.elements.map(el => this.inferType(el));\n \n // If all elements have the same type, use that\n const firstType = elementTypes[0];\n if (firstType) {\n const allSameType = elementTypes.every(t => \n t.type === firstType.type && \n t.namespace === firstType.namespace && \n t.name === firstType.name\n );\n \n if (allSameType) {\n return { ...firstType, singleton: false };\n }\n }\n \n // Otherwise, it's a heterogeneous collection\n return { type: 'Any', singleton: false };\n }\n \n private inferTypeCastType(node: TypeCastNode): TypeInfo {\n const targetType = node.targetType;\n \n // If we have a model provider, try to get the type info\n if (this.modelProvider) {\n const typeInfo = this.modelProvider.getType(targetType);\n if (typeInfo) {\n return typeInfo;\n }\n }\n \n // Otherwise, check if it's a FHIRPath primitive type\n const fhirPathTypes = ['String', 'Boolean', 'Integer', 'Decimal', 'Date', 'DateTime', 'Time', 'Quantity'];\n if (fhirPathTypes.includes(targetType)) {\n return { type: targetType as TypeName, singleton: true };\n }\n \n return { type: 'Any', singleton: true };\n }\n \n private isTypeCompatible(source: TypeInfo, target: TypeInfo): boolean {\n // Exact match\n if (source.type === target.type && source.singleton === target.singleton) {\n return true;\n }\n \n // Any is compatible with everything\n if (source.type === 'Any' || target.type === 'Any') {\n return true;\n }\n \n // Singleton can be promoted to collection\n if (source.singleton && !target.singleton && source.type === target.type) {\n return true;\n }\n \n // Type hierarchy compatibility\n if (this.isSubtypeOf(source.type, target.type)) {\n // Check singleton compatibility\n if (source.singleton === target.singleton || (source.singleton && !target.singleton)) {\n return true;\n }\n }\n \n // Numeric type compatibility\n if (this.isNumericType(source.type) && this.isNumericType(target.type)) {\n // Integer can be used where Decimal is expected\n if (source.type === 'Integer' && target.type === 'Decimal') {\n return source.singleton !== undefined && target.singleton !== undefined && \n (source.singleton === target.singleton || (source.singleton && !target.singleton));\n }\n }\n \n return false;\n }\n \n private isSubtypeOf(source: TypeName, target: TypeName): boolean {\n // Basic subtyping rules\n if (source === target) return true;\n if (target === 'Any') return true;\n \n // Integer is a subtype of Decimal\n if (source === 'Integer' && target === 'Decimal') return true;\n \n // Model-specific subtyping would be checked via ModelProvider\n // For now, we don't have other subtyping rules\n return false;\n }\n \n private isNumericType(type: TypeName): boolean {\n return type === 'Integer' || type === 'Decimal' || type === 'Quantity';\n }\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 { type: Number.isInteger(value) ? 'Integer' : '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 private resolveResultType(\n resultSpec: TypeInfo | 'inputType' | 'leftType' | 'rightType',\n inputType?: TypeInfo,\n leftType?: TypeInfo,\n rightType?: TypeInfo\n ): TypeInfo {\n if (typeof resultSpec !== 'string') {\n return resultSpec;\n }\n \n switch (resultSpec) {\n case 'inputType':\n return inputType || { type: 'Any', singleton: false };\n case 'leftType':\n // For union-like operators, result is always a collection\n return leftType ? { ...leftType, singleton: false } : { type: 'Any', singleton: false };\n case 'rightType':\n return rightType ? { ...rightType, singleton: false } : { type: 'Any', singleton: false };\n default:\n return { type: 'Any', singleton: false };\n }\n }\n \n private checkBinaryOperatorTypes(node: BinaryNode, operator: import('./types').OperatorDefinition): void {\n const leftType = node.left.typeInfo!;\n const rightType = node.right.typeInfo!;\n \n // Find if any signature matches\n let foundMatch = false;\n for (const sig of operator.signatures) {\n if (this.isTypeCompatible(leftType, sig.left) && \n this.isTypeCompatible(rightType, sig.right)) {\n foundMatch = true;\n break;\n }\n }\n \n if (!foundMatch) {\n const leftTypeStr = this.typeToString(leftType);\n const rightTypeStr = this.typeToString(rightType);\n this.addDiagnostic(\n DiagnosticSeverity.Error,\n `Type mismatch: operator '${node.operator}' cannot be applied to types ${leftTypeStr} and ${rightTypeStr}`,\n node,\n DiagnosticCode.TypeMismatch\n );\n }\n }\n \n private checkFunctionArgumentTypes(node: FunctionNode, func: import('./types').FunctionDefinition): void {\n const params = func.signature.parameters;\n \n for (let i = 0; i < Math.min(node.arguments.length, params.length); i++) {\n const arg = node.arguments[i]!;\n const param = params[i]!;\n \n if (arg.typeInfo && !param.expression) {\n // For non-expression parameters, check type compatibility\n if (!this.isTypeCompatible(arg.typeInfo, param.type)) {\n const argTypeStr = this.typeToString(arg.typeInfo);\n const paramTypeStr = this.typeToString(param.type);\n this.addDiagnostic(\n DiagnosticSeverity.Error,\n `Type mismatch: argument ${i + 1} of function '${func.name}' expects ${paramTypeStr} but got ${argTypeStr}`,\n arg,\n DiagnosticCode.ArgumentTypeMismatch\n );\n }\n }\n }\n }\n \n private typeToString(type: TypeInfo): string {\n const singletonStr = type.singleton ? '' : '[]';\n if (type.namespace && type.name) {\n return `${type.namespace}.${type.name}${singletonStr}`;\n }\n return `${type.type}${singletonStr}`;\n }\n \n /**\n * Annotate AST with type information\n */\n private annotateAST(node: ASTNode, inputType?: TypeInfo): void {\n // Handle error nodes\n if (node.type === 'Error') {\n const errorNode = node as ErrorNode;\n // Infer a reasonable type for error nodes\n node.typeInfo = this.inferErrorNodeType(errorNode, inputType);\n // Add diagnostic for the error\n this.addDiagnostic(\n errorNode.severity || DiagnosticSeverity.Error,\n errorNode.message,\n errorNode,\n errorNode.code?.toString() || DiagnosticCode.ParseError\n );\n return;\n }\n \n // Infer and attach type info\n node.typeInfo = this.inferType(node, inputType);\n\n // Recursively annotate children\n switch (node.type) {\n case NodeType.Binary:\n const binaryNode = node as BinaryNode;\n this.annotateAST(binaryNode.left, inputType);\n \n // For navigation, pass the left's type as input to the right\n if (binaryNode.operator === '.') {\n this.annotateAST(binaryNode.right, binaryNode.left.typeInfo);\n } else {\n this.annotateAST(binaryNode.right, inputType);\n }\n break;\n \n case NodeType.Unary:\n const unaryNode = node as UnaryNode;\n this.annotateAST(unaryNode.operand, inputType);\n break;\n \n case NodeType.Function:\n const funcNode = node as FunctionNode;\n this.annotateAST(funcNode.name, inputType);\n funcNode.arguments.forEach(arg => this.annotateAST(arg, inputType));\n break;\n \n case NodeType.Collection:\n const collNode = node as CollectionNode;\n collNode.elements.forEach(el => this.annotateAST(el, inputType));\n break;\n \n case NodeType.TypeCast:\n const castNode = node as TypeCastNode;\n this.annotateAST(castNode.expression, inputType);\n break;\n \n case NodeType.MembershipTest:\n const memberNode = node as MembershipTestNode;\n this.annotateAST(memberNode.expression, inputType);\n break;\n \n case NodeType.Index:\n const indexNode = node as IndexNode;\n this.annotateAST(indexNode.expression, inputType);\n this.annotateAST(indexNode.index, inputType);\n break;\n \n case NodeType.TypeOrIdentifier:\n // TypeOrIdentifier doesn't have children to annotate\n break;\n }\n }\n}","import type { ModelProvider, TypeInfo, TypeName } from './types';\nimport { CanonicalManager as createCanonicalManager, type Config, type CanonicalManager as ICanonicalManager, 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: ICanonicalManager;\n private schemaCache: Map<string, FHIRSchema> = new Map();\n private hierarchyCache: Map<string, FHIRSchema[]> = new Map();\n private initialized = false;\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 // Common FHIR types to preload\n private readonly commonTypes = [\n 'Patient', 'HumanName', 'Observation', 'CodeableConcept', 'Coding', \n 'Extension', 'Reference', 'Identifier', 'Period', 'ContactPoint',\n 'Address', 'Attachment', 'Meta', 'Narrative'\n ];\n \n constructor(private config: FHIRModelProviderConfig) {\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 // Preload common types with error handling\n const results = await Promise.allSettled(\n this.commonTypes.map(type => this.loadSchemaAsync(type))\n );\n \n // Log any failed loads\n results.forEach((result, index) => {\n if (result.status === 'rejected') {\n console.warn(`Failed to preload ${this.commonTypes[index]}:`, result.reason);\n }\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 private async loadSchemaAsync(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 console.warn(`Failed to load schema for ${typeName}:`, error);\n return undefined;\n }\n }\n \n private loadSchemaCached(typeName: string): FHIRSchema | undefined {\n return this.schemaCache.get(typeName);\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 while (current.base && current.base !== 'Resource' && current.base !== 'Element') {\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.loadSchemaAsync(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 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, at least return the current schema\n // This might happen if the schema wasn't pre-loaded during initialization\n return [schema];\n }\n \n private mapToFHIRPathType(fhirType: string): TypeName {\n return this.typeMapping[fhirType] || 'Any';\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 // Synchronous implementation (requires pre-loaded schemas)\n getType(typeName: string): TypeInfo<FHIRModelContext> | undefined {\n // Check if it's a primitive type - these don't require initialization\n if (this.typeMapping[typeName]) {\n return {\n type: this.typeMapping[typeName],\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 // Load schema from cache\n const schema = this.loadSchemaCached(typeName);\n if (!schema) {\n // Schema not found - this is expected for non-type identifiers\n return undefined;\n }\n \n const schemaHierarchy = this.getSchemaHierarchyCached(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 getElementType( parentType: TypeInfo<FHIRModelContext>, propertyName: string): TypeInfo<FHIRModelContext> | undefined {\n const context = parentType.modelContext;\n if (!context) return undefined;\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 const elementSchema = this.loadSchemaCached(elementType);\n if (elementSchema) {\n elementSchemaHierarchy = this.getSchemaHierarchyCached(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 direct match\n return type.type === typeName ? type : 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 helper methods for loading additional schemas\n async loadType(typeName: string): Promise<TypeInfo<FHIRModelContext> | undefined> {\n await this.loadSchemaAsync(typeName);\n return this.getType(typeName);\n }\n}","import { Parser } from './parser';\nimport { Interpreter, RuntimeContextManager } from './interpreter';\nimport type { ASTNode, RuntimeContext, EvaluationResult, FunctionEvaluator } from './types';\nimport { Registry } from './registry';\nimport * as operations from './operations';\n\nexport interface TraceEntry {\n name: string;\n values: any[];\n depth: number;\n timestamp: number;\n projection?: any[];\n}\n\nexport interface InspectOptions {\n input?: unknown;\n variables?: Record<string, unknown>;\n maxTraces?: number;\n}\n\nexport interface InspectResult {\n expression: string;\n result: any[];\n ast: ASTNode;\n traces: TraceEntry[];\n executionTime: number;\n errors?: Array<{ type: string; message: string; location?: { line: number; column: number } }>;\n warnings?: Array<{ code: string; message: string }>;\n}\n\nclass TraceCollector {\n traces: TraceEntry[] = [];\n maxTraces?: number;\n startTime: number;\n depth: number = 0;\n\n constructor(maxTraces?: number) {\n this.maxTraces = maxTraces;\n this.startTime = Date.now();\n }\n\n addTrace(name: string, values: any[], projection?: any[]) {\n if (this.maxTraces && this.traces.length >= this.maxTraces) {\n return;\n }\n \n const timestamp = Date.now() - this.startTime;\n this.traces.push({\n name,\n values: [...values], // Clone to prevent mutation\n depth: this.depth,\n timestamp,\n projection: projection ? [...projection] : undefined\n });\n }\n\n getTraces(): TraceEntry[] {\n return [...this.traces];\n }\n}\n\nfunction createTraceInterceptor(collector: TraceCollector): FunctionEvaluator {\n const originalEvaluator = operations.traceFunction.evaluate;\n \n return (input: any[], context: RuntimeContext, args: ASTNode[], evaluator: any): EvaluationResult => {\n // Check if we've reached max traces\n if (collector.maxTraces && collector.traces.length >= collector.maxTraces) {\n // Still call original to maintain console output\n return originalEvaluator(input, context, args, evaluator);\n }\n\n // Evaluate the name argument\n if (args.length === 0) {\n collector.addTrace('(unnamed)', input);\n return originalEvaluator(input, context, args, evaluator);\n }\n\n const nameResult = evaluator(args[0], input, context);\n if (nameResult.value.length !== 1 || typeof nameResult.value[0] !== 'string') {\n return originalEvaluator(input, context, args, evaluator);\n }\n \n const name = nameResult.value[0];\n \n // If projection argument is provided, evaluate it\n let projection: any[] | undefined;\n if (args.length === 2 && args[1]) {\n const projectionResult = evaluator(args[1], input, context);\n projection = projectionResult.value;\n }\n \n collector.addTrace(name, input, projection);\n \n // Call original evaluator to maintain console output and correct behavior\n return originalEvaluator(input, context, args, evaluator);\n };\n}\n\nexport function inspect(\n expression: string,\n options: InspectOptions = {}\n): InspectResult {\n const startTime = Date.now();\n \n try {\n const parser = new Parser(expression);\n const parseResult = parser.parse();\n \n // Collect parse errors\n const errors = parseResult.errors.map(err => ({\n type: 'ParseError',\n message: err.message,\n location: err.position ? {\n line: err.position.line,\n column: err.position.offset || 0\n } : undefined\n }));\n \n if (errors.length > 0) {\n return {\n expression,\n result: [],\n ast: parseResult.ast,\n traces: [],\n executionTime: Date.now() - startTime,\n errors\n };\n }\n \n const ast = parseResult.ast;\n \n // Create trace collector\n const traceCollector = new TraceCollector(options.maxTraces);\n \n // Create a custom registry with our trace interceptor\n const registry = new Registry();\n \n // Store original trace function\n const originalTraceEvaluator = operations.traceFunction.evaluate;\n \n // Replace with interceptor\n (operations.traceFunction as any).evaluate = createTraceInterceptor(traceCollector);\n \n try {\n // Create interpreter with our registry\n const interpreter = new Interpreter(registry);\n \n const input = options.input === undefined ? [] : Array.isArray(options.input) ? options.input : [options.input];\n \n // Create context with variables\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 let result: any[] = [];\n let evalErrors: Array<{ type: string; message: string }> = [];\n \n try {\n const evalResult = interpreter.evaluate(ast, input, context);\n result = evalResult.value;\n } catch (error) {\n evalErrors.push({\n type: 'EvaluationError',\n message: error instanceof Error ? error.message : String(error)\n });\n }\n \n const executionTime = Date.now() - startTime;\n \n return {\n expression,\n result,\n ast,\n traces: traceCollector.getTraces(),\n executionTime,\n errors: evalErrors.length > 0 ? evalErrors : undefined\n };\n \n } finally {\n // Always restore original evaluator\n (operations.traceFunction as any).evaluate = originalTraceEvaluator;\n }\n \n } catch (error) {\n // Unexpected error\n return {\n expression,\n result: [],\n ast: { type: 'Error' as any, message: 'Failed to parse', range: { start: { line: 1, offset: 0 }, end: { line: 1, offset: 0 } } } as any,\n traces: [],\n executionTime: Date.now() - startTime,\n errors: [{\n type: 'UnexpectedError',\n message: error instanceof Error ? error.message : String(error)\n }]\n };\n }\n}","import { Parser } from './parser';\nimport { Interpreter, RuntimeContextManager } from './interpreter';\nimport { Analyzer } from './analyzer';\nimport type { AnalysisResult } from './types';\n\nexport interface EvaluateOptions {\n input?: unknown;\n variables?: Record<string, unknown>;\n}\n\nexport function evaluate(\n expression: string,\n options: EvaluateOptions = {}\n): any[] {\n const parser = new Parser(expression);\n const parseResult = parser.parse();\n \n // Check for parse errors\n if (parseResult.errors.length > 0) {\n // For backward compatibility, throw the first error\n const firstError = parseResult.errors[0]!;\n throw new Error(firstError.message);\n }\n \n const ast = parseResult.ast;\n \n const interpreter = new Interpreter();\n const input = options.input === undefined ? [] : Array.isArray(options.input) ? options.input : [options.input];\n \n // Create context with variables if provided\n let context = RuntimeContextManager.create(input);\n \n // Set $this to the input (required for expressions like $this.where(...))\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 const result = interpreter.evaluate(ast, input, context);\n \n return result.value;\n}\n\nexport 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): AnalysisResult {\n // Use LSP mode with error recovery if requested\n const parserOptions = options.errorRecovery \n ? { mode: 'lsp' as const, errorRecovery: true }\n : undefined;\n \n const parser = new Parser(expression, parserOptions);\n const parseResult = parser.parse();\n \n // Check for parse errors only if error recovery is disabled\n if (!options.errorRecovery && parseResult.errors.length > 0) {\n // For backward compatibility, throw the first error\n const firstError = parseResult.errors[0]!;\n throw new Error(firstError.message);\n }\n \n const ast = parseResult.ast;\n \n // Create analyzer with optional model provider\n const analyzer = new Analyzer(options.modelProvider);\n const analysisResult = analyzer.analyze(ast, options.variables, options.inputType);\n \n // If error recovery is enabled, merge parse errors into diagnostics\n if (options.errorRecovery && parseResult.errors.length > 0) {\n // Parse errors are already converted to diagnostics by the analyzer\n // when it encounters Error nodes in the AST\n }\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, TraceEntry } from './inspect';\n"]}
1
+ {"version":3,"sources":["../src/lexer.ts","../src/types.ts","../src/operations/index.ts","../src/quantity-value.ts","../src/boxing.ts","../src/operations/plus-operator.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/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/errors.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/union-operator.ts","../src/operations/combine-operator.ts","../src/operations/dot-operator.ts","../src/interpreter.ts","../src/operations/where-function.ts","../src/operations/select-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/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/substring-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/trace-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/registry.ts","../src/cursor-nodes.ts","../src/parser.ts","../src/analyzer.ts","../src/model-provider.ts","../src/inspect.ts","../src/completion-provider.ts","../src/index.ts"],"names":["TokenType","charCode","DiagnosticSeverity","evaluate","ErrorCodes","registry","result","CursorContext","createCanonicalManager","CompletionKind","partialText"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 \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 lspLine: number = 0; // LSP: zero-based\n private lspCharacter: number = 0; // LSP: zero-based character within line\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 this.advance();\n return this.createToken(TokenType.OPERATOR, '+', start, this.position, startLine, startColumn);\n \n case '-':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '-', start, this.position, startLine, startColumn);\n \n case '*':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '*', start, this.position, startLine, startColumn);\n \n case '/':\n // Check for comments\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 this.advance();\n return this.createToken(TokenType.OPERATOR, '/', start, this.position, startLine, startColumn);\n \n case '<':\n this.advance();\n if (this.current() === '=') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '<=', start, this.position, startLine, startColumn);\n }\n return this.createToken(TokenType.OPERATOR, '<', start, this.position, startLine, startColumn);\n \n case '>':\n this.advance();\n if (this.current() === '=') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '>=', start, this.position, startLine, startColumn);\n }\n return this.createToken(TokenType.OPERATOR, '>', start, this.position, startLine, startColumn);\n \n case '=':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '=', start, this.position, startLine, startColumn);\n \n case '!':\n this.advance();\n if (this.current() === '=') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '!=', start, this.position, startLine, startColumn);\n } else if (this.current() === '~') {\n this.advance();\n return this.createToken(TokenType.OPERATOR, '!~', start, this.position, startLine, startColumn);\n }\n // '!' alone is not a valid token in FHIRPath\n throw this.error(`Unexpected character '!' at position ${start}`);\n \n case '~':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '~', start, this.position, startLine, startColumn);\n \n case '|':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '|', start, this.position, startLine, startColumn);\n \n case '&':\n this.advance();\n return this.createToken(TokenType.OPERATOR, '&', start, this.position, 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 // 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 while (this.position < this.input.length) {\n const charCode = this.input.charCodeAt(this.position);\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n (charCode >= 48 && charCode <= 57) || // 0-9\n charCode === 95) { // _\n this.advance();\n } else {\n break;\n }\n }\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 this.advance(); // Skip opening `\n \n while (this.position < this.input.length) {\n const char = this.current();\n \n if (char === '`') {\n this.advance(); // Skip closing `\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.IDENTIFIER, value, start, this.position, startLine, startColumn);\n }\n \n if (char === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated delimited identifier');\n }\n }\n \n this.advance();\n }\n \n throw this.error('Unterminated delimited identifier');\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\n while (this.position < this.input.length) {\n const charCode = this.input.charCodeAt(this.position);\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n (charCode >= 48 && charCode <= 57) || // 0-9\n charCode === 95) { // _\n this.advance();\n } else {\n break;\n }\n }\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.advance(); // Skip opening `\n \n while (this.position < this.input.length) {\n const ch = this.current();\n \n if (ch === '`') {\n this.advance(); // Skip closing `\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 if (ch === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated environment variable');\n }\n }\n \n this.advance();\n }\n \n throw this.error('Unterminated environment variable');\n } else if (char === \"'\") {\n // String format (backwards compatibility): %'identifier'\n this.advance(); // Skip opening '\n \n while (this.position < this.input.length) {\n const ch = this.current();\n \n if (ch === \"'\") {\n this.advance(); // Skip closing '\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 if (ch === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated environment variable');\n }\n }\n \n this.advance();\n }\n \n throw this.error('Unterminated environment variable');\n } else {\n // Simple identifier: %identifier\n const charCode = this.input.charCodeAt(this.position);\n if (!((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n charCode === 95)) { // _\n throw this.error('Invalid environment variable name');\n }\n \n // Read the identifier part\n while (this.position < this.input.length) {\n const charCode = this.input.charCodeAt(this.position);\n if ((charCode >= 65 && charCode <= 90) || // A-Z\n (charCode >= 97 && charCode <= 122) || // a-z\n (charCode >= 48 && charCode <= 57) || // 0-9\n charCode === 95) { // _\n this.advance();\n } else {\n break;\n }\n }\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: string): Token {\n const start = this.position;\n const startLine = this.line;\n const startColumn = this.column;\n \n this.advance(); // Skip opening quote\n \n while (this.position < this.input.length) {\n const char = this.current();\n \n if (char === quote) {\n this.advance(); // Skip closing quote\n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.STRING, value, start, this.position, startLine, startColumn);\n }\n \n if (char === '\\\\') {\n this.advance(); // Skip escape character\n if (this.position >= this.input.length) {\n throw this.error('Unterminated string');\n }\n // Skip the escaped character\n this.advance();\n } else {\n this.advance();\n }\n }\n \n throw this.error('Unterminated string');\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 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 // 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 // Optional time part\n if (this.current() === 'T') {\n this.advance();\n this.readTimeFormat();\n }\n \n // Optional timezone\n this.readTimezone();\n \n const value = this.input.substring(start, this.position);\n return this.createToken(TokenType.DATETIME, 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 if (this.current() === '.') {\n this.advance();\n if (!this.isDigit(this.current())) {\n throw this.error('Invalid time format');\n }\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 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 this.lspLine++;\n this.lspCharacter = 0;\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 this.lspLine++;\n this.lspCharacter = 0;\n }\n } else {\n this.column++;\n this.lspCharacter++;\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 /**\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 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}","import type { Token, TokenType } from './lexer';\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 // 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 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 }>;\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}\n\n// Node types enum - string-based for better debugging\nexport enum NodeType {\n EOF = 'EOF',\n Binary = 'Binary',\n Unary = 'Unary',\n TypeOrIdentifier = 'TypeOrIdentifier',\n Identifier = 'Identifier',\n Literal = 'Literal',\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';\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 TypeOrIdentifierNode extends BaseASTNode {\n type: NodeType.TypeOrIdentifier;\n name: string;\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 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 isCalendarUnit?: boolean;\n}\n\n// Unified ASTNode type - discriminated union\nexport type ASTNode = \n | IdentifierNode\n | TypeOrIdentifierNode\n | LiteralNode\n | BinaryNode\n | UnaryNode\n | FunctionNode\n | VariableNode\n | IndexNode\n | MembershipTestNode\n | TypeCastNode\n | CollectionNode\n | TypeReferenceNode\n | QuantityNode\n | ErrorNode;\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('./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}\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', 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('./boxing').FHIRPathValue[], context: RuntimeContext) => Promise<EvaluationResult>;\n\nexport type OperationEvaluator = (input: import('./boxing').FHIRPathValue[], context: RuntimeContext, ...args: any[]) => Promise<EvaluationResult>;\n\nexport type FunctionEvaluator = (\n input: import('./boxing').FHIRPathValue[],\n context: RuntimeContext,\n args: ASTNode[],\n evaluator: (node: ASTNode, input: import('./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","// 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';\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 { 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';\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 { substringFunction } from './substring-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';\n\n// Utility functions\nexport { traceFunction } from './trace-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 { 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 unit to UCUM unit mapping\n */\nexport const CALENDAR_TO_UCUM: Record<string, string> = {\n 'year': 'a', // annum\n 'years': 'a',\n 'month': 'mo', // month\n 'months': 'mo',\n 'week': 'wk', // week\n 'weeks': 'wk',\n 'day': 'd', // day\n 'days': 'd',\n 'hour': 'h', // hour\n 'hours': 'h',\n 'minute': 'min', // minute\n 'minutes': 'min',\n 'second': 's', // second\n 'seconds': 's',\n 'millisecond': 'ms', // millisecond\n 'milliseconds': 'ms'\n};\n\n/**\n * Create a quantity value\n */\nexport function createQuantity(value: number, unit: string, isCalendarUnit: boolean = false): QuantityValue {\n const actualUnit = isCalendarUnit && CALENDAR_TO_UCUM[unit] ? CALENDAR_TO_UCUM[unit] : unit;\n return {\n value,\n unit: actualUnit\n };\n}\n\n/**\n * Get or create the UCUM quantity for a QuantityValue\n */\nexport function getUcumQuantity(quantity: QuantityValue): Quantity | null {\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 */\nexport function isValidQuantity(quantity: QuantityValue): boolean {\n return getUcumQuantity(quantity) !== null;\n}\n\n/**\n * Add two quantities\n */\nexport function addQuantities(left: QuantityValue, right: QuantityValue): QuantityValue | null {\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 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 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 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 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 { addQuantities } from '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 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 if (typeof l === 'string' || typeof r === 'string') {\n return { value: [box(String(l) + String(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 other types, convert to string\n return { value: [box(String(l) + String(r), { type: 'String', singleton: true })], 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 type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 = 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 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 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 '../quantity-value';\nimport { box, unbox } from '../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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 evaluate\n};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { divideQuantities } from '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 = divideQuantities(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 if (r === 0) {\n return { value: [], context };\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 return { value: [], context };\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 returns empty.',\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 '../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 '../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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 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 '../quantity-value';\nimport type { QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 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 } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { equalQuantities, compareQuantities, type QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 if both are quantities\n if (l && typeof l === 'object' && 'unit' in l && \n r && typeof r === 'object' && 'unit' in r) {\n const comparison = compareQuantities(l as QuantityValue, r as QuantityValue);\n // If quantities are incomparable (different dimensions), return empty\n if (comparison === null) {\n return { value: [], context };\n }\n return { value: [box(comparison === 0, { type: 'Boolean', singleton: true })], context };\n }\n \n return { value: [box(l === r, { 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 name: 'equal',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', 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 { equalQuantities, compareQuantities, type QuantityValue } from '../quantity-value';\nimport { box, unbox } from '../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 comparison = compareQuantities(l as QuantityValue, r as QuantityValue);\n // If quantities are incomparable (different dimensions), return empty\n if (comparison === null) {\n return { value: [], context };\n }\n return { value: [box(comparison !== 0, { type: 'Boolean', singleton: true })], context };\n }\n \n return { value: [box(l !== r, { 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 name: 'not-equal',\n left: { type: 'Any', singleton: true },\n right: { type: 'Any', 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 '../boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Empty collections are equivalent\n if (left.length === 0 && right.length === 0) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // Different sizes are not equivalent\n if (left.length !== right.length) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // For single items, check type-specific equivalence\n if (left.length === 1 && right.length === 1) {\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 // String equivalence: case-insensitive with normalized whitespace\n if (typeof l === 'string' && typeof r === 'string') {\n const normalizeString = (s: string) => s.trim().toLowerCase().replace(/\\s+/g, ' ');\n return { value: [box(normalizeString(l) === normalizeString(r), { type: 'Boolean', singleton: true })], context };\n }\n \n // Number equivalence (for Integer and Decimal)\n if (typeof l === 'number' && typeof r === 'number') {\n // For decimals with different precision, round to least precise\n // This is a simplified implementation\n return { value: [box(Math.abs(l - r) < Number.EPSILON, { type: 'Boolean', singleton: true })], context };\n }\n \n // Boolean equivalence\n if (typeof l === 'boolean' && typeof r === 'boolean') {\n return { value: [box(l === r, { type: 'Boolean', singleton: true })], context };\n }\n \n // For complex types and other cases, use equality for now\n // TODO: Implement full equivalence logic for Date/DateTime/Time and complex types\n return { value: [box(l === r, { type: 'Boolean', singleton: true })], context };\n }\n \n // For multiple items, comparison is order-independent\n // Create sorted copies for comparison\n // TODO: Implement proper order-independent comparison with recursive equivalence\n const leftSorted = [...left].sort();\n const rightSorted = [...right].sort();\n \n for (let i = 0; i < leftSorted.length; i++) {\n if (leftSorted[i] !== rightSorted[i]) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n }\n \n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n};\n\nexport const equivalentOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '~',\n name: 'equivalent',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\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, unbox } from '../boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Empty collections are equivalent, so not-equivalent returns false\n if (left.length === 0 && right.length === 0) {\n return { value: [box(false, { type: 'Boolean', singleton: true })], context };\n }\n \n // Different sizes are not equivalent, so not-equivalent returns true\n if (left.length !== right.length) {\n return { value: [box(true, { type: 'Boolean', singleton: true })], context };\n }\n \n // For single items, check type-specific non-equivalence\n if (left.length === 1 && right.length === 1) {\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 // String non-equivalence: case-insensitive with normalized whitespace\n if (typeof l === 'string' && typeof r === 'string') {\n const normalizeString = (s: string) => s.trim().toLowerCase().replace(/\\s+/g, ' ');\n return { value: [box(normalizeString(l) !== normalizeString(r), { type: 'Boolean', singleton: true })], context };\n }\n \n // Number non-equivalence (for Integer and Decimal)\n if (typeof l === 'number' && typeof r === 'number') {\n // For decimals with different precision, round to least precise\n // This is a simplified implementation\n return { value: [box(Math.abs(l - r) >= Number.EPSILON, { type: 'Boolean', singleton: true })], context };\n }\n \n // Boolean non-equivalence\n if (typeof l === 'boolean' && typeof r === 'boolean') {\n return { value: [box(l !== r, { type: 'Boolean', singleton: true })], context };\n }\n \n // For complex types and other cases, use inequality for now\n // TODO: Implement full non-equivalence logic for Date/DateTime/Time and complex types\n return { value: [box(l !== r, { type: 'Boolean', singleton: true })], context };\n }\n \n // For multiple items, comparison is order-independent\n // Create sorted copies for comparison\n // TODO: Implement proper order-independent comparison with recursive equivalence\n const leftSorted = [...left].sort();\n const rightSorted = [...right].sort();\n \n for (let i = 0; i < leftSorted.length; i++) {\n if (leftSorted[i] !== rightSorted[i]) {\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 notEquivalentOperator: OperatorDefinition & { evaluate: OperationEvaluator } = {\n symbol: '!~',\n name: 'notEquivalent',\n category: ['equality'],\n precedence: PRECEDENCE.EQUALITY,\n associativity: 'left',\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 '../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 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 '../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 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 '../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 '../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 { 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 // 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\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 = 'FP3002',\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}","import type { OperatorDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../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 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 '../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 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 '../boxing';\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 in context, use it for accurate type checking\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\n if (boxedItem?.typeInfo) {\n // For now, just check exact type match (no subtype support without ModelProvider)\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 = 'getTypeFromCache' in context.modelProvider \n ? (context.modelProvider as any).getTypeFromCache(item.resourceType)\n : undefined;\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 case 'DateTime':\n case 'Time':\n // Simple check for date-like strings\n return { value: [box(typeof item === 'string' && !isNaN(Date.parse(item)), { 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 '../boxing';\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 // TODO: Implement proper FHIRPath type casting\n // For now, just return the value as-is if it matches the type\n const results: any[] = [];\n const typeName = right[0]; // Should be a type name\n \n for (const item of left) {\n let matches = false;\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 = Number.isInteger(item);\n break;\n case 'Decimal':\n matches = typeof item === 'number';\n break;\n }\n if (matches) {\n results.push(item);\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 '../boxing';\nimport { unbox } from '../boxing';\nimport { isIdentifierNode, isFunctionNode } from '../types';\nimport { NodeType } 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 }\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 (typeArg.type === NodeType.TypeOrIdentifier) {\n targetTypeName = (typeArg as any).name;\n } else if (typeArg.type === NodeType.TypeReference) {\n targetTypeName = (typeArg as any).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 type information\n if (boxedItem.typeInfo) {\n // If we have 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};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../boxing';\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 // Union merges collections and eliminates duplicates using equals (=) operator\n const result: any[] = [];\n const seen = new Set<any>();\n \n // Add items from left collection\n for (const item of left) {\n let isDuplicate = false;\n for (const existing of result) {\n // Use equals operator semantics for duplicate detection\n if (existing === item) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n result.push(item);\n }\n }\n \n // Add items from right collection if not already present\n for (const item of right) {\n let isDuplicate = false;\n for (const existing of result) {\n // Use equals operator semantics for duplicate detection\n if (existing === item) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n result.push(item);\n }\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 any duplicate values using the equals (=) operator. There is no expectation of order in the resulting collection',\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};","import type { OperatorDefinition } from '../types';\nimport { PRECEDENCE } from '../types';\nimport type { OperationEvaluator } from '../types';\nimport { box, unbox } from '../boxing';\n\nexport const evaluate: OperationEvaluator = async (input, context, left, right) => {\n // Combine operator concatenates all values as strings\n const leftStr = left.map(v => String(unbox(v))).join('');\n const rightStr = right.map(v => String(unbox(v))).join('');\n \n if (leftStr === '' && rightStr === '') {\n return { value: [], context };\n }\n \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 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 '../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 type {\n ASTNode,\n LiteralNode,\n IdentifierNode,\n BinaryNode,\n UnaryNode,\n FunctionNode,\n VariableNode,\n CollectionNode,\n IndexNode,\n TypeOrIdentifierNode,\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 } from './types';\nimport { createQuantity } from './quantity-value';\nimport { box, unbox, ensureBoxed, type FHIRPathValue } from './boxing';\nimport { Errors } from './errors';\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 // Silently return original context for system variable redefinition\n return context;\n }\n \n // Check if variable already exists (unless redefinition is allowed)\n if (!allowRedefinition && context.variables && Object.prototype.hasOwnProperty.call(context.variables, varKey)) {\n // Silently return original context for variable redefinition\n return context;\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 return context.variables[varKey];\n }\n}\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.Identifier]: this.evaluateIdentifier.bind(this),\n [NodeType.TypeOrIdentifier]: this.evaluateTypeOrIdentifier.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 // 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 const value = literal.value;\n \n 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(literal.value, typeInfo)],\n context\n };\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\n // Navigate property on each boxed item in input\n const results: FHIRPathValue[] = [];\n \n // Get the type info from the node (set by analyzer)\n const nodeTypeInfo = node.typeInfo;\n \n for (const boxedItem of input) {\n const item = unbox(boxedItem);\n \n // Special handling for primitive extension navigation\n if (name === 'extension' && boxedItem.primitiveElement?.extension) {\n // Navigation from a primitive value to its extensions\n for (const ext of boxedItem.primitiveElement.extension) {\n results.push(box(ext, nodeTypeInfo || { type: 'Any', singleton: false }));\n }\n continue;\n }\n \n if (item && typeof item === 'object') {\n // First, check if this might be a FHIR choice type by looking for choice properties\n // FHIR choice types use the pattern: base name + Type suffix (e.g., valueQuantity, valueCodeableConcept)\n let foundChoiceValue = false;\n \n // Check for FHIR choice type pattern\n if (context.modelProvider) {\n // Try common FHIR choice patterns\n const possibleChoiceProperties = Object.keys(item).filter(key => \n key.startsWith(name) && key !== name && key.length > name.length\n );\n \n if (possibleChoiceProperties.length > 0) {\n // This looks like a choice type - return all matching values\n for (const choiceProp of possibleChoiceProperties) {\n const value = item[choiceProp];\n const primitiveElementName = `_${choiceProp}`;\n const primitiveElement = (primitiveElementName in item) ? item[primitiveElementName] : undefined;\n \n // Try to determine the type from the property name suffix\n let choiceType = 'Any';\n const suffix = choiceProp.substring(name.length);\n if (suffix) {\n // Remove leading uppercase letter and make it the type\n choiceType = suffix;\n }\n \n if (Array.isArray(value)) {\n for (const v of value) {\n // For FHIR resources, use their resourceType\n if (v && typeof v === 'object' && 'resourceType' in v) {\n const typeInfo = await context.modelProvider!.getType(v.resourceType);\n results.push(box(v, typeInfo || { type: v.resourceType as any, singleton: true }, primitiveElement));\n } else {\n results.push(box(v, { type: choiceType as any, singleton: true }, primitiveElement));\n }\n }\n } else if (value !== null && value !== undefined) {\n // For FHIR resources, use their resourceType\n if (value && typeof value === 'object' && 'resourceType' in value) {\n const typeInfo = await context.modelProvider!.getType(value.resourceType);\n results.push(box(value, typeInfo || { type: value.resourceType as any, singleton: true }, primitiveElement));\n } else {\n results.push(box(value, { type: choiceType as any, singleton: !Array.isArray(value) }, primitiveElement));\n }\n }\n foundChoiceValue = true;\n }\n }\n }\n \n // Check if this is a choice type navigation from analyzer\n if (!foundChoiceValue && nodeTypeInfo?.modelContext && typeof nodeTypeInfo.modelContext === 'object' &&\n 'isUnion' in nodeTypeInfo.modelContext && \n nodeTypeInfo.modelContext.isUnion && 'choices' in nodeTypeInfo.modelContext &&\n Array.isArray(nodeTypeInfo.modelContext.choices)) {\n // For choice types, look for any of the choice properties\n for (const choice of nodeTypeInfo.modelContext.choices) {\n const choiceName = choice.choiceName;\n if (choiceName && choiceName in item) {\n const value = item[choiceName];\n const primitiveElementName = `_${choiceName}`;\n const primitiveElement = (primitiveElementName in item) ? item[primitiveElementName] : undefined;\n \n // Box with the specific choice type\n const choiceTypeInfo = {\n type: choice.type,\n singleton: !Array.isArray(value),\n modelContext: choice\n };\n \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 foundChoiceValue = true;\n }\n }\n }\n \n if (!foundChoiceValue && name in item) {\n // Regular property navigation\n const value = item[name];\n const primitiveElementName = `_${name}`;\n const primitiveElement = (primitiveElementName in item) ? item[primitiveElementName] : undefined;\n \n if (Array.isArray(value)) {\n // Box each array element with type info\n // For arrays, make the type singleton since each element is a single value\n const elementTypeInfo = nodeTypeInfo ? { ...nodeTypeInfo, singleton: true } : undefined;\n for (const v of value) {\n // Special handling for FHIR resources - use their resourceType\n // Do this when the property could be polymorphic (type is 'Any' or 'Resource')\n if (v && typeof v === 'object' && 'resourceType' in v && typeof v.resourceType === 'string' &&\n (!elementTypeInfo || elementTypeInfo.type === 'Any' || (elementTypeInfo as any).type === 'Resource')) {\n // Get full type info from model provider if available\n let resourceTypeInfo;\n if (context.modelProvider) {\n resourceTypeInfo = await context.modelProvider.getType(v.resourceType);\n if (resourceTypeInfo) {\n // Make it singleton since it's a single element in the array\n resourceTypeInfo = { ...resourceTypeInfo, singleton: true };\n }\n }\n if (!resourceTypeInfo) {\n // Fallback to basic type info\n resourceTypeInfo = {\n type: v.resourceType as import('./types').TypeName,\n singleton: true\n };\n }\n results.push(box(v, resourceTypeInfo, primitiveElement));\n } else {\n results.push(box(v, elementTypeInfo, primitiveElement));\n }\n }\n } else if (value !== null && value !== undefined) {\n // Special handling for FHIR resources - use their resourceType\n // Do this when the property could be polymorphic (type is 'Any' or 'Resource')\n if (value && typeof value === 'object' && 'resourceType' in value && typeof value.resourceType === 'string' &&\n (!nodeTypeInfo || nodeTypeInfo.type === 'Any' || (nodeTypeInfo as any).type === 'Resource')) {\n // Get full type info from model provider if available\n let resourceTypeInfo;\n if (context.modelProvider) {\n resourceTypeInfo = await context.modelProvider.getType(value.resourceType);\n if (resourceTypeInfo) {\n // Preserve singleton status\n resourceTypeInfo = { ...resourceTypeInfo, singleton: !Array.isArray(value) };\n }\n }\n if (!resourceTypeInfo) {\n // Fallback to basic type info\n resourceTypeInfo = {\n type: value.resourceType as import('./types').TypeName,\n singleton: !Array.isArray(value)\n };\n }\n results.push(box(value, resourceTypeInfo, primitiveElement));\n } else {\n // Box single value with primitive element if available\n results.push(box(value, nodeTypeInfo, primitiveElement));\n }\n }\n }\n }\n }\n\n return {\n value: results,\n context\n };\n }\n\n // TypeOrIdentifier node evaluator (handles Patient, Observation, etc.)\n private async evaluateTypeOrIdentifier(node: ASTNode, input: FHIRPathValue[], context: RuntimeContext): Promise<EvaluationResult> {\n const typeOrId = node as TypeOrIdentifierNode;\n const name = typeOrId.name;\n\n // First try as type filter\n const filtered = input.filter(boxedItem => {\n const item = unbox(boxedItem);\n return item && typeof item === 'object' && item.resourceType === name;\n });\n\n if (filtered.length > 0) {\n return { value: filtered, context };\n }\n\n // Otherwise treat as identifier\n return await this.evaluateIdentifier(node, input, 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 // 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 const leftResult = await this.evaluate(binary.left, input, context);\n const rightResult = await this.evaluate(binary.right, input, context); // Use original context, not leftResult.context\n \n // Merge the results\n const unionEvaluator = this.operationEvaluators.get('union');\n if (unionEvaluator) {\n return await unionEvaluator(input, context, leftResult.value, rightResult.value);\n }\n \n // Fallback if union evaluator not found\n return {\n value: [...leftResult.value, ...rightResult.value],\n context // Original context preserved\n };\n }\n\n // Get operation evaluator\n const evaluator = this.operationEvaluators.get(operator);\n if (evaluator) {\n // Most operators evaluate arguments in parallel with same input/context\n const leftResult = await this.evaluate(binary.left, input, context);\n const rightResult = await this.evaluate(binary.right, input, context);\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 // Check if function is registered with an evaluator\n const functionEvaluator = this.functionEvaluators.get(funcName);\n if (functionEvaluator) {\n return await functionEvaluator(input, context, func.arguments, this.evaluate.bind(this));\n }\n\n // No function found in registry\n throw Errors.unknownFunction(funcName);\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 // If expression evaluates to empty, return empty\n if (exprResult.value.length === 0) {\n return { value: [], context };\n }\n \n // If we have type information from analyzer (with ModelProvider), use it\n if (context.currentNode?.typeInfo?.modelContext) {\n const modelContext = context.currentNode.typeInfo.modelContext as any;\n \n // For union types, check if the target type is valid\n if (modelContext.isUnion && modelContext.choices) {\n const hasValidChoice = modelContext.choices.some((c: any) => \n c.type === test.targetType || c.elementType === test.targetType\n );\n \n if (!hasValidChoice) {\n // Type system knows this will always be false\n return { \n value: exprResult.value.map(() => box(false, { type: 'Boolean', singleton: true })), \n context \n };\n }\n }\n }\n \n // Type checking with subtype support via ModelProvider\n const results = await Promise.all(exprResult.value.map(async boxedItem => {\n const item = unbox(boxedItem);\n \n // If we have a ModelProvider and typeInfo, use it for accurate subtype checking\n if (context.modelProvider && boxedItem.typeInfo) {\n const matchingType = context.modelProvider.ofType(boxedItem.typeInfo, test.targetType as import('./types').TypeName);\n return box(matchingType !== undefined, { type: 'Boolean', singleton: true });\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, test.targetType as import('./types').TypeName);\n return box(matchingType !== undefined, { type: 'Boolean', singleton: true });\n }\n // Fall back to exact match\n return box(item.resourceType === test.targetType, { type: 'Boolean', singleton: true });\n }\n \n // Check for FHIR resource types (no ModelProvider available)\n if (item && typeof item === 'object' && 'resourceType' in item) {\n return box(item.resourceType === test.targetType, { type: 'Boolean', singleton: true });\n }\n \n // Check primitive types\n const isMatch = (() => {\n switch (test.targetType) {\n case 'String': return typeof item === 'string';\n case 'Boolean': return typeof item === 'boolean';\n case 'Integer': return Number.isInteger(item);\n case 'Decimal': 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: return false;\n }\n })();\n return box(isMatch, { type: 'Boolean', singleton: true });\n }));\n\n return { value: results, 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 // If we have type information from analyzer (with ModelProvider), use it\n if (context.currentNode?.typeInfo?.modelContext) {\n const modelContext = context.currentNode.typeInfo.modelContext as any;\n \n // For union types, check if the cast is valid\n if (modelContext.isUnion && modelContext.choices) {\n const validChoice = modelContext.choices.find((c: any) => \n c.type === cast.targetType || c.elementType === cast.targetType\n );\n \n if (!validChoice) {\n // Invalid cast - return empty\n return { value: [], context };\n }\n }\n }\n \n // Filter values that match the target type with subtype support\n const filtered = await Promise.all(exprResult.value.map(async boxedItem => {\n const item = unbox(boxedItem);\n \n // If we have a ModelProvider and typeInfo, use it for accurate subtype checking\n if (context.modelProvider && boxedItem.typeInfo) {\n const matchingType = context.modelProvider.ofType(boxedItem.typeInfo, cast.targetType as import('./types').TypeName);\n return matchingType !== undefined;\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, cast.targetType as import('./types').TypeName);\n return matchingType !== undefined;\n }\n // Fall back to exact match\n return item.resourceType === cast.targetType;\n }\n \n // Check for FHIR resource types (no ModelProvider available)\n if (item && typeof item === 'object' && 'resourceType' in item) {\n return item.resourceType === cast.targetType;\n }\n \n // Check primitive types\n switch (cast.targetType) {\n case 'String': return typeof item === 'string';\n case 'Boolean': return typeof item === 'boolean';\n case 'Integer': return Number.isInteger(item);\n case 'Decimal': 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: return false;\n }\n }));\n \n // Filter out the false results (filter returns boolean for each item)\n const actualFiltered = exprResult.value.filter((_, index) => filtered[index]);\n \n return { value: actualFiltered, 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, quantity.isCalendarUnit);\n return {\n value: [box(quantityValue, { type: 'Quantity', singleton: true })],\n context\n };\n }\n}","import type { FunctionDefinition, ASTNode } from '../types';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox } from '../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};","import type { FunctionDefinition } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\nimport { unbox } from '../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};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../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 '../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 '../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 = 'getTypeFromCache' in modelProvider \n ? (modelProvider as any).getTypeFromCache(item.resourceType)\n : undefined;\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};","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 '../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 '../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 '../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 '../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 '../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 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';\nimport { type FunctionEvaluator } from '../types';\nimport { box, unbox } from '../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 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};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter';\nimport { box, unbox } from '../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 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};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../boxing';\n\nexport const evaluate: FunctionEvaluator = async (input, context, args, evaluator) => {\n return { \n value: [box(input.length === 0, { type: 'Boolean', singleton: true })], \n context \n };\n};\n\nexport const emptyFunction: FunctionDefinition & { evaluate: FunctionEvaluator } = {\n name: 'empty',\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 evaluate\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../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 '../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 '../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 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 } from '../types';\nimport { Errors } from '../errors';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../boxing';\nimport { RuntimeContextManager } from '../interpreter';\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.invalidOperation('iif can only be used on single item or empty collections');\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 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};","import type { FunctionDefinition, LiteralNode } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter';\nimport { type FunctionEvaluator } from '../types';\nimport { box, unbox } from '../boxing';\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 const nameNode = args[0] as LiteralNode;\n if (nameNode.valueType !== 'string') {\n throw Errors.invalidOperation('Variable name must be a string');\n }\n\n const varName = nameNode.value as string;\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 const tempContext = RuntimeContextManager.setVariable(context, '$this', input);\n const valueExpr = args[1];\n if (!valueExpr) {\n throw Errors.invalidOperation('defineVariable requires a value expression');\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 const newContext = RuntimeContextManager.setVariable(context, varName, value);\n \n // If newContext is same as context, variable already existed - return empty\n if (newContext === context) {\n return { value: [], context };\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 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 },\n ],\n result: { type: 'Any', singleton: false },\n }],\n evaluate\n};","import type { FunctionDefinition } from '../types';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../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 '../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 '../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 '../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 context.input which contains the root data\n const otherResult = await evaluator(otherArg, context.input || [], 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 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 '../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 '../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 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 '../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 } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../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 } from '../types';\nimport { Errors } from '../errors';\nimport type { FunctionEvaluator } from '../types';\nimport { box, unbox } from '../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 '../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 '../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 // 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 '../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 '../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 '../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 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 '../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 '../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 '../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 '../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 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 '../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 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 '../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 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 '../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 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 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 '../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 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 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 '../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',\n input: { type: 'Any', 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 '../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',\n input: { type: 'Any', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../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',\n input: { type: 'Any', 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 '../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',\n input: { type: 'Any', singleton: true },\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 '../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};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { RuntimeContextManager } from '../interpreter';\nimport { box, unbox } from '../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 // 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 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};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../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 '../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 '../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 '../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 '../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 '../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',\n input: { type: 'Decimal', singleton: true },\n parameters: [],\n result: { type: 'Decimal', singleton: true }\n }],\n evaluate\n};","import type { FunctionDefinition, FunctionEvaluator } from '../types';\nimport { Errors } from '../errors';\nimport { box, unbox } from '../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',\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 evaluate\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 isFunctionApplicableToType(functionName: string, typeName: TypeName | string): boolean {\n const func = this.getFunction(functionName);\n if (!func) return false;\n \n // If no signatures, function works with any type\n if (!func.signatures || func.signatures.length === 0) return true;\n \n // Check if we're dealing with a collection type\n const isCollection = typeof typeName === 'string' && typeName.endsWith('[]');\n \n // Check if ANY signature matches the type\n for (const signature of func.signatures) {\n // If no input type specified, this signature works with any type\n if (!signature.input) return true;\n \n const inputType = signature.input.type;\n const requiresSingleton = signature.input.singleton;\n \n // If function requires singleton but we have a collection, skip this signature\n if (requiresSingleton && isCollection) {\n continue;\n }\n \n // 'Any' type accepts all inputs (but still respects singleton constraint checked above)\n if (inputType === 'Any') return true;\n \n // Direct type match\n if (inputType === typeName) return true;\n \n // For collection types, check if function can work with collections\n if (typeof typeName === 'string' && typeName.endsWith('[]')) {\n const itemType = typeName.slice(0, -2);\n // Only allow if function doesn't require singleton\n if (inputType === itemType && !requiresSingleton) {\n return true;\n }\n }\n \n // Check if it's a numeric type and function accepts numeric types\n const numericTypes = ['Integer', 'Decimal', 'Number'];\n if (numericTypes.includes(typeName as string) && numericTypes.includes(inputType as string)) {\n return true;\n }\n \n // Check if it's a temporal type and function accepts temporal types\n const temporalTypes = ['Date', 'DateTime', 'Time', 'Instant'];\n if (temporalTypes.includes(typeName as string) && temporalTypes.includes(inputType as string)) {\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();","export enum CursorContext {\n Operator = 'operator',\n Identifier = 'identifier',\n Argument = 'argument',\n Index = 'index',\n Type = 'type',\n}\n\nexport interface CursorNode {\n type: 'CursorNode';\n context: CursorContext;\n position: number;\n range: {\n start: { line: number; character: number; offset: number };\n end: { line: number; character: number; offset: number };\n };\n}\n\nexport interface CursorOperatorNode extends CursorNode {\n context: CursorContext.Operator;\n}\n\nexport interface CursorIdentifierNode extends CursorNode {\n context: CursorContext.Identifier;\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}\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): CursorIdentifierNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Identifier,\n position,\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): CursorTypeNode {\n const point = { line: 0, character: position, offset: position };\n return {\n type: 'CursorNode',\n context: CursorContext.Type,\n position,\n typeOperator,\n range: { start: point, end: point },\n };\n}","import { Lexer, TokenType, Channel } from './lexer';\nimport type { Token, LexerOptions } from './lexer';\nimport { registry } from './registry';\nimport { NodeType } from './types';\nimport type { AnyCursorNode } from './cursor-nodes';\nimport {\n CursorContext,\n createCursorOperatorNode,\n createCursorIdentifierNode,\n createCursorArgumentNode,\n createCursorIndexNode,\n createCursorTypeNode,\n} from './cursor-nodes';\nimport type {\n Position,\n Range,\n BaseASTNode,\n ASTNode,\n IdentifierNode,\n TypeOrIdentifierNode,\n LiteralNode,\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, FHIRPathError, toDiagnostic } from './errors';\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 TypeOrIdentifierNode,\n type LiteralNode,\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';\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 errors?: ParseError[];\n private nodeIdCounter?: number;\n private nodeIndex?: Map<string, ASTNode>;\n private nodesByType?: Map<NodeType | 'Error', ASTNode[]>;\n private identifierIndex?: Map<string, ASTNode[]>;\n private currentParent?: ASTNode | null;\n private input: string;\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 \n this.lexer = new Lexer(input, lexerOptions);\n this.tokens = this.lexer.tokenize();\n \n // Filter out trivia tokens if they exist (tokens on hidden channel)\n if (lexerOptions.preserveTrivia) {\n this.tokens = this.tokens.filter(token => \n token.channel === undefined || token.channel === Channel.DEFAULT\n );\n }\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 this.input = input;\n this.mode = mode;\n this.options = options;\n \n // Initialize LSP features only if needed\n if (this.mode === 'lsp') {\n this.errors = [];\n this.nodeIdCounter = 0;\n this.nodeIndex = new Map();\n this.nodesByType = new Map();\n this.identifierIndex = new Map();\n this.currentParent = null;\n }\n }\n \n private checkCursor(): AnyCursorNode | null {\n if (this.peek().type === TokenType.CURSOR) {\n return null; // Will be handled contextually\n }\n return null;\n }\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 // Cursor is mid-token, ignore it\n return tokens;\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 this.nodeIndex!.clear();\n this.nodesByType!.clear();\n this.identifierIndex!.clear();\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 } 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 const result: ParseResult = {\n ast,\n errors: this.errors!,\n indexes: {\n nodeById: this.nodeIndex!,\n nodesByType: this.nodesByType!,\n identifiers: this.identifierIndex!\n }\n };\n \n // Add cursor context if partial parsing\n if (this.options.partialParse) {\n const nodeAtCursor = this.findNodeAtPosition(ast, this.options.partialParse.cursorPosition);\n result.cursorContext = {\n node: nodeAtCursor,\n expectedTokens: this.getExpectedTokens(nodeAtCursor),\n availableCompletions: this.getCompletions(nodeAtCursor)\n };\n }\n \n return result;\n }\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 this.advance();\n left = createCursorIndexNode(this.previous().start) as any;\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\n this.current++; // inline advance()\n const args = this.parseArgumentList();\n this.consume(TokenType.RPAREN, \"Expected ')'\");\n // For function calls, we need to find the start token from the name node\n const startToken = this.tokens[this.current - args.length - 2] || token;\n left = this.createFunctionNode(left, args, startToken);\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 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, false, 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, true, 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.DATETIME) {\n this.advance();\n const value = token.value.substring(1); // Remove @\n return this.createLiteralNode(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.createLiteralNode(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 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.handleError(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 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 this.advance();\n const args = this.parseArgumentList();\n this.consume(TokenType.RPAREN, \"Expected ')'\");\n const startToken = this.tokens[this.current - args.length - 2] || this.previous();\n return this.createFunctionNode(node, args, startToken);\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.handleError(error.message, token);\n }\n \n protected parseArgumentList(): 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 // Need to get function name from context - for now use empty string\n args.push(createCursorArgumentNode(this.previous().start, '', 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 args.push(createCursorArgumentNode(this.previous().start, '', args.length) as any);\n return args;\n }\n args.push(this.expression());\n }\n\n return args;\n }\n \n protected parseCollectionElements(): ASTNode[] {\n const elements: ASTNode[] = [];\n \n if (this.peek().type === TokenType.RBRACE) {\n return elements;\n }\n\n elements.push(this.expression());\n \n while (this.match(TokenType.COMMA)) {\n elements.push(this.expression());\n }\n\n return elements;\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 this.handleError(error.message, token);\n return ''; // For TypeScript, though handleError should throw/return error node\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 || (node as any).type === NodeType.TypeOrIdentifier;\n }\n \n // Helper method to check if a token is a binary operator\n protected isBinaryOperatorToken(token: Token): boolean {\n if (token.type === TokenType.OPERATOR || token.type === TokenType.DOT) {\n return registry.isBinaryOperator(token.value);\n }\n if (token.type === TokenType.IDENTIFIER) {\n return registry.isKeywordOperator(token.value);\n }\n return false;\n }\n \n protected isKeywordAllowedAsMember(token: Token): boolean {\n // Keywords that can be used as member names\n if (token.type !== TokenType.IDENTIFIER) return false;\n \n const keywordsAllowed = [\n 'contains', 'and', 'or', 'xor', 'implies', \n 'as', 'is', 'div', 'mod', 'in', 'true', 'false'\n ];\n \n return keywordsAllowed.includes(token.value.toLowerCase());\n }\n \n protected isKeywordAllowedAsIdentifier(token: Token): boolean {\n // Keywords that can be used as identifiers in certain contexts\n return this.isKeywordAllowedAsMember(token);\n }\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)) return this.advance();\n \n // Be lenient when cursor is present and we're at EOF\n if (this.options.cursorPosition !== undefined && this.isAtEnd()) {\n // Return a synthetic token to allow parsing to continue\n return {\n type,\n value: '',\n start: this.input.length,\n end: this.input.length\n } as Token;\n }\n \n const token = this.peek();\n const tokenStr = token.value || TokenType[token.type];\n const range = this.getRangeFromToken(token);\n const error = Errors.expectedToken(TokenType[type], tokenStr, range);\n return this.handleError(error.message, token) as any;\n }\n\n // Implement node creation methods\n protected createIdentifierNode(name: string, token: Token): ASTNode {\n const range = this.getRangeFromToken(token);\n const isType = name[0] && name[0] >= 'A' && name[0] <= 'Z';\n const nodeType = isType ? NodeType.TypeOrIdentifier : NodeType.Identifier;\n \n const node: ASTNode = {\n type: nodeType,\n name,\n range\n };\n \n // Add LSP features if in LSP mode\n if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token);\n \n // Index identifier\n const identifiers = this.identifierIndex!.get(name) || [];\n identifiers.push(node);\n this.identifierIndex!.set(name, identifiers);\n }\n \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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token);\n }\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 if (this.mode === 'lsp') {\n // For binary nodes, we need to find the actual start and end tokens\n const startToken = this.tokens.find(t => t.start === left.range.start.offset) || token;\n const endToken = this.tokens.find(t => t.end === right.range.end.offset) || token;\n this.enrichNodeForLSP(node, startToken, endToken);\n \n // Set up parent-child relationships\n if (node.id) {\n left.parent = node;\n right.parent = node;\n node.children = [left, right];\n }\n }\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 if (this.mode === 'lsp') {\n const endToken = this.tokens.find(t => t.end === operand.range.end.offset) || token;\n this.enrichNodeForLSP(node, token, endToken);\n \n if (node.id) {\n operand.parent = node;\n node.children = [operand];\n }\n }\n \n return node;\n }\n\n protected createFunctionNode(name: ASTNode, args: ASTNode[], startToken: Token): 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 if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === name.range.start.offset) || startToken;\n const endToken = this.tokens.find(t => t.end === endNode.range.end.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n name.parent = node;\n args.forEach(arg => { arg.parent = node; });\n node.children = [name, ...args];\n }\n }\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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token);\n }\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 if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === expression.range.start.offset) || startToken;\n const endToken = this.tokens.find(t => t.end === index.range.end.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n expression.parent = node;\n index.parent = node;\n node.children = [expression, index];\n }\n }\n \n return node;\n }\n\n\n protected createMembershipTestNode(expression: ASTNode, targetType: string, startToken: Token): MembershipTestNode {\n // The range should extend from expression 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: this.getRangeFromTokens(startToken, endToken)\n };\n \n if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === expression.range.start.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n expression.parent = node;\n node.children = [expression];\n }\n }\n \n return node;\n }\n\n protected createTypeCastNode(expression: ASTNode, targetType: string, startToken: Token): TypeCastNode {\n // The range should extend from expression 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: this.getRangeFromTokens(startToken, endToken)\n };\n \n if (this.mode === 'lsp') {\n const startTok = this.tokens.find(t => t.start === expression.range.start.offset) || startToken;\n this.enrichNodeForLSP(node, startTok, endToken);\n \n if (node.id) {\n expression.parent = node;\n node.children = [expression];\n }\n }\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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, startToken, endToken);\n \n if (node.id) {\n elements.forEach(elem => { elem.parent = node; });\n node.children = elements;\n }\n }\n \n return node;\n }\n\n protected createQuantityNode(value: number, unit: string, isCalendarUnit: boolean, startToken: Token, endToken: Token): QuantityNode {\n const node: QuantityNode = {\n type: NodeType.Quantity,\n value,\n unit,\n isCalendarUnit,\n range: this.getRangeFromTokens(startToken, endToken)\n };\n \n if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, startToken, endToken);\n }\n \n return node;\n }\n\n protected handleError(message: string, token?: Token): never {\n if (this.mode === 'lsp' && this.options.errorRecovery) {\n // In LSP mode with error recovery, add error and try to recover\n this.addError(message, token);\n \n // Try to synchronize\n this.synchronize();\n \n // Return error node (cast to never to satisfy type system)\n return this.createErrorNode(message, token) as never;\n }\n \n // In simple mode, throw error\n const range = token ? this.getRangeFromToken(token) : undefined;\n throw Errors.invalidSyntax(message, range);\n }\n \n // LSP mode helper methods\n private enrichNodeForLSP(node: ASTNode, startToken: Token, endToken?: Token): void {\n if (this.mode !== 'lsp') return;\n \n // Add unique ID\n node.id = `node_${this.nodeIdCounter!++}`;\n \n // Add raw source text\n const start = startToken.start;\n const end = endToken ? endToken.end : startToken.end;\n node.raw = this.input.substring(start, end);\n \n // Add trivia if preserving\n if (this.options.preserveTrivia) {\n node.leadingTrivia = []; // TODO: Implement trivia collection\n node.trailingTrivia = [];\n }\n \n // Set parent relationship\n if (this.currentParent) {\n node.parent = this.currentParent;\n }\n \n // Index node\n this.nodeIndex!.set(node.id, node);\n const nodesByType = this.nodesByType!.get(node.type) || [];\n nodesByType.push(node);\n this.nodesByType!.set(node.type, nodesByType);\n }\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 if (this.mode === 'lsp') {\n this.enrichNodeForLSP(node, token || this.peek());\n }\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 private findNodeAtPosition(root: ASTNode, offset: number): ASTNode | null {\n // DFS to find the most specific node containing the position\n if (offset < root.range.start.offset! || offset > root.range.end.offset!) {\n return null;\n }\n \n // Check children if they exist\n if ('children' in root && Array.isArray(root.children)) {\n for (const child of root.children) {\n const found = this.findNodeAtPosition(child, offset);\n if (found) return found;\n }\n }\n \n // Check specific node types\n if (root.type === NodeType.Binary) {\n const binaryNode = root as BinaryNode;\n const leftResult = this.findNodeAtPosition(binaryNode.left, offset);\n if (leftResult) return leftResult;\n const rightResult = this.findNodeAtPosition(binaryNode.right, offset);\n if (rightResult) return rightResult;\n } else if (root.type === NodeType.Unary) {\n const unaryNode = root as UnaryNode;\n return this.findNodeAtPosition(unaryNode.operand, offset);\n } else if (root.type === NodeType.Function) {\n const funcNode = root as FunctionNode;\n const nameResult = this.findNodeAtPosition(funcNode.name, offset);\n if (nameResult) return nameResult;\n for (const arg of funcNode.arguments) {\n const argResult = this.findNodeAtPosition(arg, offset);\n if (argResult) return argResult;\n }\n }\n \n return root;\n }\n \n private getExpectedTokens(node: ASTNode | null): TokenType[] {\n if (!node) return this.getExpectedTokensForError();\n \n // Context-specific expectations\n switch (node.type) {\n case NodeType.Binary:\n return [TokenType.DOT, TokenType.LBRACKET];\n case NodeType.Identifier:\n case NodeType.TypeOrIdentifier:\n return [TokenType.DOT, TokenType.LPAREN, TokenType.LBRACKET];\n default:\n return this.getExpectedTokensForError();\n }\n }\n \n private getExpectedTokensForError(): TokenType[] {\n // Common continuations\n return [\n TokenType.EOF,\n TokenType.DOT,\n TokenType.LBRACKET,\n TokenType.LPAREN,\n TokenType.OPERATOR,\n TokenType.IDENTIFIER\n ];\n }\n \n private getCompletions(node: ASTNode | null): string[] {\n if (!node) return [];\n \n const completions: string[] = [];\n \n // Add all identifiers seen so far\n if (this.identifierIndex) {\n for (const name of Array.from(this.identifierIndex.keys())) {\n completions.push(name);\n }\n }\n \n // Add common FHIRPath functions\n completions.push(\n 'where', 'select', 'first', 'last', 'tail',\n 'skip', 'take', 'count', 'empty', 'exists'\n );\n \n return completions;\n }\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 */\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 case NodeType.TypeOrIdentifier: {\n const id = node as IdentifierNode | TypeOrIdentifierNode;\n return id.name;\n }\n \n case NodeType.Variable: {\n const v = node as VariableNode;\n return v.name;\n }\n \n case NodeType.Binary: {\n const bin = node as BinaryNode;\n const op = bin.operator;\n \n // For simple expressions, put on one line\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 // For complex expressions, use multiple lines\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 // Multi-line format\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 if (q.isCalendarUnit) {\n return `${q.value} ${q.unit}`;\n }\n return `${q.value} '${q.unit}'`;\n }\n \n default:\n return `<unknown:${node.type}>`;\n }\n}","import type { \n ASTNode, \n BinaryNode, \n IdentifierNode, \n LiteralNode, \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 TypeOrIdentifierNode,\n ErrorNode\n} from './types';\nimport { NodeType, DiagnosticSeverity } from './types';\nimport { registry } from './registry';\nimport { Errors, toDiagnostic } from './errors';\nimport { isCursorNode, CursorContext } from './cursor-nodes';\nimport type { AnyCursorNode } from './cursor-nodes';\n\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 };\n}\n\nexport class Analyzer {\n private diagnostics: Diagnostic[] = [];\n private variables: Set<string> = new Set(['$this', '$index', '$total', 'context', 'resource', 'rootResource']);\n private modelProvider?: ModelProvider;\n private userVariableTypes: Map<string, TypeInfo> = new Map();\n private systemVariableTypes: Map<string, TypeInfo> = new Map();\n private cursorMode: boolean = false;\n private stoppedAtCursor: boolean = false;\n private cursorContext?: {\n typeBeforeCursor?: TypeInfo;\n expectedType?: TypeInfo;\n cursorNode?: AnyCursorNode;\n };\n\n constructor(modelProvider?: ModelProvider) {\n this.modelProvider = modelProvider;\n }\n\n async analyze(\n ast: ASTNode, \n userVariables?: Record<string, any>, \n inputType?: TypeInfo,\n options?: AnalyzerOptions\n ): Promise<AnalysisResultWithCursor> {\n this.diagnostics = [];\n this.userVariableTypes.clear();\n this.cursorMode = options?.cursorMode ?? false;\n this.stoppedAtCursor = false;\n this.cursorContext = undefined;\n \n if (userVariables) {\n Object.keys(userVariables).forEach(name => {\n this.variables.add(name);\n // Try to infer types from values\n const value = userVariables[name];\n if (value !== undefined && value !== null) {\n this.userVariableTypes.set(name, this.inferValueType(value));\n }\n });\n }\n \n // Annotate AST with type information\n await this.annotateAST(ast, inputType);\n \n // Perform validation with type checking (if not stopped at cursor)\n if (!this.stoppedAtCursor) {\n this.visitNode(ast);\n }\n \n return {\n diagnostics: this.diagnostics,\n ast,\n stoppedAtCursor: this.cursorMode ? this.stoppedAtCursor : undefined,\n cursorContext: this.cursorMode ? this.cursorContext : undefined\n };\n }\n\n private visitNode(node: ASTNode): void {\n // Check for cursor node in cursor mode\n if (this.cursorMode && isCursorNode(node)) {\n this.stoppedAtCursor = true;\n this.cursorContext = {\n cursorNode: node as AnyCursorNode,\n typeBeforeCursor: (node as any).typeInfo\n };\n return; // Short-circuit\n }\n \n // Handle error nodes - process them for diagnostics but don't traverse\n if (node.type === 'Error') {\n // Diagnostics already added in annotateAST\n return;\n }\n \n // If we've already stopped at cursor, don't continue\n if (this.stoppedAtCursor) {\n return;\n }\n \n switch (node.type) {\n case NodeType.Binary:\n this.visitBinaryOperator(node as BinaryNode);\n break;\n case NodeType.Identifier:\n this.visitIdentifier(node as IdentifierNode);\n break;\n case NodeType.Function:\n this.visitFunctionCall(node as FunctionNode);\n break;\n case NodeType.Index:\n const indexNode = node as IndexNode;\n this.visitNode(indexNode.expression);\n this.visitNode(indexNode.index);\n break;\n case NodeType.Collection:\n (node as CollectionNode).elements.forEach(el => this.visitNode(el));\n break;\n case NodeType.Unary:\n this.visitNode((node as UnaryNode).operand);\n break;\n case NodeType.MembershipTest:\n this.visitMembershipTest(node as MembershipTestNode);\n break;\n case NodeType.TypeCast:\n this.visitTypeCast(node as TypeCastNode);\n break;\n case NodeType.Variable:\n this.validateVariable((node as VariableNode).name, node);\n break;\n case NodeType.Literal:\n case NodeType.TypeOrIdentifier:\n case NodeType.TypeReference:\n // These are always valid\n break;\n }\n }\n\n private visitBinaryOperator(node: BinaryNode): void {\n this.visitNode(node.left);\n \n // Track defineVariable for validation - collect all variables defined in the chain\n if (node.operator === '.') {\n const definedVars = this.collectDefinedVariables(node.left);\n if (definedVars.size > 0) {\n // Track which variables were already known\n const previouslyKnown = new Set<string>();\n definedVars.forEach(varName => {\n if (this.variables.has(varName)) {\n previouslyKnown.add(varName);\n }\n this.variables.add(varName);\n });\n \n // Visit right side with new variables in scope\n this.visitNode(node.right);\n \n // Restore previous state\n definedVars.forEach(varName => {\n if (!previouslyKnown.has(varName)) {\n this.variables.delete(varName);\n }\n });\n return;\n }\n }\n \n // Special handling for dot operator with function on right side\n if (node.operator === '.' && node.right.type === NodeType.Function) {\n const funcNode = node.right as FunctionNode;\n if (funcNode.name.type === NodeType.Identifier) {\n const funcName = (funcNode.name as IdentifierNode).name;\n const func = registry.getFunction(funcName);\n if (func && func.signatures && func.signatures.length > 0 && node.left.typeInfo) {\n // Check if any signature matches the input type\n let matchFound = false;\n let expectedTypes: string[] = [];\n \n for (const signature of func.signatures) {\n if (signature.input) {\n if (this.isTypeCompatible(node.left.typeInfo, signature.input)) {\n matchFound = true;\n break;\n }\n expectedTypes.push(this.typeToString(signature.input));\n } else {\n // If any signature has no input constraint, it matches\n matchFound = true;\n break;\n }\n }\n \n if (!matchFound) {\n const inputTypeStr = this.typeToString(node.left.typeInfo);\n const firstSignature = func.signatures[0];\n \n if (!firstSignature) return;\n \n // Check if this is specifically a singleton/collection mismatch\n const inputIsCollection = !node.left.typeInfo.singleton;\n const expectedIsSingleton = firstSignature.input?.singleton;\n \n // Check if the base types are compatible (same type or subtype)\n const typesCompatible = firstSignature.input && (\n node.left.typeInfo.type === firstSignature.input.type ||\n this.isSubtypeOf(node.left.typeInfo.type, firstSignature.input.type)\n );\n \n if (inputIsCollection && expectedIsSingleton && typesCompatible) {\n // Compatible base types but collection vs singleton mismatch\n this.diagnostics.push(\n toDiagnostic(Errors.singletonTypeRequired(funcName, inputTypeStr, funcNode.range))\n );\n } else {\n // Function received invalid operand type - report as runtime error\n this.diagnostics.push(\n toDiagnostic(Errors.invalidOperandType(funcName + '()', inputTypeStr, funcNode.range))\n );\n }\n }\n }\n }\n }\n \n this.visitNode(node.right);\n \n // For dot operator, we don't need to check operator types\n if (node.operator === '.') {\n return;\n }\n \n const op = registry.getOperatorDefinition(node.operator);\n if (!op) {\n this.diagnostics.push(\n toDiagnostic(Errors.unknownOperator(node.operator, node.range))\n );\n return;\n }\n \n // Type check if we have type information\n if (node.left.typeInfo && node.right.typeInfo) {\n this.checkBinaryOperatorTypes(node, op);\n }\n }\n\n private visitIdentifier(node: IdentifierNode): void {\n this.validateVariable(node.name, node);\n }\n\n private visitFunctionCall(node: FunctionNode): void {\n if (node.name.type === NodeType.Identifier) {\n const funcName = (node.name as IdentifierNode).name;\n \n // Check if this is a type operation that requires ModelProvider\n if (funcName === 'ofType' && !this.modelProvider) {\n // Check if the type argument is a primitive type\n const primitiveTypes = ['String', 'Integer', 'Decimal', 'Boolean', 'Date', 'DateTime', 'Time', 'Quantity'];\n let isPrimitive = false;\n \n if (node.arguments.length > 0) {\n const typeArg = node.arguments[0]!;\n if (typeArg.type === NodeType.Identifier) {\n isPrimitive = primitiveTypes.includes((typeArg as IdentifierNode).name);\n } else if ((typeArg as any).type === NodeType.TypeOrIdentifier || (typeArg as any).type === NodeType.TypeReference) {\n isPrimitive = primitiveTypes.includes((typeArg as any).name);\n }\n }\n \n if (!isPrimitive) {\n this.diagnostics.push(\n toDiagnostic(Errors.modelProviderRequired('ofType', node.range))\n );\n }\n }\n \n // Check ofType with union types\n if (funcName === 'ofType' && node.typeInfo) {\n const inputType = node.typeInfo;\n if (node.arguments.length > 0 && inputType.modelContext && \n typeof inputType.modelContext === 'object' &&\n 'isUnion' in inputType.modelContext && \n inputType.modelContext.isUnion &&\n 'choices' in inputType.modelContext &&\n Array.isArray(inputType.modelContext.choices)) {\n \n // Extract target type from argument\n let targetType: string | undefined;\n const typeArg = node.arguments[0]!;\n if (typeArg.type === NodeType.Identifier) {\n targetType = (typeArg as IdentifierNode).name;\n } else if ((typeArg as any).type === NodeType.TypeOrIdentifier || (typeArg as any).type === NodeType.TypeReference) {\n targetType = (typeArg as any).name;\n }\n \n if (targetType) {\n const validChoice = inputType.modelContext.choices.find((choice: any) => \n choice.type === targetType || choice.code === targetType\n );\n \n if (!validChoice) {\n this.diagnostics.push({\n severity: DiagnosticSeverity.Warning,\n code: 'invalid-type-filter',\n message: `Type '${targetType}' is not present in the union type. Available types: ${\n inputType.modelContext.choices.map((c: any) => c.type || c.code).join(', ')\n }`,\n range: node.range\n });\n }\n }\n }\n }\n \n const func = registry.getFunction(funcName);\n \n if (!func) {\n this.diagnostics.push(\n toDiagnostic(Errors.unknownFunction(funcName, node.range))\n );\n } else {\n // Check argument count based on signature\n const params = func.signatures?.[0]?.parameters || [];\n const requiredParams = params.filter(p => !p.optional).length;\n const maxParams = params.length;\n \n if (node.arguments.length < requiredParams) {\n this.diagnostics.push(\n toDiagnostic(Errors.wrongArgumentCount(funcName, requiredParams, node.arguments.length, node.range))\n );\n } else if (node.arguments.length > maxParams) {\n this.diagnostics.push(\n toDiagnostic(Errors.wrongArgumentCount(funcName, maxParams, node.arguments.length, node.range))\n );\n }\n \n // Type check arguments if we have type information\n if (node.typeInfo || node.arguments.some(arg => arg.typeInfo)) {\n this.checkFunctionArgumentTypes(node, func);\n }\n }\n }\n \n node.arguments.forEach(arg => this.visitNode(arg));\n }\n\n private visitMembershipTest(node: MembershipTestNode): void {\n // Check if ModelProvider is required\n // Basic primitive types can be checked without ModelProvider\n const primitiveTypes = ['String', 'Integer', 'Decimal', 'Boolean', 'Date', 'DateTime', 'Time', 'Quantity'];\n if (!this.modelProvider && !primitiveTypes.includes(node.targetType)) {\n this.diagnostics.push(\n toDiagnostic(Errors.modelProviderRequired('is', node.range))\n );\n }\n \n // Check 'is' with union types\n if (node.expression.typeInfo) {\n const leftType = node.expression.typeInfo;\n if (leftType.modelContext && \n typeof leftType.modelContext === 'object' &&\n 'isUnion' in leftType.modelContext && \n leftType.modelContext.isUnion &&\n 'choices' in leftType.modelContext &&\n Array.isArray(leftType.modelContext.choices)) {\n \n const targetTypeName = node.targetType;\n const validChoice = leftType.modelContext.choices.find((choice: any) =>\n choice.type === targetTypeName || choice.code === targetTypeName\n );\n \n if (!validChoice) {\n this.diagnostics.push({\n severity: DiagnosticSeverity.Warning,\n code: 'invalid-type-test',\n message: `Type test 'is ${targetTypeName}' will always be false. Type '${targetTypeName}' is not in the union. Available types: ${\n leftType.modelContext.choices.map((c: any) => c.type || c.code).join(', ')\n }`,\n range: node.range\n });\n }\n }\n }\n \n this.visitNode(node.expression);\n }\n\n private visitTypeCast(node: TypeCastNode): void {\n // Check if ModelProvider is required\n // Basic primitive types can be checked without ModelProvider\n const primitiveTypes = ['String', 'Integer', 'Decimal', 'Boolean', 'Date', 'DateTime', 'Time', 'Quantity'];\n if (!this.modelProvider && !primitiveTypes.includes(node.targetType)) {\n this.diagnostics.push(\n toDiagnostic(Errors.modelProviderRequired('as', node.range))\n );\n }\n \n // Check 'as' with union types\n if (node.expression.typeInfo) {\n const leftType = node.expression.typeInfo;\n if (leftType.modelContext && \n typeof leftType.modelContext === 'object' &&\n 'isUnion' in leftType.modelContext && \n leftType.modelContext.isUnion &&\n 'choices' in leftType.modelContext &&\n Array.isArray(leftType.modelContext.choices)) {\n \n const targetTypeName = node.targetType;\n const validChoice = leftType.modelContext.choices.find((choice: any) =>\n choice.type === targetTypeName || choice.code === targetTypeName\n );\n \n if (!validChoice) {\n this.diagnostics.push({\n severity: DiagnosticSeverity.Warning,\n code: 'invalid-type-cast',\n message: `Type cast 'as ${targetTypeName}' may fail. Type '${targetTypeName}' is not guaranteed in the union. Available types: ${\n leftType.modelContext.choices.map((c: any) => c.type || c.code).join(', ')\n }`,\n range: node.range\n });\n }\n }\n }\n \n this.visitNode(node.expression);\n }\n\n // Unified variable validation to eliminate duplication\n private validateVariable(name: string, node: ASTNode): void {\n if (name.startsWith('$')) {\n if (!this.variables.has(name)) {\n this.diagnostics.push(\n toDiagnostic(Errors.unknownVariable(name, node.range))\n );\n }\n } else if (name.startsWith('%')) {\n const varName = name.substring(1);\n if (!this.variables.has(varName)) {\n this.diagnostics.push(\n toDiagnostic(Errors.unknownUserVariable(name, node.range))\n );\n }\n }\n }\n \n private collectDefinedVariables(node: ASTNode): Set<string> {\n const vars = new Set<string>();\n \n // If this is a defineVariable call, extract the variable name\n if (node.type === NodeType.Function) {\n const funcNode = node as FunctionNode;\n if (funcNode.name.type === NodeType.Identifier && \n (funcNode.name as IdentifierNode).name === 'defineVariable' &&\n funcNode.arguments.length >= 1) {\n const nameArg = funcNode.arguments[0];\n if (nameArg && nameArg.type === NodeType.Literal && nameArg.valueType === 'string') {\n vars.add(nameArg.value as string);\n }\n }\n }\n \n // If this is a binary dot operator, collect from left side recursively\n if (node.type === NodeType.Binary) {\n const binaryNode = node as BinaryNode;\n if (binaryNode.operator === '.') {\n // Collect from left side\n const leftVars = this.collectDefinedVariables(binaryNode.left);\n leftVars.forEach(v => vars.add(v));\n \n // Check if right side is also defineVariable\n if (binaryNode.right.type === NodeType.Function) {\n const rightFunc = binaryNode.right as FunctionNode;\n if (rightFunc.name.type === NodeType.Identifier && \n (rightFunc.name as IdentifierNode).name === 'defineVariable' &&\n rightFunc.arguments.length >= 1) {\n const nameArg = rightFunc.arguments[0];\n if (nameArg && nameArg.type === NodeType.Literal && nameArg.valueType === 'string') {\n vars.add(nameArg.value as string);\n }\n }\n }\n }\n }\n \n return vars;\n }\n \n private collectDefinedVariablesWithTypes(node: ASTNode): Map<string, TypeInfo> {\n const varsWithTypes = new Map<string, TypeInfo>();\n \n // If this is a defineVariable call, extract the variable name and type\n if (node.type === NodeType.Function) {\n const funcNode = node as FunctionNode;\n if (funcNode.name.type === NodeType.Identifier && \n (funcNode.name as IdentifierNode).name === 'defineVariable' &&\n funcNode.arguments.length >= 1) {\n const nameArg = funcNode.arguments[0];\n if (nameArg && nameArg.type === NodeType.Literal && nameArg.valueType === 'string') {\n const varName = nameArg.value as string;\n let varType: TypeInfo;\n \n if (funcNode.arguments.length >= 2 && funcNode.arguments[1]!.typeInfo) {\n // Has value expression - use its type\n varType = funcNode.arguments[1]!.typeInfo;\n } else if (node.typeInfo) {\n // No value expression - uses input as value (defineVariable returns input)\n varType = node.typeInfo;\n } else {\n varType = { type: 'Any', singleton: false };\n }\n \n varsWithTypes.set(varName, varType);\n }\n }\n }\n \n // If this is a binary dot operator, collect from entire chain\n if (node.type === NodeType.Binary) {\n const binaryNode = node as BinaryNode;\n if (binaryNode.operator === '.') {\n // Collect from left side recursively\n const leftVars = this.collectDefinedVariablesWithTypes(binaryNode.left);\n leftVars.forEach((type, name) => varsWithTypes.set(name, type));\n \n // Check if right side is also defineVariable\n if (binaryNode.right.type === NodeType.Function) {\n const rightFunc = binaryNode.right as FunctionNode;\n if (rightFunc.name.type === NodeType.Identifier && \n (rightFunc.name as IdentifierNode).name === 'defineVariable' &&\n rightFunc.arguments.length >= 1) {\n const nameArg = rightFunc.arguments[0];\n if (nameArg && nameArg.type === NodeType.Literal && nameArg.valueType === 'string') {\n const varName = nameArg.value as string;\n let varType: TypeInfo;\n \n if (rightFunc.arguments.length >= 2 && rightFunc.arguments[1]!.typeInfo) {\n varType = rightFunc.arguments[1]!.typeInfo;\n } else if (binaryNode.typeInfo) {\n varType = binaryNode.typeInfo;\n } else {\n varType = { type: 'Any', singleton: false };\n }\n \n varsWithTypes.set(varName, varType);\n }\n }\n }\n }\n }\n \n return varsWithTypes;\n }\n\n\n // Type inference methods\n private async inferType(node: ASTNode, inputType?: TypeInfo): Promise<TypeInfo> {\n // Handle error nodes\n if (node.type === 'Error') {\n return this.inferErrorNodeType(node as ErrorNode, inputType);\n }\n \n switch (node.type) {\n case NodeType.Literal:\n return this.inferLiteralType(node as LiteralNode);\n \n case NodeType.Binary:\n return await this.inferBinaryType(node as BinaryNode, inputType);\n \n case NodeType.Unary:\n return this.inferUnaryType(node as UnaryNode);\n \n case NodeType.Function:\n return await this.inferFunctionType(node as FunctionNode, inputType);\n \n case NodeType.Identifier:\n return await this.inferIdentifierType(node as IdentifierNode, inputType);\n \n case NodeType.Variable:\n return this.inferVariableType(node as VariableNode);\n \n case NodeType.Collection:\n return await this.inferCollectionType(node as CollectionNode);\n \n case NodeType.TypeCast:\n return await this.inferTypeCastType(node as TypeCastNode);\n \n case NodeType.MembershipTest:\n return { type: 'Boolean', singleton: true };\n \n case NodeType.TypeOrIdentifier:\n return await this.inferTypeOrIdentifierType(node as TypeOrIdentifierNode, inputType);\n \n default:\n return { type: 'Any', singleton: false };\n }\n }\n \n private inferErrorNodeType(errorNode: ErrorNode, inputType?: TypeInfo): TypeInfo {\n // For error nodes, return a generic type that allows partial analysis to continue\n // This enables type checking for valid parts of broken expressions\n return { type: 'Any', singleton: false };\n }\n \n private inferLiteralType(node: LiteralNode): TypeInfo {\n switch (node.valueType) {\n case 'string':\n return { type: 'String', singleton: true };\n case 'number':\n const num = node.value as number;\n return { \n type: Number.isInteger(num) ? 'Integer' : 'Decimal', \n singleton: true \n };\n case 'boolean':\n return { type: 'Boolean', singleton: true };\n case 'date':\n return { type: 'Date', singleton: true };\n case 'datetime':\n return { type: 'DateTime', singleton: true };\n case 'time':\n return { type: 'Time', singleton: true };\n case 'null':\n return { type: 'Any', singleton: false }; // Empty collection\n default:\n return { type: 'Any', singleton: true };\n }\n }\n \n private async inferBinaryType(node: BinaryNode, inputType?: TypeInfo): Promise<TypeInfo> {\n const operator = registry.getOperatorDefinition(node.operator);\n if (!operator) {\n return { type: 'Any', singleton: false };\n }\n \n // For navigation (dot operator), we need special handling\n if (node.operator === '.') {\n return await this.inferNavigationType(node, inputType);\n }\n \n // Infer types of operands\n const leftType = await this.inferType(node.left, inputType);\n const rightType = await this.inferType(node.right, inputType);\n \n // Find matching signature\n for (const sig of operator.signatures) {\n if (this.isTypeCompatible(leftType, sig.left) && \n this.isTypeCompatible(rightType, sig.right)) {\n return this.resolveResultType(sig.result, inputType, leftType, rightType);\n }\n }\n \n // Default to first signature's result type\n const defaultResult = operator.signatures[0]?.result || { type: 'Any', singleton: false };\n return this.resolveResultType(defaultResult, inputType, leftType, rightType);\n }\n \n private async inferNavigationType(node: BinaryNode, inputType?: TypeInfo): Promise<TypeInfo> {\n const leftType = await this.inferType(node.left, inputType);\n \n // If the right side is a function, return the function's type\n if (node.right.type === NodeType.Function) {\n return await this.inferType(node.right, leftType);\n }\n \n // If we have a model provider and the right side is an identifier\n if (this.modelProvider && node.right.type === NodeType.Identifier) {\n const propertyName = (node.right as IdentifierNode).name;\n \n // Use getElementType to navigate the property\n const resultType = await this.modelProvider.getElementType(leftType, propertyName);\n if (resultType) {\n return resultType;\n }\n \n // If property not found and we have a concrete type from model provider, report error\n // Skip diagnostics for union types - they may have dynamic properties\n if (leftType.namespace && leftType.name && leftType.modelContext && \n !(leftType.modelContext as any).isUnion) {\n this.diagnostics.push(\n toDiagnostic(Errors.unknownProperty(propertyName, `${leftType.namespace}.${leftType.name}`, node.right.range))\n );\n }\n }\n \n // Default navigation behavior\n return { type: 'Any', singleton: false };\n }\n \n private inferUnaryType(node: UnaryNode): TypeInfo {\n const operator = registry.getOperatorDefinition(node.operator);\n if (!operator) {\n return { type: 'Any', singleton: false };\n }\n \n // Unary operators typically have one signature\n const signature = operator.signatures[0];\n if (signature && typeof signature.result === 'object') {\n return signature.result;\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private async inferFunctionType(node: FunctionNode, inputType?: TypeInfo): Promise<TypeInfo> {\n if (node.name.type !== NodeType.Identifier) {\n return { type: 'Any', singleton: false };\n }\n \n const funcName = (node.name as IdentifierNode).name;\n const func = registry.getFunction(funcName);\n \n if (!func) {\n return { type: 'Any', singleton: false };\n }\n \n // Special handling for iif function\n if (funcName === 'iif') {\n // iif returns the common type of the true and false branches\n if (node.arguments.length >= 2) {\n const trueBranchType = await this.inferType(node.arguments[1]!, inputType);\n if (node.arguments.length >= 3) {\n const falseBranchType = await this.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 (this.isTypeCompatible(trueBranchType, falseBranchType)) {\n return falseBranchType;\n }\n if (this.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 // Special handling for defineVariable function\n if (funcName === 'defineVariable') {\n // defineVariable returns its input type unchanged\n return inputType || { type: 'Any', singleton: false };\n }\n \n // Special handling for aggregate function\n if (funcName === 'aggregate') {\n // If init parameter is provided, use its type to infer result type\n if (node.arguments.length >= 2) {\n const initType = await this.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 \n // Special handling for children function\n if (funcName === 'children') {\n if (inputType && this.modelProvider && 'getChildrenType' in this.modelProvider) {\n const childrenType = await this.modelProvider.getChildrenType(inputType);\n if (childrenType) {\n return childrenType;\n }\n }\n // Fallback to Any collection\n return { type: 'Any', singleton: false };\n }\n \n // Special handling for descendants function\n // Returns Any type due to combinatorial explosion of possible types\n if (funcName === 'descendants') {\n return { type: 'Any', singleton: false };\n }\n \n // Special handling for functions with dynamic result types\n // Use first matching signature's result type\n const matchingSignature = func.signatures?.find(sig => \n !sig.input || !inputType || this.isTypeCompatible(inputType, sig.input)\n ) || func.signatures?.[0];\n \n if (!matchingSignature) {\n return { type: 'Any', singleton: false };\n }\n \n if (matchingSignature.result === 'inputType') {\n // Functions like where() return the same type as input but always as collection\n return inputType ? { ...inputType, singleton: false } : { type: 'Any', singleton: false };\n } else if (matchingSignature.result === 'inputTypeSingleton') {\n // Functions like first(), last() return the same type as input but as singleton\n return inputType ? { ...inputType, singleton: true } : { type: 'Any', singleton: true };\n } else if (matchingSignature.result === 'parameterType' && node.arguments.length > 0) {\n // Functions like select() return the type of the first parameter expression as collection\n const paramType = await this.inferType(node.arguments[0]!, inputType);\n return { ...paramType, singleton: false };\n } else if (typeof matchingSignature.result === 'object') {\n return matchingSignature.result;\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private async inferIdentifierType(node: IdentifierNode, inputType?: TypeInfo): Promise<TypeInfo> {\n // First, try to navigate from input type (most common case)\n if (inputType && this.modelProvider) {\n const elementType = await this.modelProvider.getElementType(inputType, node.name);\n if (elementType) {\n return elementType;\n }\n }\n \n // Only check if it's a type name if it starts with uppercase (FHIR convention)\n // or if there's no input type context\n // Skip common FHIRPath keywords and function names that aren't types\n const fhirPathKeywords = ['Boolean', 'String', 'Integer', 'Decimal', 'Date', 'DateTime', 'Time', 'Quantity', 'ofType'];\n if (this.modelProvider && (!inputType || /^[A-Z]/.test(node.name)) && !fhirPathKeywords.includes(node.name)) {\n // Try to get type from model provider\n const typeInfo = await this.modelProvider.getType(node.name);\n if (typeInfo) {\n return typeInfo;\n }\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private async inferTypeOrIdentifierType(node: TypeOrIdentifierNode, inputType?: TypeInfo): Promise<TypeInfo> {\n // TypeOrIdentifier can be either a type name or a property navigation\n \n // First, try navigation from input type (most common case)\n if (inputType && this.modelProvider) {\n const elementType = await this.modelProvider.getElementType(inputType, node.name);\n if (elementType) {\n return elementType;\n }\n }\n \n // Then check if it's a type name (only for uppercase names or no input context)\n // Skip common FHIRPath keywords and function names that aren't types\n const fhirPathKeywords = ['Boolean', 'String', 'Integer', 'Decimal', 'Date', 'DateTime', 'Time', 'Quantity', 'ofType'];\n if (this.modelProvider && (!inputType || /^[A-Z]/.test(node.name)) && !fhirPathKeywords.includes(node.name)) {\n // Try to get type from model provider\n const typeInfo = await this.modelProvider.getType(node.name);\n if (typeInfo) {\n return typeInfo;\n }\n }\n \n return { type: 'Any', singleton: false };\n }\n \n private inferVariableType(node: VariableNode): TypeInfo {\n // System variables - check temporary context\n if (node.name.startsWith('$')) {\n const systemType = this.systemVariableTypes.get(node.name);\n if (systemType) {\n return systemType;\n }\n // Fallback defaults for system variables\n switch (node.name) {\n case '$this':\n return { type: 'Any', singleton: false };\n case '$index':\n return { type: 'Integer', singleton: true };\n case '$total':\n return { type: 'Any', singleton: false };\n default:\n return { type: 'Any', singleton: false };\n }\n }\n \n // Special FHIRPath environment variables\n if (node.name === '%context' || node.name === '%resource' || node.name === '%rootResource') {\n return { type: 'Any', singleton: false }; // These return the original input\n }\n \n // User-defined variables - check with or without % prefix\n let varName = node.name;\n if (varName.startsWith('%')) {\n varName = varName.substring(1);\n }\n \n const userType = this.userVariableTypes.get(varName);\n if (userType) {\n return userType;\n }\n \n return { type: 'Any', singleton: true };\n }\n \n private async inferCollectionType(node: CollectionNode): Promise<TypeInfo> {\n if (node.elements.length === 0) {\n return { type: 'Any', singleton: false };\n }\n \n // Infer types of all elements\n const elementTypes = await Promise.all(node.elements.map(el => this.inferType(el)));\n \n // If all elements have the same type, use that\n const firstType = elementTypes[0];\n if (firstType) {\n const allSameType = elementTypes.every(t => \n t.type === firstType.type && \n t.namespace === firstType.namespace && \n t.name === firstType.name\n );\n \n if (allSameType) {\n return { ...firstType, singleton: false };\n }\n }\n \n // Otherwise, it's a heterogeneous collection\n return { type: 'Any', singleton: false };\n }\n \n private async inferTypeCastType(node: TypeCastNode): Promise<TypeInfo> {\n const targetType = node.targetType;\n \n // If we have a model provider, try to get the type\n if (this.modelProvider) {\n const typeInfo = await this.modelProvider.getType(targetType);\n if (typeInfo) {\n return typeInfo;\n }\n }\n \n // Otherwise, check if it's a FHIRPath primitive type\n const fhirPathTypes = ['String', 'Boolean', 'Integer', 'Decimal', 'Date', 'DateTime', 'Time', 'Quantity'];\n if (fhirPathTypes.includes(targetType)) {\n return { type: targetType as TypeName, singleton: true };\n }\n \n return { type: 'Any', singleton: true };\n }\n \n private isTypeCompatible(source: TypeInfo, target: TypeInfo): boolean {\n // Exact match\n if (source.type === target.type && source.singleton === target.singleton) {\n return true;\n }\n \n // Any is compatible with everything\n if (source.type === 'Any' || target.type === 'Any') {\n return true;\n }\n \n // Singleton can be promoted to collection\n if (source.singleton && !target.singleton && source.type === target.type) {\n return true;\n }\n \n // Type hierarchy compatibility\n if (this.isSubtypeOf(source.type, target.type)) {\n // Check singleton compatibility\n if (source.singleton === target.singleton || (source.singleton && !target.singleton)) {\n return true;\n }\n }\n \n // Numeric type compatibility\n if (this.isNumericType(source.type) && this.isNumericType(target.type)) {\n // Integer can be used where Decimal is expected\n if (source.type === 'Integer' && target.type === 'Decimal') {\n return source.singleton !== undefined && target.singleton !== undefined && \n (source.singleton === target.singleton || (source.singleton && !target.singleton));\n }\n }\n \n return false;\n }\n \n private isSubtypeOf(source: TypeName, target: TypeName): boolean {\n // Basic subtyping rules\n if (source === target) return true;\n if (target === 'Any') return true;\n \n // Integer is a subtype of Decimal\n if (source === 'Integer' && target === 'Decimal') return true;\n \n // Model-specific subtyping would be checked via ModelProvider\n // For now, we don't have other subtyping rules\n return false;\n }\n \n private isNumericType(type: TypeName): boolean {\n return type === 'Integer' || type === 'Decimal' || type === 'Quantity';\n }\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 { type: Number.isInteger(value) ? 'Integer' : '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 private resolveResultType(\n resultSpec: TypeInfo | 'inputType' | 'leftType' | 'rightType',\n inputType?: TypeInfo,\n leftType?: TypeInfo,\n rightType?: TypeInfo\n ): TypeInfo {\n if (typeof resultSpec !== 'string') {\n return resultSpec;\n }\n \n switch (resultSpec) {\n case 'inputType':\n return inputType || { type: 'Any', singleton: false };\n case 'leftType':\n // For union-like operators, result is always a collection\n return leftType ? { ...leftType, singleton: false } : { type: 'Any', singleton: false };\n case 'rightType':\n return rightType ? { ...rightType, singleton: false } : { type: 'Any', singleton: false };\n default:\n return { type: 'Any', singleton: false };\n }\n }\n \n private checkBinaryOperatorTypes(node: BinaryNode, operator: import('./types').OperatorDefinition): void {\n const leftType = node.left.typeInfo!;\n const rightType = node.right.typeInfo!;\n \n // Find if any signature matches\n let foundMatch = false;\n for (const sig of operator.signatures) {\n if (this.isTypeCompatible(leftType, sig.left) && \n this.isTypeCompatible(rightType, sig.right)) {\n foundMatch = true;\n break;\n }\n }\n \n if (!foundMatch) {\n const leftTypeStr = this.typeToString(leftType);\n const rightTypeStr = this.typeToString(rightType);\n this.diagnostics.push(\n toDiagnostic(Errors.operatorTypeMismatch(node.operator, leftTypeStr, rightTypeStr, node.range))\n );\n }\n }\n \n private checkFunctionArgumentTypes(node: FunctionNode, func: import('./types').FunctionDefinition): void {\n const params = func.signatures?.[0]?.parameters || [];\n \n for (let i = 0; i < Math.min(node.arguments.length, params.length); i++) {\n const arg = node.arguments[i]!;\n const param = params[i]!;\n \n if (arg.typeInfo && !param.expression) {\n // For non-expression parameters, check type compatibility\n if (!this.isTypeCompatible(arg.typeInfo, param.type)) {\n const argTypeStr = this.typeToString(arg.typeInfo);\n const paramTypeStr = this.typeToString(param.type);\n this.diagnostics.push(\n toDiagnostic(Errors.argumentTypeMismatch(i + 1, func.name, paramTypeStr, argTypeStr, arg.range))\n );\n }\n }\n }\n }\n \n private typeToString(type: TypeInfo): string {\n const singletonStr = type.singleton ? '' : '[]';\n if (type.namespace && type.name) {\n return `${type.namespace}.${type.name}${singletonStr}`;\n }\n return `${type.type}${singletonStr}`;\n }\n \n /**\n * Infer the expected type at a cursor position based on context\n */\n private inferExpectedTypeForCursor(cursorNode: AnyCursorNode, inputType?: TypeInfo): TypeInfo | undefined {\n const context = cursorNode.context;\n \n switch (context) {\n case CursorContext.Identifier:\n // After dot, expecting a member of the input type\n return inputType;\n \n case CursorContext.Type:\n // After is/as/ofType, expecting a type name\n return { type: 'System.String' as TypeName, singleton: true };\n \n case CursorContext.Argument:\n // In function argument, would need to look up function signature\n // For now, return Any\n return { type: 'Any' as TypeName, singleton: false };\n \n case CursorContext.Index:\n // In indexer, expecting Integer\n return { type: 'Integer' as TypeName, singleton: true };\n \n case CursorContext.Operator:\n // Between expressions, could be any operator\n // Return the input type as context\n return inputType;\n \n default:\n return undefined;\n }\n }\n\n /**\n * Annotate AST with type information\n */\n private async annotateAST(node: ASTNode, inputType?: TypeInfo): Promise<void> {\n // Check for cursor node in cursor mode\n if (this.cursorMode && isCursorNode(node)) {\n this.stoppedAtCursor = true;\n this.cursorContext = {\n cursorNode: node as AnyCursorNode,\n typeBeforeCursor: inputType,\n expectedType: this.inferExpectedTypeForCursor(node as AnyCursorNode, inputType)\n };\n // Still attach a type to the cursor node for consistency\n (node as any).typeInfo = inputType || { type: 'Any', singleton: false };\n return; // Short-circuit\n }\n \n // If we've already stopped at cursor, don't continue\n if (this.stoppedAtCursor) {\n return;\n }\n \n // Handle error nodes\n if (node.type === 'Error') {\n const errorNode = node as ErrorNode;\n // Infer a reasonable type for error nodes\n node.typeInfo = this.inferErrorNodeType(errorNode, inputType);\n // Add diagnostic for the error\n this.diagnostics.push({\n severity: errorNode.severity || DiagnosticSeverity.Error,\n message: errorNode.message,\n range: errorNode.range,\n code: errorNode.code?.toString() || 'FP5003',\n source: 'fhirpath'\n });\n return;\n }\n \n // Infer and attach type info\n node.typeInfo = await this.inferType(node, inputType);\n\n // Recursively annotate children\n switch (node.type) {\n case NodeType.Binary:\n const binaryNode = node as BinaryNode;\n await this.annotateAST(binaryNode.left, inputType);\n \n // If we stopped at cursor, don't continue\n if (this.stoppedAtCursor) {\n break;\n }\n \n // Check if right side is a cursor node - if so, set type from left\n if (this.cursorMode && isCursorNode(binaryNode.right)) {\n this.stoppedAtCursor = true;\n this.cursorContext = {\n cursorNode: binaryNode.right as AnyCursorNode,\n typeBeforeCursor: binaryNode.left.typeInfo,\n expectedType: this.inferExpectedTypeForCursor(binaryNode.right as AnyCursorNode, binaryNode.left.typeInfo)\n };\n // Still attach type to cursor node\n (binaryNode.right as any).typeInfo = binaryNode.left.typeInfo || { type: 'Any', singleton: false };\n break;\n }\n \n // For navigation, pass the left's type as input to the right\n if (binaryNode.operator === '.') {\n // Collect all variables defined in the left side chain\n const definedVarsWithTypes = this.collectDefinedVariablesWithTypes(binaryNode.left);\n \n if (definedVarsWithTypes.size > 0) {\n // Save current variable types\n const savedTypes = new Map<string, TypeInfo>();\n definedVarsWithTypes.forEach((type, varName) => {\n const currentType = this.userVariableTypes.get(varName);\n if (currentType) {\n savedTypes.set(varName, currentType);\n }\n this.userVariableTypes.set(varName, type);\n });\n \n // Annotate right side with new variables in scope\n await this.annotateAST(binaryNode.right, binaryNode.left.typeInfo);\n \n // Restore previous types\n definedVarsWithTypes.forEach((_, varName) => {\n const savedType = savedTypes.get(varName);\n if (savedType) {\n this.userVariableTypes.set(varName, savedType);\n } else {\n this.userVariableTypes.delete(varName);\n }\n });\n } else {\n // No defineVariable in chain, proceed normally\n await this.annotateAST(binaryNode.right, binaryNode.left.typeInfo);\n }\n } else {\n await this.annotateAST(binaryNode.right, inputType);\n }\n break;\n \n case NodeType.Unary:\n const unaryNode = node as UnaryNode;\n await this.annotateAST(unaryNode.operand, inputType);\n break;\n \n case NodeType.Function:\n const funcNode = node as FunctionNode;\n await this.annotateAST(funcNode.name, inputType);\n \n // Special handling for aggregate function arguments\n if (funcNode.name.type === NodeType.Identifier && \n (funcNode.name as IdentifierNode).name === 'aggregate') {\n // Aggregate establishes both $this and $total\n if (funcNode.arguments.length >= 1) {\n const itemType = inputType ? { ...inputType, singleton: true } : { type: 'Any' as TypeName, singleton: true };\n \n // Save current system variable context\n const savedThis = this.systemVariableTypes.get('$this');\n const savedTotal = this.systemVariableTypes.get('$total');\n \n // Set $this for iteration\n this.systemVariableTypes.set('$this', itemType);\n \n if (funcNode.arguments.length >= 2) {\n // Has init parameter - evaluate it first\n await this.annotateAST(funcNode.arguments[1]!, inputType);\n const initType = funcNode.arguments[1]!.typeInfo;\n \n // Set $total to init type\n if (initType) {\n this.systemVariableTypes.set('$total', initType);\n } else {\n this.systemVariableTypes.set('$total', { type: 'Any', singleton: false });\n }\n \n // Process aggregator with both variables set\n await this.annotateAST(funcNode.arguments[0]!, inputType);\n \n // Process remaining arguments\n for (const arg of funcNode.arguments.slice(2)) {\n await this.annotateAST(arg, inputType);\n if (this.stoppedAtCursor) break;\n }\n } else {\n // No init - first pass to infer aggregator type\n this.systemVariableTypes.set('$total', { type: 'Any', singleton: false });\n await this.annotateAST(funcNode.arguments[0]!, inputType);\n \n // Second pass with inferred type\n const aggregatorType = funcNode.arguments[0]!.typeInfo;\n if (aggregatorType) {\n this.systemVariableTypes.set('$total', aggregatorType);\n // Re-annotate with proper $total type\n await this.annotateAST(funcNode.arguments[0]!, inputType);\n }\n }\n \n // Restore previous context\n if (savedThis) {\n this.systemVariableTypes.set('$this', savedThis);\n } else {\n this.systemVariableTypes.delete('$this');\n }\n if (savedTotal) {\n this.systemVariableTypes.set('$total', savedTotal);\n } else {\n this.systemVariableTypes.delete('$total');\n }\n }\n } else {\n // Special handling for functions that pass their input as context to arguments\n const funcName = funcNode.name.type === NodeType.Identifier ? \n (funcNode.name as IdentifierNode).name : null;\n \n if (funcName && ['where', 'select', 'all', 'exists'].includes(funcName)) {\n // These functions establish $this as each element of the input collection\n const elementType = inputType ? { ...inputType, singleton: true } : { type: 'Any' as TypeName, singleton: true };\n \n // Save current system variable context\n const savedThis = this.systemVariableTypes.get('$this');\n const savedIndex = this.systemVariableTypes.get('$index');\n \n // Set system variables for expression evaluation\n this.systemVariableTypes.set('$this', elementType);\n this.systemVariableTypes.set('$index', { type: 'Integer', singleton: true });\n \n // Process arguments with system variables in scope\n for (const arg of funcNode.arguments) {\n await this.annotateAST(arg, inputType);\n if (this.stoppedAtCursor) break;\n }\n \n // Restore previous context\n if (savedThis) {\n this.systemVariableTypes.set('$this', savedThis);\n } else {\n this.systemVariableTypes.delete('$this');\n }\n if (savedIndex) {\n this.systemVariableTypes.set('$index', savedIndex);\n } else {\n this.systemVariableTypes.delete('$index');\n }\n } else {\n // Regular function argument annotation\n for (const arg of funcNode.arguments) {\n await this.annotateAST(arg, inputType);\n if (this.stoppedAtCursor) break;\n }\n }\n }\n break;\n \n case NodeType.Collection:\n const collNode = node as CollectionNode;\n for (const el of collNode.elements) {\n await this.annotateAST(el, inputType);\n if (this.stoppedAtCursor) break;\n }\n break;\n \n case NodeType.TypeCast:\n const castNode = node as TypeCastNode;\n await this.annotateAST(castNode.expression, inputType);\n break;\n \n case NodeType.MembershipTest:\n const memberNode = node as MembershipTestNode;\n await this.annotateAST(memberNode.expression, inputType);\n break;\n \n case NodeType.Index:\n const indexNode = node as IndexNode;\n await this.annotateAST(indexNode.expression, inputType);\n if (!this.stoppedAtCursor) {\n await this.annotateAST(indexNode.index, inputType);\n }\n break;\n \n case NodeType.TypeOrIdentifier:\n // TypeOrIdentifier doesn't have children to annotate\n break;\n }\n }\n}","import type { ModelProvider, TypeInfo, TypeName } from './types';\nimport { CanonicalManager as createCanonicalManager, type Config, type CanonicalManager as ICanonicalManager, 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: ICanonicalManager;\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 console.warn(`Failed to load schema for ${typeName}:`, error);\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 while (current.base && current.base !== 'Resource' && current.base !== 'Element') {\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 // Check if it's a primitive type - these don't require initialization\n if (this.typeMapping[typeName]) {\n return {\n type: this.typeMapping[typeName],\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 // 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 // Synchronous method to get type from cache (for analyzer)\n getTypeFromCache(typeName: string): TypeInfo<FHIRModelContext> | undefined {\n // Check if it's a primitive type - these don't require initialization\n if (this.typeMapping[typeName]) {\n return {\n type: this.typeMapping[typeName],\n namespace: 'FHIR',\n name: typeName,\n singleton: true,\n modelContext: {\n path: typeName,\n schemaHierarchy: []\n }\n };\n }\n \n // For complex types, check if schema is in cache\n const schema = this.schemaCache.get(typeName);\n if (!schema) {\n return undefined;\n }\n \n // Get cached hierarchy or at least the current schema\n const schemaHierarchy = this.hierarchyCache.get(schema.name || schema.url) || [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}","import type { TypeInfo, ASTNode, Diagnostic } from './types';\nimport type { FHIRPathValue } from './boxing';\nimport { NodeType, DiagnosticSeverity } from './types';\nimport { parse } from './parser';\nimport { Analyzer } from './analyzer';\nimport { Interpreter, RuntimeContextManager } from './interpreter';\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 case NodeType.TypeOrIdentifier:\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}","import { parse } from './parser';\nimport { Analyzer } from './analyzer';\nimport type { TypeInfo, ModelProvider } from './types';\n\nimport { CursorContext, isCursorNode } from './cursor-nodes';\nimport type { AnyCursorNode } from './cursor-nodes';\nimport { registry } from './registry';\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 order */\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, { cursorPosition });\n if (!parseResult.ast) {\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 let cursorNode = analysis.cursorContext?.cursorNode;\n let typeBeforeCursor = analysis.cursorContext?.typeBeforeCursor;\n \n // Check if cursor is in a binary expression as the right operand\n // This handles cases where analyzer found the cursor but we need to adjust context\n if (parseResult.ast) {\n const ast = parseResult.ast as any;\n if (ast.type === 'Binary' && ast.right && isCursorNode(ast.right)) {\n cursorNode = ast.right;\n // Get type from left side\n typeBeforeCursor = ast.left?.typeInfo;\n \n // Special case for navigation: cursor right after identifier\n if (ast.left?.type === 'Binary' && ast.left.operator === '.') {\n if (ast.left.right?.type === 'Identifier') {\n const identifierEnd = ast.left.right.range?.end?.offset;\n \n // If cursor is right after identifier with no space\n if (identifierEnd === cursorPosition) {\n // Check if this could be a partial identifier by seeing if there are\n // any properties that would match if we treated it as a prefix\n const partialText = extractPartialText(expression, cursorPosition);\n if (partialText && modelProvider) {\n // Try to get elements from the type before the identifier\n const baseType = ast.left.left?.typeInfo;\n if (baseType) {\n const typeName = baseType.name || baseType.type;\n // Skip if type is 'Any' as it's not a real FHIR type\n if (typeName && typeName !== 'Any') {\n const elements = await modelProvider.getElements(typeName);\n if (elements.length > 0) {\n // Check if any elements start with the partial text\n const hasMatches = elements.some(p => \n p.name.toLowerCase().startsWith(partialText.toLowerCase()) &&\n p.name.toLowerCase() !== partialText.toLowerCase()\n );\n \n if (hasMatches) {\n // There are potential completions - treat as identifier context\n cursorNode = {\n ...cursorNode,\n context: CursorContext.Identifier\n } as any;\n typeBeforeCursor = baseType;\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n \n // Check if cursor is in a function argument and fix the function name\n if (cursorNode && cursorNode.context === CursorContext.Argument) {\n const functionName = findFunctionName(parseResult.ast as any, cursorNode);\n if (functionName) {\n (cursorNode as any).functionName = functionName;\n \n // Special case: ofType, as, is should treat their arguments as type context\n if (functionName === 'ofType' || functionName === 'as' || functionName === 'is') {\n // Convert to type cursor node\n cursorNode = {\n ...cursorNode,\n context: CursorContext.Type,\n typeOperator: functionName\n } as any;\n }\n }\n }\n \n if (!cursorNode) {\n // Fallback: provide general completions if no cursor node found\n return getGeneralCompletions();\n }\n \n const expectedType = analysis.cursorContext?.expectedType;\n \n // Get partial text for filtering\n const partialText = extractPartialText(expression, cursorPosition);\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 completions = getOperatorCompletions(typeBeforeCursor);\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);\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 return registry.isOperatorApplicableToType(opDef.symbol, typeInfo.type);\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 * Find function name for a cursor node in an argument position\n */\nfunction findFunctionName(ast: any, cursorNode: any): string | null {\n // Check if AST is a function with cursor in arguments\n if (ast.type === 'Function' && ast.arguments?.includes(cursorNode)) {\n return ast.name?.name || null;\n }\n \n // Check if AST is binary with function on right\n if (ast.type === 'Binary' && ast.right?.type === 'Function') {\n if (ast.right.arguments?.includes(cursorNode)) {\n return ast.right.name?.name || null;\n }\n }\n \n // Recursively check children\n if (ast.left) {\n const leftResult = findFunctionName(ast.left, cursorNode);\n if (leftResult) return leftResult;\n }\n \n if (ast.right) {\n const rightResult = findFunctionName(ast.right, cursorNode);\n if (rightResult) return rightResult;\n }\n \n if (ast.arguments) {\n for (const arg of ast.arguments) {\n if (arg !== cursorNode) {\n const argResult = findFunctionName(arg, cursorNode);\n if (argResult) return argResult;\n }\n }\n }\n \n return null;\n}\n\n/**\n * Extract partial text before cursor for filtering\n */\nfunction extractPartialText(expression: string, cursorPosition: number): string {\n // Handle case where cursor is right after a dot\n if (cursorPosition > 0 && expression[cursorPosition - 1] === '.') {\n return '';\n }\n \n let start = cursorPosition;\n \n // Move back to find start of identifier\n while (start > 0) {\n const char = expression[start - 1];\n if (char && /[a-zA-Z0-9_$%]/.test(char)) {\n start--;\n } else {\n break;\n }\n }\n \n return expression.substring(start, cursorPosition);\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 function takes parameters\n const hasParams = funcDef.signatures?.[0]?.parameters && funcDef.signatures[0].parameters.length > 0;\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?.[0]?.parameters && func.signatures[0].parameters.length > 0;\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 // 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 });\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 });\n }\n }\n \n // For ofType, add resource types\n const typeOperator = (cursorNode as any).typeOperator;\n if (typeOperator === 'ofType' && 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 });\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): Promise<CompletionItem[]> {\n const completions: CompletionItem[] = [];\n const argNode = cursorNode as any;\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 // Add elements if in lambda context\n const functionName = argNode.functionName;\n // Check if the function accepts lambda expressions (could be determined from function signature in registry)\n const lambdaFunctions = ['where', 'select', 'all', 'exists', 'any', 'repeat'];\n if (functionName && lambdaFunctions.includes(functionName)) {\n // In lambda function, provide elements of item type\n if (typeBeforeCursor && modelProvider) {\n const itemType = { ...typeBeforeCursor, singleton: true };\n const typeName = itemType.name || itemType.type;\n // Skip if type is 'Any' as it's not a real FHIR 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 \n // No hardcoded constants - these should come from context or be typed by user\n \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 $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 // 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}","import { Parser } from './parser';\nimport { Interpreter, RuntimeContextManager } from './interpreter';\nimport { Analyzer } from './analyzer';\nimport type { AnalysisResult } from './types';\nimport { box, unbox } from './boxing';\nimport { FHIRPathError, Errors } 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 parser = new Parser(expression);\n const parseResult = parser.parse();\n \n // Check for parse errors\n if (parseResult.errors.length > 0) {\n // For backward compatibility, throw the first error\n const firstError = parseResult.errors[0]!;\n throw Errors.invalidSyntax(firstError.message);\n }\n \n // ALWAYS analyze the AST\n const analyzer = new Analyzer(options.modelProvider);\n const analysisResult = await analyzer.analyze(\n parseResult.ast, \n options.variables,\n options.inputType\n );\n \n // Check for analysis errors\n const errors = analysisResult.diagnostics.filter(d => d.severity === 1); // DiagnosticSeverity.Error\n if (errors.length > 0) {\n // Throw the first error\n const firstError = errors[0]!;\n if (firstError.code) {\n // Always throw as FHIRPathError if we have a code\n throw new FHIRPathError(firstError.code, firstError.message, firstError.range);\n } else {\n // Otherwise throw a generic error\n throw new Error(firstError.message);\n }\n }\n \n // Use the analyzed AST with type information\n const interpreter = new Interpreter(undefined, options.modelProvider);\n const input = options.input === undefined ? [] : Array.isArray(options.input) ? options.input : [options.input];\n \n // Box input with typeInfo if we have a modelProvider and the input is a FHIR resource\n let boxedInput = input;\n if (options.modelProvider) {\n boxedInput = await Promise.all(input.map(async item => {\n if (item && typeof item === 'object' && 'resourceType' in item && typeof item.resourceType === 'string') {\n // Get type info asynchronously\n const typeInfo = await options.modelProvider!.getType(item.resourceType);\n if (typeInfo) {\n return box(item, typeInfo);\n }\n }\n return item;\n }));\n }\n \n // Create context with variables if provided\n let context = RuntimeContextManager.create(input);\n \n // Set $this to the boxed input (required for expressions like $this.where(...))\n context = RuntimeContextManager.setVariable(context, '$this', boxedInput);\n \n // Add model provider to context if available\n if (options.modelProvider) {\n context.modelProvider = options.modelProvider;\n }\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 const result = await interpreter.evaluate(analysisResult.ast, input, context);\n \n // Unbox the results before returning\n return result.value.map(unbox);\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 // Use LSP mode with error recovery if requested\n const parserOptions = options.errorRecovery \n ? { mode: 'lsp' as const, errorRecovery: true }\n : undefined;\n \n const parser = new Parser(expression, parserOptions);\n const parseResult = parser.parse();\n \n // Check for parse errors only if error recovery is disabled\n if (!options.errorRecovery && parseResult.errors.length > 0) {\n // For backward compatibility, throw the first error\n const firstError = parseResult.errors[0]!;\n throw Errors.invalidSyntax(firstError.message);\n }\n \n const ast = parseResult.ast;\n \n // Create analyzer with optional model provider\n const analyzer = new Analyzer(options.modelProvider);\n const analysisResult = await analyzer.analyze(ast, options.variables, options.inputType);\n \n // If error recovery is enabled, merge parse errors into diagnostics\n if (options.errorRecovery && parseResult.errors.length > 0) {\n // Parse errors are already converted to diagnostics by the analyzer\n // when it encounters Error nodes in the AST\n }\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 './cursor-nodes';\nexport type {\n CursorNode,\n CursorOperatorNode,\n CursorIdentifierNode,\n CursorArgumentNode,\n CursorIndexNode,\n CursorTypeNode,\n AnyCursorNode\n} from './cursor-nodes';\n"]}