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.
- package/README.md +50 -18
- package/dist/analyzer/analyze-dto.d.ts +4 -0
- package/dist/analyzer/analyze-dto.d.ts.map +1 -1
- package/dist/analyzer/analyze-dto.js +12 -14
- package/dist/analyzer/analyze-dto.js.map +1 -1
- package/dist/analyzer/analyze.d.ts +22 -6
- package/dist/analyzer/analyze.d.ts.map +1 -1
- package/dist/analyzer/analyze.js +242 -98
- package/dist/analyzer/analyze.js.map +1 -1
- package/dist/analyzer/declarations.d.ts +26 -0
- package/dist/analyzer/declarations.d.ts.map +1 -0
- package/dist/analyzer/declarations.js +68 -0
- package/dist/analyzer/declarations.js.map +1 -0
- package/dist/analyzer/operator-rules.d.ts +127 -0
- package/dist/analyzer/operator-rules.d.ts.map +1 -0
- package/dist/analyzer/operator-rules.js +70 -0
- package/dist/analyzer/operator-rules.js.map +1 -0
- package/dist/analyzer/signatures.d.ts +1097 -10
- package/dist/analyzer/signatures.d.ts.map +1 -1
- package/dist/analyzer/signatures.js +70 -29
- package/dist/analyzer/signatures.js.map +1 -1
- package/dist/api/compile.d.ts +32 -8
- package/dist/api/compile.d.ts.map +1 -1
- package/dist/api/compile.js +2 -0
- package/dist/api/compile.js.map +1 -1
- package/dist/api/engine.d.ts +42 -16
- package/dist/api/engine.d.ts.map +1 -1
- package/dist/api/engine.js +2 -1
- package/dist/api/engine.js.map +1 -1
- package/dist/api/project.d.ts +8 -8
- package/dist/api/project.d.ts.map +1 -1
- package/dist/api/project.js +31 -19
- package/dist/api/project.js.map +1 -1
- package/dist/api/strict.d.ts +6 -0
- package/dist/api/strict.d.ts.map +1 -0
- package/dist/api/strict.js +71 -0
- package/dist/api/strict.js.map +1 -0
- package/dist/api/tagged.d.ts +4 -4
- package/dist/api/tagged.d.ts.map +1 -1
- package/dist/api/tagged.js.map +1 -1
- package/dist/cli/dto-check.js +7 -3
- package/dist/cli/dto-check.js.map +1 -1
- package/dist/engine/context.d.ts +3 -1
- package/dist/engine/context.d.ts.map +1 -1
- package/dist/engine/context.js +5 -1
- package/dist/engine/context.js.map +1 -1
- package/dist/engine/navigation.d.ts.map +1 -1
- package/dist/engine/navigation.js +7 -48
- package/dist/engine/navigation.js.map +1 -1
- package/dist/engine/type-matching.d.ts.map +1 -1
- package/dist/engine/type-matching.js +6 -16
- package/dist/engine/type-matching.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +102 -73
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/precedence.d.ts +368 -4
- package/dist/parser/precedence.d.ts.map +1 -1
- package/dist/parser/precedence.js +146 -32
- package/dist/parser/precedence.js.map +1 -1
- package/dist/r4/generated/type-maps.d.ts +1367 -0
- package/dist/r4/generated/type-maps.d.ts.map +1 -1
- package/dist/r4/index.d.ts +3 -1
- package/dist/r4/index.d.ts.map +1 -1
- package/dist/typed/context-maps.d.ts +23 -0
- package/dist/typed/context-maps.d.ts.map +1 -0
- package/dist/typed/context-maps.js +2 -0
- package/dist/typed/context-maps.js.map +1 -0
- package/dist/typed/infer.d.ts +99 -229
- package/dist/typed/infer.d.ts.map +1 -1
- package/dist/typed/infer.js +1 -84
- package/dist/typed/infer.js.map +1 -1
- package/dist/typed/inference-limits.d.ts +7 -0
- package/dist/typed/inference-limits.d.ts.map +1 -0
- package/dist/typed/inference-limits.js +6 -0
- package/dist/typed/inference-limits.js.map +1 -0
- package/dist/typed/metadata-compact.d.ts +189 -0
- package/dist/typed/metadata-compact.d.ts.map +1 -0
- package/dist/typed/metadata-compact.js +3 -0
- package/dist/typed/metadata-compact.js.map +1 -0
- package/dist/typed/parser.d.ts +515 -0
- package/dist/typed/parser.d.ts.map +1 -0
- package/dist/typed/parser.js +2 -0
- package/dist/typed/parser.js.map +1 -0
- package/dist/values/type-compat.d.ts +8 -0
- package/dist/values/type-compat.d.ts.map +1 -1
- package/dist/values/type-compat.js +44 -1
- package/dist/values/type-compat.js.map +1 -1
- package/package.json +20 -1
- package/src/analyzer/analyze-dto.ts +21 -17
- package/src/analyzer/analyze.ts +335 -109
- package/src/analyzer/declarations.ts +120 -0
- package/src/analyzer/operator-rules.ts +88 -0
- package/src/analyzer/signatures.ts +99 -41
- package/src/api/compile.ts +66 -11
- package/src/api/engine.ts +97 -33
- package/src/api/project.ts +54 -30
- package/src/api/strict.ts +112 -0
- package/src/api/tagged.ts +5 -5
- package/src/cli/dto-check.ts +7 -3
- package/src/engine/context.ts +7 -2
- package/src/engine/navigation.ts +7 -52
- package/src/engine/type-matching.ts +11 -17
- package/src/index.ts +25 -2
- package/src/parser/parser.ts +106 -74
- package/src/parser/precedence.ts +250 -33
- package/src/r4/generated/type-maps.ts +1557 -0
- package/src/typed/context-maps.ts +41 -0
- package/src/typed/infer.ts +157 -425
- package/src/typed/inference-limits.ts +9 -0
- package/src/typed/metadata-compact.ts +307 -0
- package/src/typed/parser.ts +2277 -0
- package/src/values/type-compat.ts +48 -1
- package/dist/typed/perf-fixture.types.d.ts +0 -136
- package/dist/typed/perf-fixture.types.d.ts.map +0 -1
- package/dist/typed/perf-fixture.types.js +0 -2
- package/dist/typed/perf-fixture.types.js.map +0 -1
- 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]>
|