@@ -32,12 +32,15 @@ export function gotMatch(x: mixed): boolean %checks {
32
32
}
33
33
34
34
export type VarArgsObject < + T > = {
35
- __proto__ : empty ,
36
35
+ [ arg : string ] : T ,
37
- ...
38
36
} ;
39
37
40
- export class VarArgs < + T , + U = T > {
38
+ export interface VarArgsClass < + T > {
39
+ get ( name : string ) : T ,
40
+ has ( name : string ) : boolean ,
41
+ }
42
+
43
+ export class VarArgs < + T , + U = T > implements VarArgsClass < T | U > {
41
44
+ data : VarArgsObject < T > ;
42
45
43
46
constructor ( data : VarArgsObject < T > ) {
@@ -53,9 +56,10 @@ export class VarArgs<+T, +U = T> {
53
56
}
54
57
}
55
58
56
- export type Parser < + T , - V > = ( VarArgs < V > ) => T ;
59
+ export type Parser < + T , - V > = ( VarArgsClass < V > ) => T ;
57
60
58
61
const EMPTY_OBJECT = Object . freeze ( { } ) ;
62
+ const EMPTY_VARARGS = new VarArgs ( EMPTY_OBJECT ) ;
59
63
60
64
type State = {
61
65
/*
@@ -140,7 +144,7 @@ export function saveMatch<T, V>(cb: Parser<T, V>): Parser<T, V> {
140
144
141
145
export function parseContinuous < T , U , V > (
142
146
parsers : $ReadOnlyArray < Parser < T | NO_MATCH , V >> ,
143
- args : VarArgs < V > ,
147
+ args : VarArgsClass < V > ,
144
148
matchCallback : ( U | NO_MATCH , T ) = > U ,
145
149
defaultValue : U ,
146
150
) : U {
@@ -178,7 +182,7 @@ function concatStringMatch(
178
182
179
183
export function parseContinuousString < V > (
180
184
parsers : $ReadOnlyArray < Parser < string | NO_MATCH , V >> ,
181
- args : VarArgs < V > ,
185
+ args : VarArgsClass < V > ,
182
186
) : string {
183
187
return parseContinuous < string , string , V > (
184
188
parsers ,
@@ -202,16 +206,18 @@ export const createTextContentParser = <+T, V>(
202
206
const varSubst = / ^ \{ ( [ 0 - 9 A - z _ ] + ) \} / ;
203
207
export const createVarSubstParser = < T , V > (
204
208
argFilter: (V) => T ,
205
- ) : Parser < T | string | NO_MATCH , V > => saveMatch ( function ( args : VarArgs < V > ) {
206
- const name = accept ( varSubst ) ;
207
- if ( typeof name !== 'string' ) {
208
- return NO_MATCH_VALUE ;
209
- }
210
- if ( args . has ( name ) ) {
211
- return argFilter ( args . get ( name ) ) ;
212
- }
213
- return state . match ;
214
- } ) ;
209
+ ) : Parser < T | string | NO_MATCH , V > => saveMatch (
210
+ function ( args : VarArgsClass < V > ) {
211
+ const name = accept ( varSubst ) ;
212
+ if ( typeof name !== 'string' ) {
213
+ return NO_MATCH_VALUE ;
214
+ }
215
+ if ( args . has ( name ) ) {
216
+ return argFilter ( args . get ( name ) ) ;
217
+ }
218
+ return state . match ;
219
+ } ,
220
+ ) ;
215
221
216
222
export const parseStringVarSubst : Parser < string | NO_MATCH , mixed > =
217
223
createVarSubstParser < string , mixed > ( getString ) ;
@@ -271,9 +277,9 @@ export const createCondSubstParser = <T, V>(
271
277
* and input arg values.
272
278
*/
273
279
export default function expand < + T , V > (
274
- rootParser: (VarArgs < V > ) => T ,
280
+ rootParser: (VarArgsClass < V > ) => T ,
275
281
source : ?string ,
276
- args : ?( VarArgsObject < V > | VarArgs < V > ) ,
282
+ args : ?VarArgsClass < V > ,
277
283
): T | string {
278
284
if ( ! source ) {
279
285
return '';
@@ -292,13 +298,9 @@ export default function expand<+T, V>(
292
298
state.running = true;
293
299
state.source = source;
294
300
295
- if (!(args instanceof VarArgs)) {
296
- args = new VarArgs < V > ( args ?? EMPTY_OBJECT ) ;
297
- }
298
-
299
301
let result;
300
302
try {
301
- result = rootParser ( args ) ;
303
+ result = rootParser ( args ?? EMPTY_VARARGS ) ;
302
304
303
305
if ( state . remainder ) {
304
306
throw error ( 'unexpected token' ) ;
0 commit comments