fhirpath-ts 0.0.0-bootstrap.0 → 0.2.0

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 (120) hide show
  1. package/README.md +50 -18
  2. package/dist/analyzer/analyze-dto.d.ts +4 -0
  3. package/dist/analyzer/analyze-dto.d.ts.map +1 -1
  4. package/dist/analyzer/analyze-dto.js +12 -14
  5. package/dist/analyzer/analyze-dto.js.map +1 -1
  6. package/dist/analyzer/analyze.d.ts +22 -6
  7. package/dist/analyzer/analyze.d.ts.map +1 -1
  8. package/dist/analyzer/analyze.js +242 -98
  9. package/dist/analyzer/analyze.js.map +1 -1
  10. package/dist/analyzer/declarations.d.ts +26 -0
  11. package/dist/analyzer/declarations.d.ts.map +1 -0
  12. package/dist/analyzer/declarations.js +68 -0
  13. package/dist/analyzer/declarations.js.map +1 -0
  14. package/dist/analyzer/operator-rules.d.ts +127 -0
  15. package/dist/analyzer/operator-rules.d.ts.map +1 -0
  16. package/dist/analyzer/operator-rules.js +70 -0
  17. package/dist/analyzer/operator-rules.js.map +1 -0
  18. package/dist/analyzer/signatures.d.ts +1097 -10
  19. package/dist/analyzer/signatures.d.ts.map +1 -1
  20. package/dist/analyzer/signatures.js +70 -29
  21. package/dist/analyzer/signatures.js.map +1 -1
  22. package/dist/api/compile.d.ts +32 -8
  23. package/dist/api/compile.d.ts.map +1 -1
  24. package/dist/api/compile.js +2 -0
  25. package/dist/api/compile.js.map +1 -1
  26. package/dist/api/engine.d.ts +42 -16
  27. package/dist/api/engine.d.ts.map +1 -1
  28. package/dist/api/engine.js +2 -1
  29. package/dist/api/engine.js.map +1 -1
  30. package/dist/api/project.d.ts +8 -8
  31. package/dist/api/project.d.ts.map +1 -1
  32. package/dist/api/project.js +31 -19
  33. package/dist/api/project.js.map +1 -1
  34. package/dist/api/strict.d.ts +6 -0
  35. package/dist/api/strict.d.ts.map +1 -0
  36. package/dist/api/strict.js +71 -0
  37. package/dist/api/strict.js.map +1 -0
  38. package/dist/api/tagged.d.ts +4 -4
  39. package/dist/api/tagged.d.ts.map +1 -1
  40. package/dist/api/tagged.js.map +1 -1
  41. package/dist/cli/dto-check.js +7 -3
  42. package/dist/cli/dto-check.js.map +1 -1
  43. package/dist/engine/context.d.ts +3 -1
  44. package/dist/engine/context.d.ts.map +1 -1
  45. package/dist/engine/context.js +5 -1
  46. package/dist/engine/context.js.map +1 -1
  47. package/dist/engine/navigation.d.ts.map +1 -1
  48. package/dist/engine/navigation.js +7 -48
  49. package/dist/engine/navigation.js.map +1 -1
  50. package/dist/engine/type-matching.d.ts.map +1 -1
  51. package/dist/engine/type-matching.js +6 -16
  52. package/dist/engine/type-matching.js.map +1 -1
  53. package/dist/index.d.ts +4 -3
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/parser/parser.d.ts.map +1 -1
  57. package/dist/parser/parser.js +102 -73
  58. package/dist/parser/parser.js.map +1 -1
  59. package/dist/parser/precedence.d.ts +368 -4
  60. package/dist/parser/precedence.d.ts.map +1 -1
  61. package/dist/parser/precedence.js +146 -32
  62. package/dist/parser/precedence.js.map +1 -1
  63. package/dist/r4/generated/type-maps.d.ts +1367 -0
  64. package/dist/r4/generated/type-maps.d.ts.map +1 -1
  65. package/dist/r4/index.d.ts +3 -1
  66. package/dist/r4/index.d.ts.map +1 -1
  67. package/dist/typed/context-maps.d.ts +23 -0
  68. package/dist/typed/context-maps.d.ts.map +1 -0
  69. package/dist/typed/context-maps.js +2 -0
  70. package/dist/typed/context-maps.js.map +1 -0
  71. package/dist/typed/infer.d.ts +99 -229
  72. package/dist/typed/infer.d.ts.map +1 -1
  73. package/dist/typed/infer.js +1 -84
  74. package/dist/typed/infer.js.map +1 -1
  75. package/dist/typed/inference-limits.d.ts +7 -0
  76. package/dist/typed/inference-limits.d.ts.map +1 -0
  77. package/dist/typed/inference-limits.js +6 -0
  78. package/dist/typed/inference-limits.js.map +1 -0
  79. package/dist/typed/metadata-compact.d.ts +189 -0
  80. package/dist/typed/metadata-compact.d.ts.map +1 -0
  81. package/dist/typed/metadata-compact.js +3 -0
  82. package/dist/typed/metadata-compact.js.map +1 -0
  83. package/dist/typed/parser.d.ts +515 -0
  84. package/dist/typed/parser.d.ts.map +1 -0
  85. package/dist/typed/parser.js +2 -0
  86. package/dist/typed/parser.js.map +1 -0
  87. package/dist/values/type-compat.d.ts +8 -0
  88. package/dist/values/type-compat.d.ts.map +1 -1
  89. package/dist/values/type-compat.js +44 -1
  90. package/dist/values/type-compat.js.map +1 -1
  91. package/package.json +20 -1
  92. package/src/analyzer/analyze-dto.ts +21 -17
  93. package/src/analyzer/analyze.ts +335 -109
  94. package/src/analyzer/declarations.ts +120 -0
  95. package/src/analyzer/operator-rules.ts +88 -0
  96. package/src/analyzer/signatures.ts +99 -41
  97. package/src/api/compile.ts +66 -11
  98. package/src/api/engine.ts +97 -33
  99. package/src/api/project.ts +54 -30
  100. package/src/api/strict.ts +112 -0
  101. package/src/api/tagged.ts +5 -5
  102. package/src/cli/dto-check.ts +7 -3
  103. package/src/engine/context.ts +7 -2
  104. package/src/engine/navigation.ts +7 -52
  105. package/src/engine/type-matching.ts +11 -17
  106. package/src/index.ts +25 -2
  107. package/src/parser/parser.ts +106 -74
  108. package/src/parser/precedence.ts +250 -33
  109. package/src/r4/generated/type-maps.ts +1557 -0
  110. package/src/typed/context-maps.ts +41 -0
  111. package/src/typed/infer.ts +157 -425
  112. package/src/typed/inference-limits.ts +9 -0
  113. package/src/typed/metadata-compact.ts +307 -0
  114. package/src/typed/parser.ts +2277 -0
  115. package/src/values/type-compat.ts +48 -1
  116. package/dist/typed/perf-fixture.types.d.ts +0 -136
  117. package/dist/typed/perf-fixture.types.d.ts.map +0 -1
  118. package/dist/typed/perf-fixture.types.js +0 -2
  119. package/dist/typed/perf-fixture.types.js.map +0 -1
  120. package/src/typed/perf-fixture.types.ts +0 -143
@@ -0,0 +1,2277 @@
1
+ import type { R4Bases, R4Elements, R4ReferenceTargets, R4Resources, R4TypeOf } from '../r4/generated/type-maps.ts'
2
+ import type {
3
+ EmptyContextMap,
4
+ InferredHostValueDeclarations,
5
+ LookupContextMap,
6
+ MergeContextMaps,
7
+ } from './context-maps.ts'
8
+ import type { InferenceSourceStepLimit, InferenceTokenLimit } from './inference-limits.ts'
9
+ import type {
10
+ CompactCalendarUnit,
11
+ CompactFastFunctionName,
12
+ CompactFunctionRules,
13
+ CompactInfixParselets,
14
+ CompactLambdaArgument0Name,
15
+ CompactLambdaArgument1Name,
16
+ CompactLambdaArgument2Name,
17
+ CompactOperatorRules,
18
+ CompactPrefixParselets,
19
+ CompactTypeOperatorRules,
20
+ } from './metadata-compact.ts'
21
+
22
+ type NameToken = ['name', string]
23
+ type KeywordToken = ['keyword', string]
24
+ type SymbolToken = ['symbol', string]
25
+ type LiteralToken = ['string' | 'number' | 'date' | 'dateTime' | 'time', string]
26
+ type SpecialToken = ['special', 'this' | 'index' | 'total']
27
+ type UnsafeToken = ['unsafe']
28
+ type TypeToken = NameToken | KeywordToken | SymbolToken | LiteralToken | SpecialToken | UnsafeToken
29
+ type TypeTokens = TypeToken[]
30
+ type ScanFailure = { readonly opaque: true }
31
+
32
+ type Letter =
33
+ | 'A'
34
+ | 'B'
35
+ | 'C'
36
+ | 'D'
37
+ | 'E'
38
+ | 'F'
39
+ | 'G'
40
+ | 'H'
41
+ | 'I'
42
+ | 'J'
43
+ | 'K'
44
+ | 'L'
45
+ | 'M'
46
+ | 'N'
47
+ | 'O'
48
+ | 'P'
49
+ | 'Q'
50
+ | 'R'
51
+ | 'S'
52
+ | 'T'
53
+ | 'U'
54
+ | 'V'
55
+ | 'W'
56
+ | 'X'
57
+ | 'Y'
58
+ | 'Z'
59
+ | 'a'
60
+ | 'b'
61
+ | 'c'
62
+ | 'd'
63
+ | 'e'
64
+ | 'f'
65
+ | 'g'
66
+ | 'h'
67
+ | 'i'
68
+ | 'j'
69
+ | 'k'
70
+ | 'l'
71
+ | 'm'
72
+ | 'n'
73
+ | 'o'
74
+ | 'p'
75
+ | 'q'
76
+ | 'r'
77
+ | 's'
78
+ | 't'
79
+ | 'u'
80
+ | 'v'
81
+ | 'w'
82
+ | 'x'
83
+ | 'y'
84
+ | 'z'
85
+ | '_'
86
+
87
+ type Digit = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
88
+ type HexDigit = Digit | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F'
89
+ type IdentifierPart = Letter | Digit
90
+ type Whitespace = ' ' | '\t' | '\r' | '\n' | '\f'
91
+ type Keyword = 'and' | 'or' | 'xor' | 'implies' | 'div' | 'mod' | 'in' | 'contains' | 'is' | 'as' | 'true' | 'false'
92
+ type OneCharacterSymbol =
93
+ '=' | '~' | '<' | '>' | '+' | '-' | '*' | '|' | '&' | '(' | ')' | '[' | ']' | '{' | '}' | '.' | ',' | '%'
94
+ type SimpleEscape = "'" | '"' | '`' | '/' | '\\' | 'f' | 'n' | 'r' | 't'
95
+
96
+ type Step<Steps extends unknown[]> = [...Steps, 0]
97
+
98
+ /** A semantic-token and source-step bounded tokenizer matching the runtime vocabulary. */
99
+ type Tokenize<Source extends string> = Scan<Source, [], []>
100
+
101
+ type Scan<Source extends string, Tokens extends TypeTokens, Steps extends unknown[]> = Source extends ''
102
+ ? Tokens
103
+ : Steps['length'] extends InferenceSourceStepLimit
104
+ ? ScanFailure
105
+ : Source extends `${infer Character}${infer Rest}`
106
+ ? Character extends Whitespace
107
+ ? Scan<Rest, Tokens, Step<Steps>>
108
+ : Character extends Letter
109
+ ? ReadIdentifier<Rest, Character, Tokens, Step<Steps>>
110
+ : Character extends Digit
111
+ ? ReadNumber<Rest, Character, Tokens, Step<Steps>>
112
+ : Character extends "'"
113
+ ? ReadQuoted<Rest, '', "'", 'string', Tokens, Step<Steps>>
114
+ : Character extends '`'
115
+ ? ReadQuoted<Rest, '', '`', 'name', Tokens, Step<Steps>>
116
+ : Character extends '@'
117
+ ? ReadTemporal<Rest, Tokens, Step<Steps>>
118
+ : Character extends '$'
119
+ ? ReadSpecial<Rest, '', Tokens, Step<Steps>>
120
+ : Character extends '/'
121
+ ? ScanAfterSlash<Rest, Tokens, Step<Steps>>
122
+ : Character extends '!'
123
+ ? ScanAfterBang<Rest, Tokens, Step<Steps>>
124
+ : Character extends '<' | '>'
125
+ ? ScanComparison<Rest, Character, Tokens, Step<Steps>>
126
+ : Character extends OneCharacterSymbol
127
+ ? EmitAndScan<Rest, ['symbol', Character], Tokens, Step<Steps>>
128
+ : ScanFailure
129
+ : ScanFailure
130
+
131
+ type ReadIdentifier<
132
+ Source extends string,
133
+ Acc extends string,
134
+ Tokens extends TypeTokens,
135
+ Steps extends unknown[],
136
+ > = Source extends ''
137
+ ? EmitFinal<Acc extends Keyword ? ['keyword', Acc] : ['name', Acc], Tokens>
138
+ : Steps['length'] extends InferenceSourceStepLimit
139
+ ? ScanFailure
140
+ : Source extends `${infer Character}${infer Rest}`
141
+ ? Character extends IdentifierPart
142
+ ? ReadIdentifier<Rest, `${Acc}${Character}`, Tokens, Step<Steps>>
143
+ : EmitAndScan<Source, Acc extends Keyword ? ['keyword', Acc] : ['name', Acc], Tokens, Steps>
144
+ : ScanFailure
145
+
146
+ type ReadNumber<
147
+ Source extends string,
148
+ Acc extends string,
149
+ Tokens extends TypeTokens,
150
+ Steps extends unknown[],
151
+ > = Source extends ''
152
+ ? EmitFinal<['number', Acc], Tokens>
153
+ : Steps['length'] extends InferenceSourceStepLimit
154
+ ? ScanFailure
155
+ : Source extends `${infer Character}${infer Rest}`
156
+ ? Character extends Digit
157
+ ? ReadNumber<Rest, `${Acc}${Character}`, Tokens, Step<Steps>>
158
+ : Character extends 'L'
159
+ ? EmitAndScan<Rest, ['number', `${Acc}L`], Tokens, Step<Steps>>
160
+ : Character extends '.'
161
+ ? Rest extends `${infer Fraction}${string}`
162
+ ? Fraction extends Digit
163
+ ? ReadFraction<Rest, `${Acc}.`, Tokens, Step<Steps>>
164
+ : EmitAndScan<Source, ['number', Acc], Tokens, Steps>
165
+ : EmitAndScan<Source, ['number', Acc], Tokens, Steps>
166
+ : EmitAndScan<Source, ['number', Acc], Tokens, Steps>
167
+ : ScanFailure
168
+
169
+ type ReadFraction<
170
+ Source extends string,
171
+ Acc extends string,
172
+ Tokens extends TypeTokens,
173
+ Steps extends unknown[],
174
+ > = Source extends ''
175
+ ? EmitFinal<['number', Acc], Tokens>
176
+ : Steps['length'] extends InferenceSourceStepLimit
177
+ ? ScanFailure
178
+ : Source extends `${infer Character}${infer Rest}`
179
+ ? Character extends Digit
180
+ ? ReadFraction<Rest, `${Acc}${Character}`, Tokens, Step<Steps>>
181
+ : EmitAndScan<Source, ['number', Acc], Tokens, Steps>
182
+ : ScanFailure
183
+
184
+ type ReadQuoted<
185
+ Source extends string,
186
+ Acc extends string,
187
+ Quote extends "'" | '`',
188
+ Kind extends 'string' | 'name' | 'unsafe',
189
+ Tokens extends TypeTokens,
190
+ Steps extends unknown[],
191
+ > = Source extends ''
192
+ ? ScanFailure
193
+ : Steps['length'] extends InferenceSourceStepLimit
194
+ ? ScanFailure
195
+ : Source extends `${infer Character}${infer Rest}`
196
+ ? Character extends Quote
197
+ ? EmitAndScan<
198
+ Rest,
199
+ Kind extends 'string' ? ['string', Acc] : Kind extends 'name' ? ['name', Acc] : UnsafeToken,
200
+ Tokens,
201
+ Step<Steps>
202
+ >
203
+ : Character extends '\\'
204
+ ? ReadEscape<Rest, Acc, Quote, Kind, Tokens, Step<Steps>>
205
+ : ReadQuoted<Rest, Kind extends 'unsafe' ? '' : `${Acc}${Character}`, Quote, Kind, Tokens, Step<Steps>>
206
+ : ScanFailure
207
+
208
+ type ReadEscape<
209
+ Source extends string,
210
+ Acc extends string,
211
+ Quote extends "'" | '`',
212
+ Kind extends 'string' | 'name' | 'unsafe',
213
+ Tokens extends TypeTokens,
214
+ Steps extends unknown[],
215
+ > = Source extends ''
216
+ ? ScanFailure
217
+ : Steps['length'] extends InferenceSourceStepLimit
218
+ ? ScanFailure
219
+ : Source extends `${infer Character}${infer Rest}`
220
+ ? Character extends 'u'
221
+ ? ReadUnicodeEscape<Rest, Acc, Quote, Kind, Tokens, Step<Steps>, []>
222
+ : Character extends SimpleEscape
223
+ ? ReadQuoted<
224
+ Rest,
225
+ Kind extends 'unsafe' ? '' : `${Acc}${Escaped<Character>}`,
226
+ Quote,
227
+ Kind,
228
+ Tokens,
229
+ Step<Steps>
230
+ >
231
+ : ScanFailure
232
+ : ScanFailure
233
+
234
+ type ReadUnicodeEscape<
235
+ Source extends string,
236
+ Acc extends string,
237
+ Quote extends "'" | '`',
238
+ Kind extends 'string' | 'name' | 'unsafe',
239
+ Tokens extends TypeTokens,
240
+ Steps extends unknown[],
241
+ Digits extends unknown[],
242
+ > = Digits['length'] extends 4
243
+ ? ReadQuoted<
244
+ Source,
245
+ Kind extends 'string' ? `${Acc}${string}` : '',
246
+ Quote,
247
+ Kind extends 'name' ? 'unsafe' : Kind,
248
+ Tokens,
249
+ Steps
250
+ >
251
+ : Source extends ''
252
+ ? ScanFailure
253
+ : Steps['length'] extends InferenceSourceStepLimit
254
+ ? ScanFailure
255
+ : Source extends `${infer Character}${infer Rest}`
256
+ ? Character extends HexDigit
257
+ ? ReadUnicodeEscape<Rest, Acc, Quote, Kind, Tokens, Step<Steps>, [...Digits, 0]>
258
+ : ScanFailure
259
+ : ScanFailure
260
+
261
+ type Escaped<Character extends SimpleEscape> = Character extends 'f'
262
+ ? '\f'
263
+ : Character extends 'n'
264
+ ? '\n'
265
+ : Character extends 'r'
266
+ ? '\r'
267
+ : Character extends 't'
268
+ ? '\t'
269
+ : Character
270
+
271
+ type ReadTemporal<
272
+ Source extends string,
273
+ Tokens extends TypeTokens,
274
+ Steps extends unknown[],
275
+ > = Source extends `T${infer Rest}`
276
+ ? Steps['length'] extends InferenceSourceStepLimit
277
+ ? ScanFailure
278
+ : ReadClock<Rest, 'T', Tokens, Step<Steps>, 'time'>
279
+ : ReadFixedDigits<Source, '', Steps, [], 4> extends infer Year
280
+ ? Year extends [infer Rest extends string, infer Value extends string, infer NextSteps extends unknown[]]
281
+ ? ReadDateAfterYear<Rest, Value, Tokens, NextSteps>
282
+ : ScanFailure
283
+ : ScanFailure
284
+
285
+ type ReadDateAfterYear<
286
+ Source extends string,
287
+ Value extends string,
288
+ Tokens extends TypeTokens,
289
+ Steps extends unknown[],
290
+ > = Source extends `-${infer Rest}`
291
+ ? HasTwoDigits<Rest> extends true
292
+ ? Steps['length'] extends InferenceSourceStepLimit
293
+ ? ScanFailure
294
+ : ReadFixedDigits<Rest, `${Value}-`, Step<Steps>, [], 2> extends infer Month
295
+ ? Month extends [infer Tail extends string, infer NextValue extends string, infer NextSteps extends unknown[]]
296
+ ? ReadDateAfterMonth<Tail, NextValue, Tokens, NextSteps>
297
+ : ScanFailure
298
+ : ScanFailure
299
+ : FinishDate<Source, Value, Tokens, Steps>
300
+ : FinishDate<Source, Value, Tokens, Steps>
301
+
302
+ type ReadDateAfterMonth<
303
+ Source extends string,
304
+ Value extends string,
305
+ Tokens extends TypeTokens,
306
+ Steps extends unknown[],
307
+ > = Source extends `-${infer Rest}`
308
+ ? HasTwoDigits<Rest> extends true
309
+ ? Steps['length'] extends InferenceSourceStepLimit
310
+ ? ScanFailure
311
+ : ReadFixedDigits<Rest, `${Value}-`, Step<Steps>, [], 2> extends infer Day
312
+ ? Day extends [infer Tail extends string, infer NextValue extends string, infer NextSteps extends unknown[]]
313
+ ? FinishDate<Tail, NextValue, Tokens, NextSteps>
314
+ : ScanFailure
315
+ : ScanFailure
316
+ : FinishDate<Source, Value, Tokens, Steps>
317
+ : FinishDate<Source, Value, Tokens, Steps>
318
+
319
+ type FinishDate<
320
+ Source extends string,
321
+ Value extends string,
322
+ Tokens extends TypeTokens,
323
+ Steps extends unknown[],
324
+ > = Source extends `T${infer Rest}`
325
+ ? Steps['length'] extends InferenceSourceStepLimit
326
+ ? ScanFailure
327
+ : Rest extends `${infer First}${string}`
328
+ ? First extends Digit
329
+ ? ReadClock<Rest, `${Value}T`, Tokens, Step<Steps>, 'dateTime'>
330
+ : EmitTemporal<Rest, ['dateTime', `${Value}T`], Tokens, Step<Steps>>
331
+ : EmitFinal<['dateTime', `${Value}T`], Tokens>
332
+ : EmitTemporal<Source, ['date', Value], Tokens, Steps>
333
+
334
+ type ReadClock<
335
+ Source extends string,
336
+ Value extends string,
337
+ Tokens extends TypeTokens,
338
+ Steps extends unknown[],
339
+ Kind extends 'time' | 'dateTime',
340
+ > =
341
+ ReadFixedDigits<Source, Value, Steps, [], 2> extends infer Hour
342
+ ? Hour extends [infer Rest extends string, infer NextValue extends string, infer NextSteps extends unknown[]]
343
+ ? ReadClockAfterHour<Rest, NextValue, Tokens, NextSteps, Kind>
344
+ : ScanFailure
345
+ : ScanFailure
346
+
347
+ type ReadClockAfterHour<
348
+ Source extends string,
349
+ Value extends string,
350
+ Tokens extends TypeTokens,
351
+ Steps extends unknown[],
352
+ Kind extends 'time' | 'dateTime',
353
+ > = Source extends `:${infer Rest}`
354
+ ? HasTwoDigits<Rest> extends true
355
+ ? Steps['length'] extends InferenceSourceStepLimit
356
+ ? ScanFailure
357
+ : ReadFixedDigits<Rest, `${Value}:`, Step<Steps>, [], 2> extends infer Minute
358
+ ? Minute extends [infer Tail extends string, infer NextValue extends string, infer NextSteps extends unknown[]]
359
+ ? ReadClockAfterMinute<Tail, NextValue, Tokens, NextSteps, Kind>
360
+ : ScanFailure
361
+ : ScanFailure
362
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
363
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
364
+
365
+ type ReadClockAfterMinute<
366
+ Source extends string,
367
+ Value extends string,
368
+ Tokens extends TypeTokens,
369
+ Steps extends unknown[],
370
+ Kind extends 'time' | 'dateTime',
371
+ > = Source extends `:${infer Rest}`
372
+ ? HasTwoDigits<Rest> extends true
373
+ ? Steps['length'] extends InferenceSourceStepLimit
374
+ ? ScanFailure
375
+ : ReadFixedDigits<Rest, `${Value}:`, Step<Steps>, [], 2> extends infer Second
376
+ ? Second extends [infer Tail extends string, infer NextValue extends string, infer NextSteps extends unknown[]]
377
+ ? ReadClockFraction<Tail, NextValue, Tokens, NextSteps, Kind>
378
+ : ScanFailure
379
+ : ScanFailure
380
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
381
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
382
+
383
+ type ReadClockFraction<
384
+ Source extends string,
385
+ Value extends string,
386
+ Tokens extends TypeTokens,
387
+ Steps extends unknown[],
388
+ Kind extends 'time' | 'dateTime',
389
+ > = Source extends `.${infer Rest}`
390
+ ? Rest extends `${infer First}${string}`
391
+ ? First extends Digit
392
+ ? Steps['length'] extends InferenceSourceStepLimit
393
+ ? ScanFailure
394
+ : ReadFractionDigits<Rest, `${Value}.`, Tokens, Step<Steps>, Kind>
395
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
396
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
397
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
398
+
399
+ type ReadFractionDigits<
400
+ Source extends string,
401
+ Value extends string,
402
+ Tokens extends TypeTokens,
403
+ Steps extends unknown[],
404
+ Kind extends 'time' | 'dateTime',
405
+ > = Source extends `${infer Character}${infer Rest}`
406
+ ? Character extends Digit
407
+ ? Steps['length'] extends InferenceSourceStepLimit
408
+ ? ScanFailure
409
+ : ReadFractionDigits<Rest, `${Value}${Character}`, Tokens, Step<Steps>, Kind>
410
+ : FinishClock<Source, Value, Tokens, Steps, Kind>
411
+ : FinishClock<'', Value, Tokens, Steps, Kind>
412
+
413
+ type FinishClock<
414
+ Source extends string,
415
+ Value extends string,
416
+ Tokens extends TypeTokens,
417
+ Steps extends unknown[],
418
+ Kind extends 'time' | 'dateTime',
419
+ > = Kind extends 'time'
420
+ ? EmitTemporal<Source, ['time', Value], Tokens, Steps>
421
+ : Source extends `Z${infer Rest}`
422
+ ? Steps['length'] extends InferenceSourceStepLimit
423
+ ? ScanFailure
424
+ : EmitTemporal<Rest, ['dateTime', `${Value}Z`], Tokens, Step<Steps>>
425
+ : Source extends `${infer Sign}${infer Rest}`
426
+ ? Sign extends '+' | '-'
427
+ ? HasOffsetTail<Rest> extends true
428
+ ? ConsumeCharacters<Source, Steps, [], 6> extends infer Offset
429
+ ? Offset extends [infer Tail extends string, infer NextSteps extends unknown[]]
430
+ ? EmitTemporal<Tail, ['dateTime', Value], Tokens, NextSteps>
431
+ : ScanFailure
432
+ : ScanFailure
433
+ : EmitTemporal<Source, ['dateTime', Value], Tokens, Steps>
434
+ : EmitTemporal<Source, ['dateTime', Value], Tokens, Steps>
435
+ : EmitFinal<['dateTime', Value], Tokens>
436
+
437
+ type ReadFixedDigits<
438
+ Source extends string,
439
+ Value extends string,
440
+ Steps extends unknown[],
441
+ Seen extends unknown[],
442
+ Count extends number,
443
+ > = Seen['length'] extends Count
444
+ ? [Source, Value, Steps]
445
+ : Source extends `${infer Character}${infer Rest}`
446
+ ? Character extends Digit
447
+ ? Steps['length'] extends InferenceSourceStepLimit
448
+ ? ScanFailure
449
+ : ReadFixedDigits<Rest, `${Value}${Character}`, Step<Steps>, [...Seen, 0], Count>
450
+ : ScanFailure
451
+ : ScanFailure
452
+
453
+ type HasTwoDigits<Source extends string> = Source extends `${infer First}${infer Rest}`
454
+ ? First extends Digit
455
+ ? Rest extends `${infer Second}${string}`
456
+ ? Second extends Digit
457
+ ? true
458
+ : false
459
+ : false
460
+ : false
461
+ : false
462
+
463
+ type TwoDigitRest<Source extends string> = Source extends `${infer First}${infer Rest}`
464
+ ? First extends Digit
465
+ ? Rest extends `${infer Second}${infer Tail}`
466
+ ? Second extends Digit
467
+ ? Tail
468
+ : never
469
+ : never
470
+ : never
471
+ : never
472
+
473
+ type HasOffsetTail<Source extends string> =
474
+ TwoDigitRest<Source> extends infer AfterHour
475
+ ? [AfterHour] extends [never]
476
+ ? false
477
+ : AfterHour extends `:${infer AfterColon}`
478
+ ? [TwoDigitRest<AfterColon>] extends [never]
479
+ ? false
480
+ : true
481
+ : false
482
+ : false
483
+
484
+ type ConsumeCharacters<
485
+ Source extends string,
486
+ Steps extends unknown[],
487
+ Seen extends unknown[],
488
+ Count extends number,
489
+ > = Seen['length'] extends Count
490
+ ? [Source, Steps]
491
+ : Source extends `${infer _Character}${infer Rest}`
492
+ ? Steps['length'] extends InferenceSourceStepLimit
493
+ ? ScanFailure
494
+ : ConsumeCharacters<Rest, Step<Steps>, [...Seen, 0], Count>
495
+ : ScanFailure
496
+
497
+ type EmitTemporal<
498
+ Source extends string,
499
+ Token extends LiteralToken,
500
+ Tokens extends TypeTokens,
501
+ Steps extends unknown[],
502
+ > = Source extends '' ? EmitFinal<Token, Tokens> : EmitAndScan<Source, Token, Tokens, Steps>
503
+
504
+ type ReadSpecial<
505
+ Source extends string,
506
+ Acc extends string,
507
+ Tokens extends TypeTokens,
508
+ Steps extends unknown[],
509
+ > = Source extends ''
510
+ ? EmitSpecial<Acc, '', Tokens, Steps>
511
+ : Steps['length'] extends InferenceSourceStepLimit
512
+ ? ScanFailure
513
+ : Source extends `${infer Character}${infer Rest}`
514
+ ? Character extends IdentifierPart
515
+ ? ReadSpecial<Rest, `${Acc}${Character}`, Tokens, Step<Steps>>
516
+ : EmitSpecial<Acc, Source, Tokens, Steps>
517
+ : ScanFailure
518
+
519
+ type EmitSpecial<
520
+ Name extends string,
521
+ Rest extends string,
522
+ Tokens extends TypeTokens,
523
+ Steps extends unknown[],
524
+ > = Name extends 'this' | 'index' | 'total'
525
+ ? Rest extends ''
526
+ ? EmitFinal<['special', Name], Tokens>
527
+ : EmitAndScan<Rest, ['special', Name], Tokens, Steps>
528
+ : ScanFailure
529
+
530
+ type ScanAfterSlash<Source extends string, Tokens extends TypeTokens, Steps extends unknown[]> = Source extends ''
531
+ ? EmitFinal<['symbol', '/'], Tokens>
532
+ : Steps['length'] extends InferenceSourceStepLimit
533
+ ? ScanFailure
534
+ : Source extends `${infer Character}${infer Rest}`
535
+ ? Character extends '/'
536
+ ? SkipLineComment<Rest, Tokens, Step<Steps>>
537
+ : Character extends '*'
538
+ ? SkipBlockComment<Rest, Tokens, Step<Steps>>
539
+ : EmitAndScan<Source, ['symbol', '/'], Tokens, Steps>
540
+ : ScanFailure
541
+
542
+ type SkipLineComment<Source extends string, Tokens extends TypeTokens, Steps extends unknown[]> = Source extends ''
543
+ ? Tokens
544
+ : Steps['length'] extends InferenceSourceStepLimit
545
+ ? ScanFailure
546
+ : Source extends `${infer Character}${infer Rest}`
547
+ ? Character extends '\n'
548
+ ? Scan<Rest, Tokens, Step<Steps>>
549
+ : SkipLineComment<Rest, Tokens, Step<Steps>>
550
+ : ScanFailure
551
+
552
+ type SkipBlockComment<Source extends string, Tokens extends TypeTokens, Steps extends unknown[]> = Source extends ''
553
+ ? ScanFailure
554
+ : Steps['length'] extends InferenceSourceStepLimit
555
+ ? ScanFailure
556
+ : Source extends `${infer Character}${infer Rest}`
557
+ ? Character extends '*'
558
+ ? SkipBlockCommentAfterStar<Rest, Tokens, Step<Steps>>
559
+ : SkipBlockComment<Rest, Tokens, Step<Steps>>
560
+ : ScanFailure
561
+
562
+ type SkipBlockCommentAfterStar<
563
+ Source extends string,
564
+ Tokens extends TypeTokens,
565
+ Steps extends unknown[],
566
+ > = Source extends ''
567
+ ? ScanFailure
568
+ : Steps['length'] extends InferenceSourceStepLimit
569
+ ? ScanFailure
570
+ : Source extends `${infer Character}${infer Rest}`
571
+ ? Character extends '/'
572
+ ? Scan<Rest, Tokens, Step<Steps>>
573
+ : Character extends '*'
574
+ ? SkipBlockCommentAfterStar<Rest, Tokens, Step<Steps>>
575
+ : SkipBlockComment<Rest, Tokens, Step<Steps>>
576
+ : ScanFailure
577
+
578
+ type ScanAfterBang<Source extends string, Tokens extends TypeTokens, Steps extends unknown[]> = Source extends ''
579
+ ? ScanFailure
580
+ : Steps['length'] extends InferenceSourceStepLimit
581
+ ? ScanFailure
582
+ : Source extends `${infer Character}${infer Rest}`
583
+ ? Character extends '=' | '~'
584
+ ? EmitAndScan<Rest, ['symbol', `!${Character}`], Tokens, Step<Steps>>
585
+ : ScanFailure
586
+ : ScanFailure
587
+
588
+ type ScanComparison<
589
+ Source extends string,
590
+ Operator extends '<' | '>',
591
+ Tokens extends TypeTokens,
592
+ Steps extends unknown[],
593
+ > = Source extends ''
594
+ ? EmitFinal<['symbol', Operator], Tokens>
595
+ : Steps['length'] extends InferenceSourceStepLimit
596
+ ? ScanFailure
597
+ : Source extends `${infer Character}${infer Rest}`
598
+ ? Character extends '='
599
+ ? EmitAndScan<Rest, ['symbol', `${Operator}=`], Tokens, Step<Steps>>
600
+ : EmitAndScan<Source, ['symbol', Operator], Tokens, Steps>
601
+ : ScanFailure
602
+
603
+ type EmitAndScan<
604
+ Source extends string,
605
+ Token extends TypeToken,
606
+ Tokens extends TypeTokens,
607
+ Steps extends unknown[],
608
+ > = Tokens['length'] extends InferenceTokenLimit ? ScanFailure : Scan<Source, [...Tokens, Token], Steps>
609
+
610
+ type EmitFinal<Token extends TypeToken, Tokens extends TypeTokens> = Tokens['length'] extends InferenceTokenLimit
611
+ ? ScanFailure
612
+ : [...Tokens, Token]
613
+
614
+ type InferenceState = [types: string, targets: string]
615
+ type VariableBinding = [name: string, value: InferenceState]
616
+ type VariableBindings = VariableBinding[]
617
+ type BindingState = VariableBindings | 'opaque'
618
+ type InferenceEnvironment = [
619
+ bindings: BindingState,
620
+ rootTypes: string,
621
+ rootTargets: string,
622
+ host: object,
623
+ activeHostDeclarations: string,
624
+ ]
625
+ type DefaultEnvironment = [[], 'unknown', never, EmptyContextMap, never]
626
+ type EnvironmentCarrier<Environment extends InferenceEnvironment> = { readonly __environment: Environment }
627
+ type HostValueCarrier<Value> = { readonly __hostValue: Value }
628
+ type OpaqueState = ['opaque', never]
629
+ type UnknownState = ['unknown', never]
630
+ type EmptyState = [never, never]
631
+ type CoreOf<State extends InferenceState> =
632
+ State extends HostValueCarrier<infer Value> ? [State[0], State[1]] & HostValueCarrier<Value> : [State[0], State[1]]
633
+ type HostValueOf<State extends InferenceState> = State extends HostValueCarrier<infer Value> ? Value : never
634
+ type EnvironmentOf<State extends InferenceState> =
635
+ State extends EnvironmentCarrier<infer Environment> ? Environment : DefaultEnvironment
636
+ type BindingsOf<State extends InferenceState> = EnvironmentOf<State>[0]
637
+ type RootTypesOf<State extends InferenceState> = EnvironmentOf<State>[1]
638
+ type RootTargetsOf<State extends InferenceState> = EnvironmentOf<State>[2]
639
+ type HostContextOf<State extends InferenceState> = EnvironmentOf<State>[3]
640
+ type ActiveHostDeclarationsOf<State extends InferenceState> = EnvironmentOf<State>[4]
641
+ type CopyEnvironment<State extends InferenceState, Environment extends InferenceState> =
642
+ Environment extends EnvironmentCarrier<infer Existing> ? State & EnvironmentCarrier<Existing> : State
643
+ type StateKind<State extends InferenceState> = [State[0]] extends [never]
644
+ ? 'empty'
645
+ : State[0] extends 'opaque'
646
+ ? 'opaque'
647
+ : State[0] extends 'unknown'
648
+ ? 'unknown'
649
+ : 'known'
650
+ type IsOpaqueState<State extends InferenceState> = StateKind<State> extends 'opaque' ? true : false
651
+ type IsUnknownState<State extends InferenceState> = StateKind<State> extends 'unknown' ? true : false
652
+ type Values = InferenceState[]
653
+ type BinaryOperatorFrame = ['binary', string, number, InferenceState]
654
+ type UnaryOperatorFrame = ['unary', number]
655
+ type OperatorFrame = BinaryOperatorFrame | UnaryOperatorFrame
656
+ type Operators = OperatorFrame[]
657
+ type GroupFrame = ['group', Values, Operators, InferenceState]
658
+ type IndexFrame = ['index', Values, Operators, InferenceState]
659
+ type CallFrame = ['call', Values, Operators, InferenceState, InferenceState, string, InferenceState[]]
660
+ type DefineVariableFrame = ['define-variable', Values, Operators, InferenceState, InferenceState, string]
661
+ type DelimiterFrame = GroupFrame | IndexFrame | CallFrame | DefineVariableFrame
662
+ type Frames = DelimiterFrame[]
663
+ type ParseMode = 'operand' | 'operator' | 'member'
664
+
665
+ type FastMiss = { readonly fastMiss: true }
666
+
667
+ /** Parse and infer one expression without retaining an intermediate type-level AST. */
668
+ export type InferTypeExpression<
669
+ Expression extends string,
670
+ Input extends string,
671
+ Context extends object = EmptyContextMap,
672
+ > =
673
+ HasHostContext<Context> extends true
674
+ ? InferSlowExpression<Expression, Input, Context>
675
+ : FastExpression<Expression, Input> extends infer Fast
676
+ ? Fast extends InferenceState
677
+ ? PublicResult<Fast>
678
+ : InferSlowExpression<Expression, Input, Context>
679
+ : unknown[]
680
+
681
+ type InferSlowExpression<Expression extends string, Input extends string, Context extends object> =
682
+ Tokenize<Expression> extends infer Tokens
683
+ ? Tokens extends TypeTokens
684
+ ? NeedsTokenPolicy<Expression> extends true
685
+ ? TokenPolicy<Tokens> extends infer Policy
686
+ ? Policy extends 'unsafe'
687
+ ? unknown[]
688
+ : Policy extends 'binding-fallback'
689
+ ? InferParsed<Tokens, Input, Context, false, true>
690
+ : InferParsed<Tokens, Input, Context, Policy extends 'environment' ? true : false>
691
+ : unknown[]
692
+ : InferParsed<Tokens, Input, Context, false>
693
+ : unknown[]
694
+ : unknown[]
695
+
696
+ type HasHostContext<Context extends object> = Context extends {
697
+ env?: infer Env
698
+ vars?: infer Vars
699
+ functions?: infer Functions
700
+ }
701
+ ? keyof Env | keyof Vars | keyof Functions extends never
702
+ ? false
703
+ : true
704
+ : false
705
+
706
+ type NeedsTokenPolicy<Expression extends string> = Expression extends
707
+ `${string}%${string}` | `${string}defineVariable${string}` | `${string}\\u${string}`
708
+ ? true
709
+ : false
710
+
711
+ type InferParsed<
712
+ Tokens extends TypeTokens,
713
+ Input extends string,
714
+ HostContext extends object,
715
+ TrackEnvironment extends boolean,
716
+ BindingFallback extends boolean = false,
717
+ > =
718
+ ParseLoop<
719
+ Tokens,
720
+ [],
721
+ [],
722
+ [],
723
+ InputState<Input, HostContext, TrackEnvironment, BindingFallback>,
724
+ 'operand'
725
+ > extends infer Result
726
+ ? Result extends InferenceState
727
+ ? PublicResult<Result>
728
+ : unknown[]
729
+ : unknown[]
730
+
731
+ /**
732
+ * Model-known chains use a bounded shortcut. Four unrestricted steps may be
733
+ * followed by two zero-argument calls. Anything with general argument syntax,
734
+ * operators, trivia, or unknown names takes the tokenizer and stack parser.
735
+ */
736
+ type FastExpression<Expression extends string, Input extends string> = Expression extends `${infer Root}.${infer Rest}`
737
+ ? Root extends keyof R4Resources & string
738
+ ? FastChain<Rest, [Root, never], []>
739
+ : FastInputChain<Expression, Input>
740
+ : Expression extends keyof R4Resources & string
741
+ ? [Expression, never]
742
+ : FastInputChain<Expression, Input>
743
+
744
+ type FastInputChain<Expression extends string, Input extends string> =
745
+ FastInputState<Input> extends infer Context extends InferenceState
746
+ ? Context[0] extends 'unknown' | 'opaque'
747
+ ? FastMiss
748
+ : FastChain<Expression, Context, []>
749
+ : FastMiss
750
+
751
+ type FastChain<
752
+ Expression extends string,
753
+ State extends InferenceState,
754
+ Steps extends unknown[],
755
+ > = Steps['length'] extends 6
756
+ ? FastMiss
757
+ : Steps['length'] extends 4
758
+ ? FastNoArgumentTail<Expression> extends true
759
+ ? FastChainStep<Expression, State, Steps>
760
+ : FastMiss
761
+ : FastChainStep<Expression, State, Steps>
762
+
763
+ type FastNoArgumentTail<Expression extends string> = Expression extends `${infer First}().${infer Second}()`
764
+ ? First extends CompactFastFunctionName
765
+ ? Second extends CompactFastFunctionName
766
+ ? true
767
+ : false
768
+ : false
769
+ : Expression extends `${infer Only}()`
770
+ ? Only extends CompactFastFunctionName
771
+ ? true
772
+ : false
773
+ : false
774
+
775
+ type FastChainStep<
776
+ Expression extends string,
777
+ State extends InferenceState,
778
+ Steps extends unknown[],
779
+ > = Expression extends `${infer Segment}.${infer Rest}`
780
+ ? FastStep<Segment, State> extends infer Next
781
+ ? Next extends InferenceState
782
+ ? FastChain<Rest, Next, [...Steps, 0]>
783
+ : FastMiss
784
+ : FastMiss
785
+ : FastStep<Expression, State>
786
+
787
+ type FastStep<Segment extends string, State extends InferenceState> = Segment extends `${infer Name}[${infer Index}]`
788
+ ? Index extends Digit
789
+ ? FastNavigate<State, Name>
790
+ : FastMiss
791
+ : Segment extends `${infer Name}()`
792
+ ? Name extends CompactFastFunctionName
793
+ ? FastCallResult<ApplyCall<State, Name, []>>
794
+ : FastMiss
795
+ : Segment extends `${infer Name}(${infer Argument})`
796
+ ? Name extends 'ofType' | 'as'
797
+ ? Argument extends keyof R4TypeOf & string
798
+ ? ShortText<Argument, 32> extends true
799
+ ? FastCallResult<Narrow<State, Argument>>
800
+ : FastMiss
801
+ : FastMiss
802
+ : Name extends 'select'
803
+ ? IdentifierText<Argument> extends true
804
+ ? FastNavigate<State, Argument> extends infer Projection
805
+ ? Projection extends InferenceState
806
+ ? FastCallResult<ApplyCall<State, Name, [Projection]>>
807
+ : FastMiss
808
+ : FastMiss
809
+ : FastMiss
810
+ : Name extends CompactFastFunctionName
811
+ ? FastArgumentShape<Argument> extends true
812
+ ? ShortSafeArgument<Argument> extends true
813
+ ? FastCallResult<ApplyCall<State, Name, [UnknownState]>>
814
+ : FastMiss
815
+ : FastMiss
816
+ : FastMiss
817
+ : FastNavigate<State, Segment>
818
+
819
+ type FastNavigate<State extends InferenceState, Name extends string> =
820
+ Navigate<State, Name> extends infer Result
821
+ ? Result extends InferenceState
822
+ ? Result[0] extends 'unknown' | 'opaque'
823
+ ? FastMiss
824
+ : Result
825
+ : FastMiss
826
+ : FastMiss
827
+
828
+ type FastCallResult<State extends InferenceState> = State[0] extends 'unknown' | 'opaque' ? FastMiss : State
829
+
830
+ type FastArgumentShape<Argument extends string> = Argument extends `'${infer Left}', '${infer Right}'`
831
+ ? PlainStringContent<Left> extends true
832
+ ? PlainStringContent<Right>
833
+ : false
834
+ : Argument extends `'${infer Content}'`
835
+ ? PlainStringContent<Content>
836
+ : Argument extends Digit | `${Digit}, ${Digit}`
837
+ ? true
838
+ : Argument extends `${infer Field} = '${infer Value}'`
839
+ ? IdentifierText<Field> extends true
840
+ ? PlainStringContent<Value>
841
+ : false
842
+ : false
843
+
844
+ type PlainStringContent<Content extends string> = Content extends `${string}'${string}` ? false : true
845
+
846
+ type IdentifierText<Text extends string> =
847
+ ShortText<Text, InferenceTokenLimit> extends true
848
+ ? Text extends `${infer Character}${infer Rest}`
849
+ ? Character extends Letter
850
+ ? IdentifierTail<Rest>
851
+ : false
852
+ : false
853
+ : false
854
+
855
+ type IdentifierTail<Text extends string> = Text extends ''
856
+ ? true
857
+ : Text extends `${infer Character}${infer Rest}`
858
+ ? Character extends IdentifierPart
859
+ ? IdentifierTail<Rest>
860
+ : false
861
+ : false
862
+
863
+ type ShortSafeArgument<
864
+ Argument extends string,
865
+ Seen extends unknown[] = [],
866
+ Quoted extends boolean = false,
867
+ > = Argument extends ''
868
+ ? Quoted extends false
869
+ ? true
870
+ : false
871
+ : Seen['length'] extends 24
872
+ ? false
873
+ : Argument extends `${infer Character}${infer Rest}`
874
+ ? Character extends "'"
875
+ ? ShortSafeArgument<Rest, [...Seen, 0], Quoted extends true ? false : true>
876
+ : Character extends '\\' | '`' | '(' | ')' | '[' | ']' | '{' | '}'
877
+ ? false
878
+ : ShortSafeArgument<Rest, [...Seen, 0], Quoted>
879
+ : false
880
+
881
+ type ShortText<Text extends string, Limit extends number, Seen extends unknown[] = []> = Text extends ''
882
+ ? true
883
+ : Seen['length'] extends Limit
884
+ ? false
885
+ : Text extends `${infer _Character}${infer Rest}`
886
+ ? ShortText<Rest, Limit, [...Seen, 0]>
887
+ : false
888
+
889
+ /** Exposed only for compile-time tokenizer boundary and parity tests. */
890
+ export type TokenizationStatus<Expression extends string> =
891
+ Tokenize<Expression> extends TypeTokens ? Tokenize<Expression>['length'] : 'opaque'
892
+
893
+ /** Exposed only for generated compile-time parity checks. */
894
+ export type FastSlowInferenceParity<Expression extends string, Input extends string> =
895
+ FastExpression<Expression, Input> extends infer Fast
896
+ ? Fast extends InferenceState
897
+ ? EqualTypes<PublicResult<Fast>, InferSlowExpression<Expression, Input, EmptyContextMap>>
898
+ : true
899
+ : true
900
+
901
+ type EqualTypes<Left, Right> =
902
+ (<Type>() => Type extends Left ? 1 : 2) extends <Type>() => Type extends Right ? 1 : 2
903
+ ? (<Type>() => Type extends Right ? 1 : 2) extends <Type>() => Type extends Left ? 1 : 2
904
+ ? true
905
+ : false
906
+ : false
907
+
908
+ type ParseLoop<
909
+ Tokens extends TypeTokens,
910
+ Stack extends Values,
911
+ Ops extends Operators,
912
+ Delimiters extends Frames,
913
+ Context extends InferenceState,
914
+ Mode extends ParseMode,
915
+ > = Mode extends 'operand'
916
+ ? ParseOperand<Tokens, Stack, Ops, Delimiters, Context>
917
+ : Mode extends 'member'
918
+ ? ParseMember<Tokens, Stack, Ops, Delimiters, Context>
919
+ : ParseOperator<Tokens, Stack, Ops, Delimiters, Context>
920
+
921
+ type ParseOperand<
922
+ Tokens extends TypeTokens,
923
+ Stack extends Values,
924
+ Ops extends Operators,
925
+ Delimiters extends Frames,
926
+ Context extends InferenceState,
927
+ > = Tokens extends []
928
+ ? OpaqueState
929
+ : Tokens extends [infer Token extends TypeToken, ...infer Rest extends TypeTokens]
930
+ ? Token extends ['name', infer Name extends string]
931
+ ? Rest extends [['symbol', '('], ...infer AfterOpen extends TypeTokens]
932
+ ? StartCall<AfterOpen, Stack, Ops, Delimiters, Context, Context, Name>
933
+ : ParseLoop<Rest, [...Stack, NameState<Name, Context>], Ops, Delimiters, Context, 'operator'>
934
+ : Token extends ['keyword', infer Word extends string]
935
+ ? Word extends 'true' | 'false'
936
+ ? ParseLoop<
937
+ Rest,
938
+ [...Stack, CopyEnvironment<['System.Boolean', never], Context>],
939
+ Ops,
940
+ Delimiters,
941
+ Context,
942
+ 'operator'
943
+ >
944
+ : Word extends 'as' | 'contains' | 'in' | 'is'
945
+ ? Rest extends [['symbol', '('], ...infer AfterOpen extends TypeTokens]
946
+ ? StartCall<AfterOpen, Stack, Ops, Delimiters, Context, Context, Word>
947
+ : ParseLoop<Rest, [...Stack, NameState<Word, Context>], Ops, Delimiters, Context, 'operator'>
948
+ : OpaqueState
949
+ : Token extends ['number', infer Number extends string]
950
+ ? ParseNumberOperand<Number, Rest, Stack, Ops, Delimiters, Context>
951
+ : Token extends LiteralToken
952
+ ? ParseLoop<
953
+ Rest,
954
+ [...Stack, CopyEnvironment<LiteralState<Token>, Context>],
955
+ Ops,
956
+ Delimiters,
957
+ Context,
958
+ 'operator'
959
+ >
960
+ : Token extends ['special', infer Special extends 'this' | 'index' | 'total']
961
+ ? ParseLoop<Rest, [...Stack, SpecialState<Special, Context>], Ops, Delimiters, Context, 'operator'>
962
+ : Token extends ['symbol', '%']
963
+ ? ParseExternal<Rest, Stack, Ops, Delimiters, Context>
964
+ : Token extends ['symbol', '(']
965
+ ? ParseLoop<Rest, [], [], [['group', Stack, Ops, Context], ...Delimiters], Context, 'operand'>
966
+ : Token extends ['symbol', '{']
967
+ ? Rest extends [['symbol', '}'], ...infer AfterEmpty extends TypeTokens]
968
+ ? ParseLoop<
969
+ AfterEmpty,
970
+ [...Stack, CopyEnvironment<EmptyState, Context>],
971
+ Ops,
972
+ Delimiters,
973
+ Context,
974
+ 'operator'
975
+ >
976
+ : OpaqueState
977
+ : Token extends ['symbol', infer Unary extends '+' | '-']
978
+ ? ParseLoop<
979
+ Rest,
980
+ Stack,
981
+ [...Ops, ['unary', PrefixBindingPower<Unary>]],
982
+ Delimiters,
983
+ Context,
984
+ 'operand'
985
+ >
986
+ : Token extends ['symbol', ')']
987
+ ? CloseEmptyCall<Rest, Stack, Ops, Delimiters>
988
+ : OpaqueState
989
+ : OpaqueState
990
+
991
+ type ParseNumberOperand<
992
+ NumberText extends string,
993
+ Tokens extends TypeTokens,
994
+ Stack extends Values,
995
+ Ops extends Operators,
996
+ Delimiters extends Frames,
997
+ Context extends InferenceState,
998
+ > = NumberText extends `${string}L`
999
+ ? ContinueOperand<Tokens, [...Stack, CopyEnvironment<['System.Long', never], Context>], Ops, Delimiters, Context>
1000
+ : Tokens extends [['string', string], ...infer Rest extends TypeTokens]
1001
+ ? ContinueOperand<Rest, [...Stack, CopyEnvironment<['System.Quantity', never], Context>], Ops, Delimiters, Context>
1002
+ : Tokens extends [['name', infer Unit extends string], ...infer Rest extends TypeTokens]
1003
+ ? Unit extends CompactCalendarUnit
1004
+ ? ContinueOperand<
1005
+ Rest,
1006
+ [...Stack, CopyEnvironment<['System.Quantity', never], Context>],
1007
+ Ops,
1008
+ Delimiters,
1009
+ Context
1010
+ >
1011
+ : ContinueNumber<NumberText, Tokens, Stack, Ops, Delimiters, Context>
1012
+ : ContinueNumber<NumberText, Tokens, Stack, Ops, Delimiters, Context>
1013
+
1014
+ type ContinueNumber<
1015
+ NumberText extends string,
1016
+ Tokens extends TypeTokens,
1017
+ Stack extends Values,
1018
+ Ops extends Operators,
1019
+ Delimiters extends Frames,
1020
+ Context extends InferenceState,
1021
+ > = ContinueOperand<
1022
+ Tokens,
1023
+ [
1024
+ ...Stack,
1025
+ CopyEnvironment<
1026
+ NumberText extends `${string}.${string}` ? ['System.Decimal', never] : ['System.Integer', never],
1027
+ Context
1028
+ >,
1029
+ ],
1030
+ Ops,
1031
+ Delimiters,
1032
+ Context
1033
+ >
1034
+
1035
+ type ContinueOperand<
1036
+ Tokens extends TypeTokens,
1037
+ Stack extends Values,
1038
+ Ops extends Operators,
1039
+ Delimiters extends Frames,
1040
+ Context extends InferenceState,
1041
+ > = ParseLoop<Tokens, Stack, Ops, Delimiters, Context, 'operator'>
1042
+
1043
+ type ParseExternal<
1044
+ Tokens extends TypeTokens,
1045
+ Stack extends Values,
1046
+ Ops extends Operators,
1047
+ Delimiters extends Frames,
1048
+ Context extends InferenceState,
1049
+ > = Tokens extends [infer Token extends TypeToken, ...infer Rest extends TypeTokens]
1050
+ ? Token extends ['name' | 'string', infer Name extends string]
1051
+ ? ParseLoop<Rest, [...Stack, ExternalState<Name, Context>], Ops, Delimiters, Context, 'operator'>
1052
+ : OpaqueState
1053
+ : OpaqueState
1054
+
1055
+ type ParseMember<
1056
+ Tokens extends TypeTokens,
1057
+ Stack extends Values,
1058
+ Ops extends Operators,
1059
+ Delimiters extends Frames,
1060
+ Context extends InferenceState,
1061
+ > = Stack extends [...infer Before extends Values, infer Focus extends InferenceState]
1062
+ ? Tokens extends [infer Token extends TypeToken, ...infer Rest extends TypeTokens]
1063
+ ? Token extends ['name' | 'keyword', infer Name extends string]
1064
+ ? Name extends 'true' | 'false'
1065
+ ? OpaqueState
1066
+ : Rest extends [['symbol', '('], ...infer AfterOpen extends TypeTokens]
1067
+ ? StartCall<AfterOpen, Before, Ops, Delimiters, Context, Focus, Name>
1068
+ : ParseLoop<Rest, [...Before, MemberState<Focus, Name>], Ops, Delimiters, Context, 'operator'>
1069
+ : Token extends ['special', infer Special extends 'this' | 'index' | 'total']
1070
+ ? ParseLoop<Rest, [...Before, SpecialState<Special, Focus>], Ops, Delimiters, Context, 'operator'>
1071
+ : OpaqueState
1072
+ : OpaqueState
1073
+ : OpaqueState
1074
+
1075
+ type ParseOperator<
1076
+ Tokens extends TypeTokens,
1077
+ Stack extends Values,
1078
+ Ops extends Operators,
1079
+ Delimiters extends Frames,
1080
+ Context extends InferenceState,
1081
+ > = Tokens extends []
1082
+ ? Delimiters extends []
1083
+ ? FinishRoot<Stack, Ops>
1084
+ : OpaqueState
1085
+ : Tokens extends [infer Token extends TypeToken, ...infer Rest extends TypeTokens]
1086
+ ? Token extends ['symbol', '.']
1087
+ ? ParseLoop<Rest, Stack, Ops, Delimiters, Context, 'member'>
1088
+ : Token extends ['symbol', '[']
1089
+ ? Stack extends [...Values, InferenceState]
1090
+ ? ParseLoop<Rest, [], [], [['index', Stack, Ops, Context], ...Delimiters], Context, 'operand'>
1091
+ : OpaqueState
1092
+ : Token extends ['symbol', ']' | ')'] | ['symbol', ',']
1093
+ ? CloseDelimited<Token[1], Rest, Stack, Ops, Delimiters, Context>
1094
+ : Token extends ['symbol' | 'keyword', infer Operator extends string]
1095
+ ? Operator extends 'is' | 'as'
1096
+ ? ParseTypeOperator<Operator, Rest, Stack, Ops, Delimiters, Context>
1097
+ : Operator extends keyof CompactInfixParselets
1098
+ ? PushBinary<Operator, ParseletBindingPower<Operator>, Rest, Stack, Ops, Delimiters, Context>
1099
+ : OpaqueState
1100
+ : OpaqueState
1101
+ : OpaqueState
1102
+
1103
+ type StartCall<
1104
+ Tokens extends TypeTokens,
1105
+ OuterStack extends Values,
1106
+ OuterOps extends Operators,
1107
+ Delimiters extends Frames,
1108
+ OuterContext extends InferenceState,
1109
+ Focus extends InferenceState,
1110
+ Name extends string,
1111
+ > = Name extends 'ofType' | 'as'
1112
+ ? StartTypeFunctionCall<Tokens, OuterStack, OuterOps, Delimiters, OuterContext, Focus>
1113
+ : Name extends 'defineVariable'
1114
+ ? StartDefineVariableCall<Tokens, OuterStack, OuterOps, Delimiters, OuterContext, Focus>
1115
+ : ParseLoop<
1116
+ Tokens,
1117
+ [],
1118
+ [],
1119
+ [['call', OuterStack, OuterOps, OuterContext, Focus, Name, []], ...Delimiters],
1120
+ ArgumentContext<Name, 0, Focus, OuterContext>,
1121
+ 'operand'
1122
+ >
1123
+
1124
+ type StartTypeFunctionCall<
1125
+ Tokens extends TypeTokens,
1126
+ OuterStack extends Values,
1127
+ OuterOps extends Operators,
1128
+ Delimiters extends Frames,
1129
+ OuterContext extends InferenceState,
1130
+ Focus extends InferenceState,
1131
+ > =
1132
+ ConsumeTypeName<Tokens> extends [infer TypeName extends string, infer Rest extends TypeTokens]
1133
+ ? Rest extends [['symbol', ')'], ...infer AfterClose extends TypeTokens]
1134
+ ? NormalizeTarget<TypeName> extends infer Target
1135
+ ? [Target] extends [never]
1136
+ ? OpaqueState
1137
+ : Target extends keyof R4TypeOf & string
1138
+ ? ParseLoop<
1139
+ AfterClose,
1140
+ [...OuterStack, Narrow<Focus, Target>],
1141
+ OuterOps,
1142
+ Delimiters,
1143
+ OuterContext,
1144
+ 'operator'
1145
+ >
1146
+ : OpaqueState
1147
+ : OpaqueState
1148
+ : OpaqueState
1149
+ : OpaqueState
1150
+
1151
+ type StartDefineVariableCall<
1152
+ Tokens extends TypeTokens,
1153
+ OuterStack extends Values,
1154
+ OuterOps extends Operators,
1155
+ Delimiters extends Frames,
1156
+ OuterContext extends InferenceState,
1157
+ Focus extends InferenceState,
1158
+ > = Tokens extends [['string', infer Name extends string], ...infer Rest extends TypeTokens]
1159
+ ? Rest extends [['symbol', ')'], ...infer AfterClose extends TypeTokens]
1160
+ ? ParseLoop<
1161
+ AfterClose,
1162
+ [...OuterStack, ApplyDefineVariable<Focus, Name, Focus>],
1163
+ OuterOps,
1164
+ Delimiters,
1165
+ OuterContext,
1166
+ 'operator'
1167
+ >
1168
+ : Rest extends [['symbol', ','], ...infer AfterComma extends TypeTokens]
1169
+ ? ParseLoop<
1170
+ AfterComma,
1171
+ [],
1172
+ [],
1173
+ [['define-variable', OuterStack, OuterOps, OuterContext, Focus, Name], ...Delimiters],
1174
+ ArgumentContext<'defineVariable', 1, Focus, OuterContext>,
1175
+ 'operand'
1176
+ >
1177
+ : OpaqueState
1178
+ : OpaqueState
1179
+
1180
+ type CloseEmptyCall<
1181
+ Tokens extends TypeTokens,
1182
+ Stack extends Values,
1183
+ Ops extends Operators,
1184
+ Delimiters extends Frames,
1185
+ > = Stack extends []
1186
+ ? Ops extends []
1187
+ ? Delimiters extends [
1188
+ [
1189
+ 'call',
1190
+ infer OuterStack extends Values,
1191
+ infer OuterOps extends Operators,
1192
+ infer OuterContext extends InferenceState,
1193
+ infer Focus extends InferenceState,
1194
+ infer Name extends string,
1195
+ infer Args extends InferenceState[],
1196
+ ],
1197
+ ...infer OuterFrames extends Frames,
1198
+ ]
1199
+ ? Args extends []
1200
+ ? ParseLoop<
1201
+ Tokens,
1202
+ [...OuterStack, ApplyCall<Focus, Name, []>],
1203
+ OuterOps,
1204
+ OuterFrames,
1205
+ OuterContext,
1206
+ 'operator'
1207
+ >
1208
+ : OpaqueState
1209
+ : OpaqueState
1210
+ : OpaqueState
1211
+ : OpaqueState
1212
+
1213
+ type CloseDelimited<
1214
+ Delimiter extends string,
1215
+ Tokens extends TypeTokens,
1216
+ Stack extends Values,
1217
+ Ops extends Operators,
1218
+ Delimiters extends Frames,
1219
+ Context extends InferenceState,
1220
+ > = Ops extends [...infer Remaining extends Operators, infer Top extends OperatorFrame]
1221
+ ? ReduceOne<Stack, Top> extends infer Reduced
1222
+ ? Reduced extends Values
1223
+ ? CloseDelimited<Delimiter, Tokens, Reduced, Remaining, Delimiters, Context>
1224
+ : OpaqueState
1225
+ : OpaqueState
1226
+ : Stack extends [infer Result extends InferenceState]
1227
+ ? ResumeDelimiter<Delimiter, Tokens, Result, Delimiters>
1228
+ : OpaqueState
1229
+
1230
+ type ResumeDelimiter<
1231
+ Delimiter extends string,
1232
+ Tokens extends TypeTokens,
1233
+ Result extends InferenceState,
1234
+ Delimiters extends Frames,
1235
+ > = Delimiters extends [infer Frame extends DelimiterFrame, ...infer OuterFrames extends Frames]
1236
+ ? Frame extends [
1237
+ 'group',
1238
+ infer OuterStack extends Values,
1239
+ infer OuterOps extends Operators,
1240
+ infer OuterContext extends InferenceState,
1241
+ ]
1242
+ ? Delimiter extends ')'
1243
+ ? ParseLoop<Tokens, [...OuterStack, Result], OuterOps, OuterFrames, OuterContext, 'operator'>
1244
+ : OpaqueState
1245
+ : Frame extends [
1246
+ 'index',
1247
+ infer OuterStack extends Values,
1248
+ infer OuterOps extends Operators,
1249
+ infer OuterContext extends InferenceState,
1250
+ ]
1251
+ ? Delimiter extends ']'
1252
+ ? ParseLoop<Tokens, IndexResult<OuterStack, Result>, OuterOps, OuterFrames, OuterContext, 'operator'>
1253
+ : OpaqueState
1254
+ : Frame extends [
1255
+ 'call',
1256
+ infer OuterStack extends Values,
1257
+ infer OuterOps extends Operators,
1258
+ infer OuterContext extends InferenceState,
1259
+ infer Focus extends InferenceState,
1260
+ infer Name extends string,
1261
+ infer Args extends InferenceState[],
1262
+ ]
1263
+ ? Delimiter extends ','
1264
+ ? ParseLoop<
1265
+ Tokens,
1266
+ [],
1267
+ [],
1268
+ [['call', OuterStack, OuterOps, OuterContext, Focus, Name, [...Args, Result]], ...OuterFrames],
1269
+ ArgumentContext<Name, [...Args, Result]['length'], Focus, OuterContext>,
1270
+ 'operand'
1271
+ >
1272
+ : Delimiter extends ')'
1273
+ ? ParseLoop<
1274
+ Tokens,
1275
+ [...OuterStack, ApplyCall<Focus, Name, [...Args, Result]>],
1276
+ OuterOps,
1277
+ OuterFrames,
1278
+ OuterContext,
1279
+ 'operator'
1280
+ >
1281
+ : OpaqueState
1282
+ : Frame extends [
1283
+ 'define-variable',
1284
+ infer OuterStack extends Values,
1285
+ infer OuterOps extends Operators,
1286
+ infer OuterContext extends InferenceState,
1287
+ infer Focus extends InferenceState,
1288
+ infer Name extends string,
1289
+ ]
1290
+ ? Delimiter extends ')'
1291
+ ? ParseLoop<
1292
+ Tokens,
1293
+ [...OuterStack, ApplyDefineVariable<Focus, Name, Result>],
1294
+ OuterOps,
1295
+ OuterFrames,
1296
+ OuterContext,
1297
+ 'operator'
1298
+ >
1299
+ : OpaqueState
1300
+ : OpaqueState
1301
+ : OpaqueState
1302
+
1303
+ type PushBinary<
1304
+ Operator extends string,
1305
+ BindingPower extends number,
1306
+ Tokens extends TypeTokens,
1307
+ Stack extends Values,
1308
+ Ops extends Operators,
1309
+ Delimiters extends Frames,
1310
+ Context extends InferenceState,
1311
+ > = Ops extends [...infer Remaining extends Operators, infer Top extends OperatorFrame]
1312
+ ? GreaterThanOrEqual<OperatorBindingPower<Top>, BindingPower> extends true
1313
+ ? ReduceOne<Stack, Top> extends infer Reduced
1314
+ ? Reduced extends Values
1315
+ ? PushBinary<Operator, BindingPower, Tokens, Reduced, Remaining, Delimiters, Context>
1316
+ : OpaqueState
1317
+ : OpaqueState
1318
+ : ParseLoop<Tokens, Stack, [...Ops, ['binary', Operator, BindingPower, Context]], Delimiters, Context, 'operand'>
1319
+ : ParseLoop<Tokens, Stack, [['binary', Operator, BindingPower, Context]], Delimiters, Context, 'operand'>
1320
+
1321
+ type FinishRoot<Stack extends Values, Ops extends Operators> = Ops extends [
1322
+ ...infer Remaining extends Operators,
1323
+ infer Top extends OperatorFrame,
1324
+ ]
1325
+ ? ReduceOne<Stack, Top> extends infer Reduced
1326
+ ? Reduced extends Values
1327
+ ? FinishRoot<Reduced, Remaining>
1328
+ : OpaqueState
1329
+ : OpaqueState
1330
+ : Stack extends [infer Result extends InferenceState]
1331
+ ? Result
1332
+ : OpaqueState
1333
+
1334
+ type ReduceOne<Stack extends Values, Operator extends OperatorFrame> = Operator extends UnaryOperatorFrame
1335
+ ? Stack extends [...infer Before extends Values, infer Operand extends InferenceState]
1336
+ ? [...Before, ApplyUnary<Operand>]
1337
+ : OpaqueState
1338
+ : Operator extends ['binary', infer Name extends string, number, infer Environment extends InferenceState]
1339
+ ? Stack extends [
1340
+ ...infer Before extends Values,
1341
+ infer Left extends InferenceState,
1342
+ infer Right extends InferenceState,
1343
+ ]
1344
+ ? [...Before, ApplyBinary<Name, Left, Right, Environment>]
1345
+ : OpaqueState
1346
+ : OpaqueState
1347
+
1348
+ type ApplyUnary<Operand extends InferenceState> =
1349
+ StateKind<Operand> extends 'empty'
1350
+ ? Operand
1351
+ : IsOpaqueState<Operand> extends true
1352
+ ? CopyEnvironment<OpaqueState, Operand>
1353
+ : IsUnknownState<Operand> extends true
1354
+ ? CopyEnvironment<UnknownState, Operand>
1355
+ : [Operand[0]] extends [NumericType | QuantityType]
1356
+ ? Operand
1357
+ : CopyEnvironment<OpaqueState, Operand>
1358
+
1359
+ type ApplyBinary<
1360
+ Name extends string,
1361
+ Left extends InferenceState,
1362
+ Right extends InferenceState,
1363
+ Environment extends InferenceState,
1364
+ > = Name extends keyof CompactOperatorRules
1365
+ ? CopyEnvironment<ApplyOperatorRule<CompactOperatorRules[Name], Name, Left, Right>, Environment>
1366
+ : CopyEnvironment<OpaqueState, Environment>
1367
+
1368
+ type ApplyOperatorRule<Rule, Name extends string, Left extends InferenceState, Right extends InferenceState> =
1369
+ IsOpaqueState<Left> extends true
1370
+ ? OpaqueState
1371
+ : IsOpaqueState<Right> extends true
1372
+ ? OpaqueState
1373
+ : Rule extends readonly ['fixed', infer Type extends string]
1374
+ ? [LocalTypeName<Type>, never]
1375
+ : Rule extends readonly ['arithmetic']
1376
+ ? ArithmeticState<Name, Left, Right>
1377
+ : Rule extends readonly ['union']
1378
+ ? UnionState<Left, Right>
1379
+ : OpaqueState
1380
+
1381
+ type ArithmeticState<
1382
+ Operator extends string,
1383
+ Left extends InferenceState,
1384
+ Right extends InferenceState,
1385
+ > = Operator extends '*' | '/'
1386
+ ? IsQuantityState<Left> extends true
1387
+ ? ['System.Quantity', never]
1388
+ : IsQuantityState<Right> extends true
1389
+ ? ['System.Quantity', never]
1390
+ : Operator extends '/'
1391
+ ? ['System.Decimal', never]
1392
+ : ArithmeticInput<Left, Right>
1393
+ : ArithmeticInput<Left, Right>
1394
+
1395
+ type ArithmeticInput<Left extends InferenceState, Right extends InferenceState> =
1396
+ StateKind<Left> extends 'empty'
1397
+ ? Left
1398
+ : IsUnknownState<Left> extends true
1399
+ ? IsUnknownState<Right> extends true
1400
+ ? UnknownState
1401
+ : Right
1402
+ : Left
1403
+
1404
+ type IsQuantityState<State extends InferenceState> =
1405
+ StateKind<State> extends 'empty' ? false : [State[0]] extends [QuantityType] ? true : false
1406
+
1407
+ type ParseTypeOperator<
1408
+ Operator extends 'is' | 'as',
1409
+ Tokens extends TypeTokens,
1410
+ Stack extends Values,
1411
+ Ops extends Operators,
1412
+ Delimiters extends Frames,
1413
+ Context extends InferenceState,
1414
+ > =
1415
+ ConsumeTypeName<Tokens> extends [infer TypeName extends string, infer Rest extends TypeTokens]
1416
+ ? NormalizeTarget<TypeName> extends infer Target
1417
+ ? [Target] extends [never]
1418
+ ? OpaqueState
1419
+ : Target extends keyof R4TypeOf & string
1420
+ ? ApplyTypeWithPrecedence<Operator, Target, Rest, Stack, Ops, Delimiters, Context>
1421
+ : OpaqueState
1422
+ : OpaqueState
1423
+ : OpaqueState
1424
+
1425
+ type ApplyTypeWithPrecedence<
1426
+ Operator extends 'is' | 'as',
1427
+ Target extends keyof R4TypeOf & string,
1428
+ Tokens extends TypeTokens,
1429
+ Stack extends Values,
1430
+ Ops extends Operators,
1431
+ Delimiters extends Frames,
1432
+ Context extends InferenceState,
1433
+ > = Ops extends [...infer Remaining extends Operators, infer Top extends OperatorFrame]
1434
+ ? GreaterThanOrEqual<OperatorBindingPower<Top>, ParseletBindingPower<Operator>> extends true
1435
+ ? ReduceOne<Stack, Top> extends infer Reduced
1436
+ ? Reduced extends Values
1437
+ ? ApplyTypeWithPrecedence<Operator, Target, Tokens, Reduced, Remaining, Delimiters, Context>
1438
+ : OpaqueState
1439
+ : OpaqueState
1440
+ : ApplyTypeResult<Operator, Target, Tokens, Stack, Ops, Delimiters, Context>
1441
+ : ApplyTypeResult<Operator, Target, Tokens, Stack, Ops, Delimiters, Context>
1442
+
1443
+ type ApplyTypeResult<
1444
+ Operator extends 'is' | 'as',
1445
+ Target extends keyof R4TypeOf & string,
1446
+ Tokens extends TypeTokens,
1447
+ Stack extends Values,
1448
+ Ops extends Operators,
1449
+ Delimiters extends Frames,
1450
+ Context extends InferenceState,
1451
+ > = Stack extends [...infer Before extends Values, infer Operand extends InferenceState]
1452
+ ? ParseLoop<
1453
+ Tokens,
1454
+ [...Before, ApplyTypeOperator<CompactTypeOperatorRules[Operator], Operand, Target>],
1455
+ Ops,
1456
+ Delimiters,
1457
+ Context,
1458
+ 'operator'
1459
+ >
1460
+ : OpaqueState
1461
+
1462
+ type ApplyTypeOperator<Rule, Operand extends InferenceState, Target extends string> =
1463
+ IsOpaqueState<Operand> extends true
1464
+ ? CopyEnvironment<OpaqueState, Operand>
1465
+ : Rule extends readonly ['fixed', infer Type extends string]
1466
+ ? CopyEnvironment<[LocalTypeName<Type>, never], Operand>
1467
+ : Rule extends readonly ['narrow']
1468
+ ? Narrow<Operand, Target>
1469
+ : CopyEnvironment<OpaqueState, Operand>
1470
+
1471
+ type ConsumeTypeName<Tokens extends TypeTokens> = Tokens extends [
1472
+ ['name', infer First extends string],
1473
+ ...infer Rest extends TypeTokens,
1474
+ ]
1475
+ ? ConsumeTypeNameTail<Rest, First>
1476
+ : never
1477
+
1478
+ type ConsumeTypeNameTail<Tokens extends TypeTokens, Acc extends string> = Tokens extends [
1479
+ ['symbol', '.'],
1480
+ ['name', infer Part extends string],
1481
+ ...infer Rest extends TypeTokens,
1482
+ ]
1483
+ ? ConsumeTypeNameTail<Rest, `${Acc}.${Part}`>
1484
+ : [Acc, Tokens]
1485
+
1486
+ type NormalizeTarget<Target extends string> = Target extends `FHIR.${infer Local}`
1487
+ ? Local extends keyof R4TypeOf
1488
+ ? Local
1489
+ : never
1490
+ : Target extends keyof R4TypeOf
1491
+ ? Target
1492
+ : `System.${Target}` extends keyof R4TypeOf
1493
+ ? `System.${Target}`
1494
+ : never
1495
+
1496
+ type ApplyCall<Input extends InferenceState, Name extends string, Args extends InferenceState[]> =
1497
+ IsOpaqueState<Input> extends true
1498
+ ? CopyEnvironment<OpaqueState, Input>
1499
+ : Name extends keyof CompactFunctionRules
1500
+ ? ApplyResultRule<CompactFunctionRules[Name], Input, Args>
1501
+ : HostFunctionState<Input, Name>
1502
+
1503
+ type HostFunctionState<Input extends InferenceState, Name extends string> =
1504
+ LookupContextMap<FunctionsOf<HostContextOf<Input>>, Name> extends infer Declaration
1505
+ ? [Declaration] extends [never]
1506
+ ? CopyEnvironment<OpaqueState, Input>
1507
+ : Name extends ActiveHostDeclarationsOf<Input>
1508
+ ? CopyEnvironment<UnknownState, Input>
1509
+ : Declaration extends { readonly overloads: infer Overloads extends readonly unknown[] }
1510
+ ? InferHostOverloads<Overloads, Input, Name>
1511
+ : InferHostDeclaration<Declaration, Input, Name>
1512
+ : CopyEnvironment<OpaqueState, Input>
1513
+
1514
+ type InferHostOverloads<Overloads extends readonly unknown[], Input extends InferenceState, Name extends string> =
1515
+ MatchingHostOverloads<Overloads, Input> extends infer Matching extends readonly unknown[]
1516
+ ? Matching extends readonly [infer Only]
1517
+ ? InferHostDeclaration<Only, Input, Name>
1518
+ : Matching extends readonly []
1519
+ ? CopyEnvironment<UnknownState, Input>
1520
+ : InferAmbiguousHostOverloads<Matching, Input>
1521
+ : CopyEnvironment<UnknownState, Input>
1522
+
1523
+ type MatchingHostOverloads<
1524
+ Overloads extends readonly unknown[],
1525
+ Input extends InferenceState,
1526
+ Matching extends readonly unknown[] = [],
1527
+ > = Overloads extends readonly [infer Head, ...infer Tail]
1528
+ ? HostDeclarationAccepts<Head, Input> extends true
1529
+ ? MatchingHostOverloads<Tail, Input, [...Matching, Head]>
1530
+ : MatchingHostOverloads<Tail, Input, Matching>
1531
+ : Matching
1532
+
1533
+ type InferAmbiguousHostOverloads<
1534
+ Declarations extends readonly unknown[],
1535
+ Input extends InferenceState,
1536
+ Result extends InferenceState = EmptyState,
1537
+ > = Declarations extends readonly [infer Head, ...infer Tail]
1538
+ ? InferAmbiguousHostOverloads<Tail, Input, MergeStates<Result, AmbiguousHostResult<Head, Input>>>
1539
+ : StateKind<Result> extends 'empty'
1540
+ ? CopyEnvironment<UnknownState, Input>
1541
+ : CopyEnvironment<Result, Input>
1542
+
1543
+ type AmbiguousHostResult<Declaration, Input extends InferenceState> = Declaration extends {
1544
+ readonly signature?: infer Signature
1545
+ }
1546
+ ? Signature extends { readonly result?: infer Result }
1547
+ ? Result extends { readonly types?: infer Types }
1548
+ ? Types extends readonly string[]
1549
+ ? HostSignatureResult<Types[number], Input>
1550
+ : CopyEnvironment<UnknownState, Input>
1551
+ : CopyEnvironment<UnknownState, Input>
1552
+ : CopyEnvironment<UnknownState, Input>
1553
+ : CopyEnvironment<UnknownState, Input>
1554
+
1555
+ type HostDeclarationAccepts<Declaration, Input extends InferenceState> = Declaration extends {
1556
+ readonly signature?: infer Signature
1557
+ }
1558
+ ? Signature extends { readonly input?: infer InputSpec }
1559
+ ? InputSpec extends { readonly types?: infer Declared }
1560
+ ? Declared extends readonly string[]
1561
+ ? IsUnknownState<Input> extends true
1562
+ ? true
1563
+ : TypesOverlap<Input[0], Declared[number]>
1564
+ : true
1565
+ : true
1566
+ : true
1567
+ : true
1568
+
1569
+ type TypesOverlap<Left extends string, Right extends string> = true extends (
1570
+ Left extends Left
1571
+ ? Right extends Right
1572
+ ? IsSubtype<LocalTypeName<Left>, LocalTypeName<Right>> extends true
1573
+ ? true
1574
+ : IsSubtype<LocalTypeName<Right>, LocalTypeName<Left>>
1575
+ : never
1576
+ : never
1577
+ )
1578
+ ? true
1579
+ : false
1580
+
1581
+ type InferHostDeclaration<Declaration, Input extends InferenceState, Name extends string> = Declaration extends {
1582
+ readonly criteria?: true
1583
+ }
1584
+ ? CopyEnvironment<['System.Boolean', never], Input>
1585
+ : Declaration extends { readonly signature?: infer Signature }
1586
+ ? Signature extends { readonly result?: infer Result }
1587
+ ? Result extends { readonly types?: infer Types }
1588
+ ? Types extends readonly string[]
1589
+ ? HostSignatureResult<Types[number], Input>
1590
+ : InferHostBody<Declaration, Input, Name>
1591
+ : InferHostBody<Declaration, Input, Name>
1592
+ : InferHostBody<Declaration, Input, Name>
1593
+ : InferHostBody<Declaration, Input, Name>
1594
+
1595
+ type HostSignatureResult<Types extends string, Input extends InferenceState> = [Types] extends [never]
1596
+ ? CopyEnvironment<EmptyState, Input>
1597
+ : WideTypeName<Types> extends true
1598
+ ? CopyEnvironment<UnknownState, Input>
1599
+ : LocalTypeName<Types> extends keyof R4TypeOf
1600
+ ? CopyEnvironment<[LocalTypeName<Types>, never], Input>
1601
+ : CopyEnvironment<UnknownState, Input>
1602
+
1603
+ type InferHostBody<Declaration, Input extends InferenceState, Name extends string> =
1604
+ HostBodySource<Declaration> extends infer Body
1605
+ ? Body extends string
1606
+ ? string extends Body
1607
+ ? CopyEnvironment<UnknownState, Input>
1608
+ : InferEmbeddedState<
1609
+ Body,
1610
+ WithHostCallEnvironment<Input, Declaration, ActiveHostDeclarationsOf<Input> | Name>
1611
+ > extends infer Result
1612
+ ? Result extends InferenceState
1613
+ ? CopyEnvironment<Result, Input>
1614
+ : CopyEnvironment<UnknownState, Input>
1615
+ : CopyEnvironment<UnknownState, Input>
1616
+ : CopyEnvironment<UnknownState, Input>
1617
+ : CopyEnvironment<UnknownState, Input>
1618
+
1619
+ type HostBodySource<Declaration> = Declaration extends { readonly expression: infer Body }
1620
+ ? Body extends string
1621
+ ? Body
1622
+ : Body extends { readonly source: infer Source extends string }
1623
+ ? Source
1624
+ : never
1625
+ : never
1626
+
1627
+ type WithHostCallEnvironment<Input extends InferenceState, Declaration, Active extends string> = CoreOf<Input> &
1628
+ EnvironmentCarrier<
1629
+ [
1630
+ BindingsOf<Input>,
1631
+ RootTypesOf<Input>,
1632
+ RootTargetsOf<Input>,
1633
+ OverlayFunctionContext<HostContextOf<Input>, Declaration>,
1634
+ Active,
1635
+ ]
1636
+ >
1637
+
1638
+ type OverlayFunctionContext<Context extends object, Declaration> = {
1639
+ env: MergeContextMaps<
1640
+ EnvOf<Context>,
1641
+ InferredHostValueDeclarations<
1642
+ Declaration extends { readonly env?: infer Local } ? Local : EmptyContextMap,
1643
+ Declaration extends { readonly envTypes?: infer Local } ? Local : EmptyContextMap
1644
+ >
1645
+ >
1646
+ vars: VarsOf<Context>
1647
+ functions: FunctionsOf<Context>
1648
+ }
1649
+
1650
+ type ApplyDefineVariable<
1651
+ Input extends InferenceState,
1652
+ Name extends string,
1653
+ Value extends InferenceState,
1654
+ > = BindVariable<ApplyResultRule<CompactFunctionRules['defineVariable'], Input, []>, Name, Value>
1655
+
1656
+ type ApplyResultRule<Rule, Input extends InferenceState, Args extends InferenceState[]> = Rule extends readonly [
1657
+ 'fixed',
1658
+ infer Type extends string,
1659
+ ]
1660
+ ? CopyEnvironment<[LocalTypeName<Type>, never], Input>
1661
+ : Rule extends readonly ['input']
1662
+ ? Input
1663
+ : Rule extends readonly ['argument', infer Index extends number]
1664
+ ? ArgumentState<Args, Index> extends infer Argument extends InferenceState
1665
+ ? CopyEnvironment<Argument, Input>
1666
+ : CopyEnvironment<UnknownState, Input>
1667
+ : Rule extends readonly ['union', infer Sources extends 'input' | number]
1668
+ ? CombineRuleSources<Sources, Input, Args> extends infer Combined extends InferenceState
1669
+ ? CopyEnvironment<Combined, Input>
1670
+ : CopyEnvironment<UnknownState, Input>
1671
+ : Rule extends readonly ['arguments-union']
1672
+ ? CopyEnvironment<UnionArguments<Args>, Input>
1673
+ : Rule extends readonly ['reference-targets']
1674
+ ? [Input[1]] extends [never]
1675
+ ? CopyEnvironment<UnknownState, Input>
1676
+ : CopyEnvironment<[Input[1], never], Input>
1677
+ : Rule extends readonly ['unknown']
1678
+ ? CopyEnvironment<UnknownState, Input>
1679
+ : CopyEnvironment<OpaqueState, Input>
1680
+
1681
+ type ArgumentState<Args extends InferenceState[], Index extends number> = Args[Index] extends InferenceState
1682
+ ? Args[Index]
1683
+ : UnknownState
1684
+
1685
+ type CombineRuleSources<
1686
+ Sources extends 'input' | number,
1687
+ Input extends InferenceState,
1688
+ Args extends InferenceState[],
1689
+ > = CollapseStateUnion<
1690
+ Sources extends Sources
1691
+ ? Sources extends 'input'
1692
+ ? Input
1693
+ : SourceArgumentState<Args, Extract<Sources, number>>
1694
+ : never
1695
+ >
1696
+
1697
+ type SourceArgumentState<Args extends InferenceState[], Index extends number> = Args[Index] extends InferenceState
1698
+ ? Args[Index]
1699
+ : EmptyState
1700
+
1701
+ type CollapseStateUnion<States extends InferenceState> = 'opaque' extends States[0]
1702
+ ? OpaqueState
1703
+ : 'unknown' extends States[0]
1704
+ ? UnknownState
1705
+ : CopyEnvironment<[States[0], never], States>
1706
+
1707
+ type UnionArguments<Args extends InferenceState[], Accumulator extends InferenceState = EmptyState> = Args extends [
1708
+ infer Head extends InferenceState,
1709
+ ...infer Tail extends InferenceState[],
1710
+ ]
1711
+ ? UnionArguments<Tail, MergeStates<Accumulator, Head>>
1712
+ : Accumulator
1713
+
1714
+ type MergeStates<Left extends InferenceState, Right extends InferenceState> =
1715
+ StateKind<Left> extends 'empty'
1716
+ ? Right
1717
+ : StateKind<Right> extends 'empty'
1718
+ ? Left
1719
+ : IsOpaqueState<Left> extends true
1720
+ ? OpaqueState
1721
+ : IsOpaqueState<Right> extends true
1722
+ ? OpaqueState
1723
+ : IsUnknownState<Left> extends true
1724
+ ? UnknownState
1725
+ : IsUnknownState<Right> extends true
1726
+ ? UnknownState
1727
+ : CopyEnvironment<[Left[0] | Right[0], CommonTargets<Left, Right>], Left>
1728
+
1729
+ type CommonTargets<Left extends InferenceState, Right extends InferenceState> = [Left[1]] extends [never]
1730
+ ? never
1731
+ : [Right[1]] extends [never]
1732
+ ? never
1733
+ : Left[1] | Right[1]
1734
+
1735
+ type BindVariable<Result extends InferenceState, Name extends string, Value extends InferenceState> =
1736
+ BindingsOf<Result> extends 'opaque'
1737
+ ? Result
1738
+ : Name extends 'context' | 'resource' | 'rootResource' | 'ucum' | 'sct' | 'loinc'
1739
+ ? CopyEnvironment<OpaqueState, Result>
1740
+ : LookupBinding<BindingsOf<Result>, Name> extends never
1741
+ ? CoreOf<Result> &
1742
+ EnvironmentCarrier<
1743
+ [
1744
+ [...BindingsOf<Result>, [Name, CoreOf<Value>]],
1745
+ RootTypesOf<Result>,
1746
+ RootTargetsOf<Result>,
1747
+ HostContextOf<Result>,
1748
+ ActiveHostDeclarationsOf<Result>,
1749
+ ]
1750
+ >
1751
+ : CopyEnvironment<OpaqueState, Result>
1752
+
1753
+ type LookupBinding<Bindings extends BindingState, Name extends string> = Bindings extends VariableBindings
1754
+ ? Bindings extends [...infer Before extends VariableBindings, infer LastBinding extends VariableBinding]
1755
+ ? LastBinding[0] extends Name
1756
+ ? LastBinding[1]
1757
+ : LookupBinding<Before, Name>
1758
+ : never
1759
+ : never
1760
+
1761
+ type EnvOf<Context extends object> = Context extends { readonly env?: infer Env } ? Env : EmptyContextMap
1762
+ type VarsOf<Context extends object> = Context extends { readonly vars?: infer Vars } ? Vars : EmptyContextMap
1763
+ type FunctionsOf<Context extends object> = Context extends { readonly functions?: infer Functions }
1764
+ ? Functions
1765
+ : EmptyContextMap
1766
+
1767
+ type InferEmbeddedState<Expression extends string, Initial extends InferenceState> =
1768
+ Tokenize<Expression> extends infer Tokens
1769
+ ? Tokens extends TypeTokens
1770
+ ? TokenPolicy<Tokens> extends infer Policy
1771
+ ? Policy extends 'unsafe'
1772
+ ? CopyEnvironment<UnknownState, Initial>
1773
+ : ParseLoop<
1774
+ Tokens,
1775
+ [],
1776
+ [],
1777
+ [],
1778
+ Policy extends 'binding-fallback' ? WithOpaqueBindings<Initial> : Initial,
1779
+ 'operand'
1780
+ > extends infer Result
1781
+ ? Result extends InferenceState
1782
+ ? Result
1783
+ : CopyEnvironment<UnknownState, Initial>
1784
+ : CopyEnvironment<UnknownState, Initial>
1785
+ : CopyEnvironment<UnknownState, Initial>
1786
+ : CopyEnvironment<UnknownState, Initial>
1787
+ : CopyEnvironment<UnknownState, Initial>
1788
+
1789
+ type WithOpaqueBindings<State extends InferenceState> = CoreOf<State> &
1790
+ EnvironmentCarrier<
1791
+ ['opaque', RootTypesOf<State>, RootTargetsOf<State>, HostContextOf<State>, ActiveHostDeclarationsOf<State>]
1792
+ >
1793
+
1794
+ type NameState<Name extends string, Context extends InferenceState> = Name extends keyof R4Resources & string
1795
+ ? CopyEnvironment<[Name, never], Context>
1796
+ : Navigate<Context, Name>
1797
+
1798
+ type SpecialState<Name extends 'this' | 'index' | 'total', Context extends InferenceState> = Name extends 'this'
1799
+ ? Context
1800
+ : Name extends 'index'
1801
+ ? CopyEnvironment<['System.Integer', never], Context>
1802
+ : CopyEnvironment<UnknownState, Context>
1803
+
1804
+ type ExternalState<Name extends string, Context extends InferenceState> =
1805
+ LookupBinding<BindingsOf<Context>, Name> extends infer Found
1806
+ ? [Found] extends [never]
1807
+ ? Name extends 'context' | 'resource' | 'rootResource'
1808
+ ? CopyEnvironment<[RootTypesOf<Context>, RootTargetsOf<Context>], Context>
1809
+ : Name extends 'ucum' | 'sct' | 'loinc' | `vs-${string}` | `ext-${string}`
1810
+ ? CopyEnvironment<['System.String', never], Context>
1811
+ : HostVariableState<Name, Context>
1812
+ : Found extends InferenceState
1813
+ ? CopyEnvironment<Found, Context>
1814
+ : CopyEnvironment<UnknownState, Context>
1815
+ : CopyEnvironment<UnknownState, Context>
1816
+
1817
+ type HostVariableState<Name extends string, Context extends InferenceState> =
1818
+ LookupContextMap<EnvOf<HostContextOf<Context>>, Name> extends infer EnvDeclaration
1819
+ ? LookupContextMap<VarsOf<HostContextOf<Context>>, Name> extends infer VarDeclaration
1820
+ ? [EnvDeclaration] extends [never]
1821
+ ? [VarDeclaration] extends [never]
1822
+ ? CopyEnvironment<UnknownState, Context>
1823
+ : DeclaredVariableState<VarDeclaration, Name, Context>
1824
+ : [VarDeclaration] extends [never]
1825
+ ? DeclaredTypeState<EnvDeclaration, Context>
1826
+ : CopyEnvironment<OpaqueState, Context>
1827
+ : CopyEnvironment<UnknownState, Context>
1828
+ : CopyEnvironment<UnknownState, Context>
1829
+
1830
+ type DeclaredVariableState<Declaration, Name extends string, Context extends InferenceState> = Declaration extends {
1831
+ readonly __expression: infer Expression extends string
1832
+ }
1833
+ ? `var:${Name}` extends ActiveHostDeclarationsOf<Context>
1834
+ ? CopyEnvironment<UnknownState, Context>
1835
+ : string extends Expression
1836
+ ? CopyEnvironment<UnknownState, Context>
1837
+ : InferEmbeddedState<Expression, VariableRootState<Context, ActiveHostDeclarationsOf<Context> | `var:${Name}`>>
1838
+ : DeclaredTypeState<Declaration, Context>
1839
+
1840
+ type DeclaredOnlyVars<Map> =
1841
+ Map extends Readonly<Record<PropertyKey, unknown>>
1842
+ ? {
1843
+ readonly [Name in keyof Map as Map[Name] extends { readonly __expression: string } ? never : Name]: Map[Name]
1844
+ }
1845
+ : EmptyContextMap
1846
+
1847
+ type VariableBodyHostContext<Context extends InferenceState> = {
1848
+ env: EnvOf<HostContextOf<Context>>
1849
+ vars: DeclaredOnlyVars<VarsOf<HostContextOf<Context>>>
1850
+ functions: FunctionsOf<HostContextOf<Context>>
1851
+ }
1852
+
1853
+ type VariableRootState<Context extends InferenceState, Active extends string> = [RootTypesOf<Context>] extends [never]
1854
+ ? EmptyState &
1855
+ EnvironmentCarrier<
1856
+ [BindingsOf<Context>, RootTypesOf<Context>, RootTargetsOf<Context>, VariableBodyHostContext<Context>, Active]
1857
+ >
1858
+ : [RootTypesOf<Context>] extends ['unknown']
1859
+ ? UnknownState &
1860
+ EnvironmentCarrier<
1861
+ [BindingsOf<Context>, RootTypesOf<Context>, RootTargetsOf<Context>, VariableBodyHostContext<Context>, Active]
1862
+ >
1863
+ : [RootTypesOf<Context>, RootTargetsOf<Context>] &
1864
+ EnvironmentCarrier<
1865
+ [BindingsOf<Context>, RootTypesOf<Context>, RootTargetsOf<Context>, VariableBodyHostContext<Context>, Active]
1866
+ >
1867
+
1868
+ type DeclaredTypeState<Declaration, Context extends InferenceState> = Declaration extends {
1869
+ readonly type: infer Declared
1870
+ }
1871
+ ? DeclarationTypeNames<Declared> extends infer Types extends string
1872
+ ? [Types] extends [never]
1873
+ ? CopyEnvironment<UnknownState, Context>
1874
+ : WideTypeName<Types> extends true
1875
+ ? CopyEnvironment<UnknownState, Context>
1876
+ : CopyEnvironment<[LocalTypeName<Types>, DeclarationTargets<Declaration>], Context>
1877
+ : CopyEnvironment<UnknownState, Context>
1878
+ : Declaration extends { readonly __value: infer Value }
1879
+ ? CopyEnvironment<HostValueState<Value>, Context>
1880
+ : CopyEnvironment<UnknownState, Context>
1881
+
1882
+ type HostValueState<Value> = [Value] extends [null | undefined]
1883
+ ? EmptyState
1884
+ : HostPresentValueState<Exclude<Value, null | undefined>>
1885
+
1886
+ type HostPresentValueState<Value> = 0 extends 1 & Value
1887
+ ? UnknownState
1888
+ : unknown extends Value
1889
+ ? UnknownState
1890
+ : [Value] extends [readonly (infer Item)[]]
1891
+ ? HostValueState<Item>
1892
+ : [Value] extends [boolean]
1893
+ ? ['System.Boolean', never]
1894
+ : [Value] extends [string]
1895
+ ? ['System.String', never]
1896
+ : [Value] extends [bigint]
1897
+ ? ['System.Long', never]
1898
+ : [Value] extends [number]
1899
+ ? [HostNumberType<Extract<Value, number>>, never]
1900
+ : [Value] extends [{ readonly resourceType: infer Root }]
1901
+ ? Root extends keyof R4TypeOf & string
1902
+ ? [Root, never]
1903
+ : UnknownState
1904
+ : [Value] extends [object]
1905
+ ? ['host', never] & HostValueCarrier<Value>
1906
+ : UnknownState
1907
+
1908
+ type HostNumberType<Value extends number> = number extends Value
1909
+ ? 'System.Integer' | 'System.Decimal'
1910
+ : Value extends Value
1911
+ ? `${Value}` extends `${bigint}`
1912
+ ? 'System.Integer'
1913
+ : 'System.Decimal'
1914
+ : never
1915
+
1916
+ type DeclarationTypeNames<Declared> = Declared extends readonly string[]
1917
+ ? Declared[number]
1918
+ : Declared extends string
1919
+ ? Declared
1920
+ : never
1921
+ type DeclarationTargets<Declaration> = Declaration extends { readonly targets: infer Targets }
1922
+ ? Targets extends readonly string[]
1923
+ ? LocalTypeName<Targets[number]>
1924
+ : Targets extends string
1925
+ ? LocalTypeName<Targets>
1926
+ : never
1927
+ : never
1928
+ type WideTypeName<Types extends string> = keyof R4TypeOf extends Types ? true : false
1929
+
1930
+ type MemberState<Focus extends InferenceState, Name extends string> = Navigate<Focus, Name>
1931
+
1932
+ type ArgumentContext<
1933
+ Name extends string,
1934
+ Index extends number,
1935
+ Focus extends InferenceState,
1936
+ OuterContext extends InferenceState,
1937
+ > =
1938
+ ArgumentSpecAt<Name, Index> extends 'expression' | 'condition' | 'sort-key'
1939
+ ? Focus
1940
+ : CopyEnvironment<OuterContext, Focus>
1941
+
1942
+ type ArgumentSpecAt<Name extends string, Index extends number> = Index extends 0
1943
+ ? Name extends CompactLambdaArgument0Name
1944
+ ? 'expression'
1945
+ : 'eager'
1946
+ : Index extends 1
1947
+ ? Name extends CompactLambdaArgument1Name
1948
+ ? 'expression'
1949
+ : 'eager'
1950
+ : Name extends CompactLambdaArgument2Name
1951
+ ? 'expression'
1952
+ : 'eager'
1953
+
1954
+ type InputState<
1955
+ Input extends string,
1956
+ HostContext extends object,
1957
+ TrackEnvironment extends boolean,
1958
+ BindingFallback extends boolean,
1959
+ > =
1960
+ LocalTypeName<Input> extends infer Name extends string
1961
+ ? Name extends keyof R4TypeOf
1962
+ ? BindingFallback extends true
1963
+ ? [Name, never] & EnvironmentCarrier<['opaque', Name, never, HostContext, never]>
1964
+ : TrackEnvironment extends true
1965
+ ? [Name, never] & EnvironmentCarrier<[[], Name, never, HostContext, never]>
1966
+ : HasHostContext<HostContext> extends true
1967
+ ? [Name, never] & EnvironmentCarrier<[[], Name, never, HostContext, never]>
1968
+ : [Name, never]
1969
+ : BindingFallback extends true
1970
+ ? UnknownState & EnvironmentCarrier<['opaque', 'unknown', never, HostContext, never]>
1971
+ : TrackEnvironment extends true
1972
+ ? UnknownState & EnvironmentCarrier<[[], 'unknown', never, HostContext, never]>
1973
+ : HasHostContext<HostContext> extends true
1974
+ ? UnknownState & EnvironmentCarrier<[[], 'unknown', never, HostContext, never]>
1975
+ : UnknownState
1976
+ : never
1977
+
1978
+ type FastInputState<Input extends string> =
1979
+ LocalTypeName<Input> extends infer Name extends string
1980
+ ? Name extends keyof R4TypeOf
1981
+ ? [Name, never]
1982
+ : UnknownState
1983
+ : UnknownState
1984
+
1985
+ /**
1986
+ * Keep environment-free navigation on one reusable instantiation before
1987
+ * attaching host context. The API performance fixture guards this split
1988
+ * because carrying the environment through the core raises project-wide type
1989
+ * cost at every call site.
1990
+ */
1991
+ type Navigate<Input extends InferenceState, Element extends string> =
1992
+ Input extends EnvironmentCarrier<infer Environment extends InferenceEnvironment>
1993
+ ? NavigateCore<CoreOf<Input>, Element> & EnvironmentCarrier<Environment>
1994
+ : NavigateCore<Input, Element>
1995
+
1996
+ type NavigateCore<Input extends InferenceState, Element extends string> =
1997
+ StateKind<Input> extends 'empty'
1998
+ ? EmptyState
1999
+ : IsOpaqueState<Input> extends true
2000
+ ? OpaqueState
2001
+ : IsUnknownState<Input> extends true
2002
+ ? UnknownState
2003
+ : Input[0] extends 'host'
2004
+ ? NavigateHostValue<HostValueOf<Input>, Element>
2005
+ : ElementInformation<Input[0], Element> extends infer Information
2006
+ ? [Information] extends [never]
2007
+ ? UnknownState
2008
+ : Information extends { t: infer Types extends string }
2009
+ ? [LocalTypeName<Types>, ReferenceTargets<Input[0], Element, Types>]
2010
+ : OpaqueState
2011
+ : OpaqueState
2012
+
2013
+ type NavigateHostValue<Value, Element extends string> = Value extends Value
2014
+ ? Element extends keyof Value
2015
+ ? HostValueState<Value[Element]>
2016
+ : UnknownState
2017
+ : UnknownState
2018
+
2019
+ type ReferenceTargets<
2020
+ InputTypes extends string,
2021
+ Element extends string,
2022
+ Types extends string,
2023
+ > = 'Reference' extends Types
2024
+ ? ReferenceTargetInformation<InputTypes, Element> extends infer Targets extends string
2025
+ ? 'unknown' extends Targets
2026
+ ? never
2027
+ : Targets
2028
+ : never
2029
+ : never
2030
+
2031
+ type ReferenceTargetInformation<Type extends string, Element extends string> = Type extends Type
2032
+ ? ReferenceTargetInfo<Type, Element>
2033
+ : never
2034
+
2035
+ type ReferenceTargetInfo<Type extends string, Element extends string> = Type extends keyof R4ReferenceTargets
2036
+ ? Element extends keyof R4ReferenceTargets[Type]
2037
+ ? Extract<R4ReferenceTargets[Type][Element], string>
2038
+ : Type extends keyof R4Bases
2039
+ ? R4Bases[Type] extends string
2040
+ ? ReferenceTargetInfo<R4Bases[Type], Element>
2041
+ : never
2042
+ : never
2043
+ : Type extends keyof R4Bases
2044
+ ? R4Bases[Type] extends string
2045
+ ? ReferenceTargetInfo<R4Bases[Type], Element>
2046
+ : never
2047
+ : never
2048
+
2049
+ type ElementInformation<Type extends string, Element extends string> = Type extends Type
2050
+ ? ElementInfo<Type, Element>
2051
+ : never
2052
+
2053
+ type ElementInfo<Type extends string, Element extends string> = Type extends keyof R4Elements
2054
+ ? Element extends keyof R4Elements[Type]
2055
+ ? R4Elements[Type][Element]
2056
+ : Type extends keyof R4Bases
2057
+ ? R4Bases[Type] extends string
2058
+ ? ElementInfo<R4Bases[Type], Element>
2059
+ : never
2060
+ : never
2061
+ : Type extends 'System.Quantity'
2062
+ ? Element extends 'value'
2063
+ ? { t: 'System.Decimal'; a: false }
2064
+ : Element extends 'unit'
2065
+ ? { t: 'System.String'; a: false }
2066
+ : never
2067
+ : never
2068
+
2069
+ type LocalTypeName<Type extends string> = Type extends `FHIR.${infer Local}` ? Local : Type
2070
+
2071
+ type Narrow<Input extends InferenceState, Target extends string> =
2072
+ StateKind<Input> extends 'empty'
2073
+ ? CopyEnvironment<EmptyState, Input>
2074
+ : IsOpaqueState<Input> extends true
2075
+ ? CopyEnvironment<OpaqueState, Input>
2076
+ : IsUnknownState<Input> extends true
2077
+ ? CopyEnvironment<UnknownState, Input>
2078
+ : NarrowCandidates<Input[0], LocalTypeName<Target>> extends infer Survivors extends string
2079
+ ? [Survivors] extends [never]
2080
+ ? CopyEnvironment<OpaqueState, Input>
2081
+ : CopyEnvironment<[Survivors, never], Input>
2082
+ : CopyEnvironment<OpaqueState, Input>
2083
+
2084
+ type NarrowCandidates<Candidates extends string, Target extends string> = Candidates extends Candidates
2085
+ ? IsSubtype<Candidates, Target> extends true
2086
+ ? Candidates
2087
+ : IsSubtype<Target, Candidates> extends true
2088
+ ? Target
2089
+ : never
2090
+ : never
2091
+
2092
+ type IsSubtype<Type extends string, Base extends string, Seen extends string = never> = Type extends Base
2093
+ ? true
2094
+ : Base extends `System.${string}`
2095
+ ? [PrimitiveSystem<Type>] extends [never]
2096
+ ? IsModelSubtype<Type, Base, Seen>
2097
+ : PrimitiveSystem<Type> extends Base
2098
+ ? true
2099
+ : IsModelSubtype<Type, Base, Seen>
2100
+ : IsModelSubtype<Type, Base, Seen>
2101
+
2102
+ type IsModelSubtype<Type extends string, Base extends string, Seen extends string> = Type extends Seen
2103
+ ? false
2104
+ : Type extends keyof R4Bases
2105
+ ? R4Bases[Type] extends string
2106
+ ? IsSubtype<R4Bases[Type], Base, Seen | Type>
2107
+ : false
2108
+ : false
2109
+
2110
+ type PrimitiveSystem<Type extends string> = Type extends 'boolean'
2111
+ ? 'System.Boolean'
2112
+ : Type extends 'integer' | 'positiveInt' | 'unsignedInt'
2113
+ ? 'System.Integer'
2114
+ : Type extends 'integer64'
2115
+ ? 'System.Long'
2116
+ : Type extends 'decimal'
2117
+ ? 'System.Decimal'
2118
+ : Type extends 'date'
2119
+ ? 'System.Date'
2120
+ : Type extends 'dateTime' | 'instant'
2121
+ ? 'System.DateTime'
2122
+ : Type extends 'time'
2123
+ ? 'System.Time'
2124
+ : Type extends
2125
+ | 'string'
2126
+ | 'code'
2127
+ | 'id'
2128
+ | 'markdown'
2129
+ | 'uri'
2130
+ | 'url'
2131
+ | 'canonical'
2132
+ | 'oid'
2133
+ | 'uuid'
2134
+ | 'base64Binary'
2135
+ | 'xhtml'
2136
+ ? 'System.String'
2137
+ : never
2138
+
2139
+ type UnionState<Left extends InferenceState, Right extends InferenceState> =
2140
+ StateKind<Left> extends 'empty'
2141
+ ? Right
2142
+ : StateKind<Right> extends 'empty'
2143
+ ? Left
2144
+ : StateKind<Left> extends 'opaque'
2145
+ ? OpaqueState
2146
+ : StateKind<Right> extends 'opaque'
2147
+ ? OpaqueState
2148
+ : StateKind<Left> extends 'unknown'
2149
+ ? UnknownState
2150
+ : StateKind<Right> extends 'unknown'
2151
+ ? UnknownState
2152
+ : [Left[0] | Right[0], CommonTargets<Left, Right>]
2153
+
2154
+ type PublicResult<State extends InferenceState> =
2155
+ StateKind<State> extends 'empty'
2156
+ ? never[]
2157
+ : StateKind<State> extends 'known'
2158
+ ? [Exclude<State[0], keyof R4TypeOf>] extends [never]
2159
+ ? R4TypeOf[Extract<State[0], keyof R4TypeOf>][]
2160
+ : unknown[]
2161
+ : unknown[]
2162
+
2163
+ type LiteralState<Token extends LiteralToken> = Token[0] extends 'string'
2164
+ ? ['System.String', never]
2165
+ : Token[0] extends 'date'
2166
+ ? ['System.Date', never]
2167
+ : Token[0] extends 'dateTime'
2168
+ ? ['System.DateTime', never]
2169
+ : Token[0] extends 'time'
2170
+ ? ['System.Time', never]
2171
+ : UnknownState
2172
+
2173
+ type IndexResult<Stack extends Values, Index extends InferenceState> = Stack extends [
2174
+ ...infer Before extends Values,
2175
+ infer Target extends InferenceState,
2176
+ ]
2177
+ ? Index[0] extends 'System.Integer'
2178
+ ? [...Before, Target]
2179
+ : [...Before, OpaqueState]
2180
+ : [OpaqueState]
2181
+
2182
+ /**
2183
+ * One binding is inferred through nested frames. Further definitions make
2184
+ * bindings opaque while result rules continue, which keeps TypeScript 5.8
2185
+ * below its conditional depth on the official 60-token nested-variable case.
2186
+ */
2187
+ type TokenPolicy<
2188
+ Tokens extends TypeTokens,
2189
+ SeenDefinition extends boolean = false,
2190
+ NeedsEnvironment extends boolean = false,
2191
+ > = Tokens extends [infer Token extends TypeToken, ...infer Rest extends TypeTokens]
2192
+ ? Token extends UnsafeToken
2193
+ ? 'unsafe'
2194
+ : Token extends ['name', 'defineVariable']
2195
+ ? SeenDefinition extends true
2196
+ ? 'binding-fallback'
2197
+ : TokenPolicy<Rest, true, true>
2198
+ : Token extends ['symbol', '%']
2199
+ ? TokenPolicy<Rest, SeenDefinition, true>
2200
+ : TokenPolicy<Rest, SeenDefinition, NeedsEnvironment>
2201
+ : NeedsEnvironment extends true
2202
+ ? 'environment'
2203
+ : 'plain'
2204
+
2205
+ type ParseletBindingPower<Token extends keyof CompactInfixParselets> = CompactInfixParselets[Token][2]
2206
+ type PrefixBindingPower<Token extends keyof CompactPrefixParselets> = CompactPrefixParselets[Token][2]
2207
+ type OperatorBindingPower<Operator extends OperatorFrame> = Operator extends UnaryOperatorFrame
2208
+ ? Operator[1]
2209
+ : Operator[2]
2210
+
2211
+ type PrefixParseletMatches<
2212
+ Token extends keyof CompactPrefixParselets,
2213
+ TokenKind extends string,
2214
+ Associativity extends string,
2215
+ Rhs extends string,
2216
+ Reducer extends string,
2217
+ > = CompactPrefixParselets[Token] extends readonly [TokenKind, 'prefix', number, Associativity, Rhs, Reducer]
2218
+ ? true
2219
+ : false
2220
+
2221
+ type InfixParseletMatches<
2222
+ Token extends keyof CompactInfixParselets,
2223
+ TokenKind extends string,
2224
+ Fixity extends string,
2225
+ Associativity extends string,
2226
+ Rhs extends string,
2227
+ Reducer extends string,
2228
+ > = CompactInfixParselets[Token] extends readonly [TokenKind, Fixity, number, Associativity, Rhs, Reducer]
2229
+ ? true
2230
+ : false
2231
+
2232
+ type Assert<Condition extends true> = Condition
2233
+ type PrefixParseletKey = 'identifier' | 'literal' | 'variable' | '+' | '-' | '(' | '{' | '%'
2234
+ type BinaryKeyword = 'implies' | 'or' | 'xor' | 'and' | 'in' | 'contains' | 'div' | 'mod'
2235
+ type BinarySymbol = '=' | '~' | '!=' | '!~' | '<' | '>' | '<=' | '>=' | '|' | '+' | '-' | '&' | '*' | '/'
2236
+ type InfixParseletKey = BinaryKeyword | BinarySymbol | 'is' | 'as' | '[' | '.' | '('
2237
+
2238
+ /** Makes parser metadata drift a type error instead of widening an expression result. */
2239
+ // Exported so no-unused-vars permits this assertion-only alias; its constraints are the check.
2240
+ export type ParseletMetadataAssertions = [
2241
+ Assert<EqualTypes<keyof CompactPrefixParselets, PrefixParseletKey>>,
2242
+ Assert<PrefixParseletMatches<'identifier', 'identifier', 'none', 'none', 'identifier'>>,
2243
+ Assert<PrefixParseletMatches<'literal', 'literal', 'none', 'none', 'literal'>>,
2244
+ Assert<PrefixParseletMatches<'variable', 'variable', 'none', 'none', 'identifier'>>,
2245
+ Assert<PrefixParseletMatches<'+' | '-', 'operator', 'right', 'expression', 'unary'>>,
2246
+ Assert<PrefixParseletMatches<'%', 'punct', 'none', 'external-name', 'external'>>,
2247
+ Assert<PrefixParseletMatches<'(', 'punct', 'none', 'group', 'group'>>,
2248
+ Assert<PrefixParseletMatches<'{', 'punct', 'none', 'none', 'empty'>>,
2249
+ Assert<EqualTypes<keyof CompactInfixParselets, InfixParseletKey>>,
2250
+ Assert<InfixParseletMatches<BinaryKeyword, 'keyword', 'infix', 'left', 'expression', 'binary'>>,
2251
+ Assert<InfixParseletMatches<BinarySymbol, 'operator', 'infix', 'left', 'expression', 'binary'>>,
2252
+ Assert<InfixParseletMatches<'is' | 'as', 'keyword', 'infix', 'left', 'type-name', 'type'>>,
2253
+ Assert<InfixParseletMatches<'[', 'punct', 'postfix', 'left', 'index', 'indexer'>>,
2254
+ Assert<InfixParseletMatches<'.', 'punct', 'infix', 'left', 'path', 'dot'>>,
2255
+ Assert<InfixParseletMatches<'(', 'punct', 'postfix', 'left', 'arguments', 'call'>>,
2256
+ ]
2257
+
2258
+ type NumericType =
2259
+ | 'System.Integer'
2260
+ | 'System.Long'
2261
+ | 'System.Decimal'
2262
+ | 'integer'
2263
+ | 'positiveInt'
2264
+ | 'unsignedInt'
2265
+ | 'integer64'
2266
+ | 'decimal'
2267
+ type QuantityType = 'System.Quantity' | 'Quantity'
2268
+
2269
+ type GreaterThanOrEqual<
2270
+ Left extends number,
2271
+ Right extends number,
2272
+ Count extends unknown[] = [],
2273
+ > = Count['length'] extends Right
2274
+ ? true
2275
+ : Count['length'] extends Left
2276
+ ? false
2277
+ : GreaterThanOrEqual<Left, Right, [...Count, 0]>