@@ -7,10 +7,10 @@ export type ValueRest<T> = Readonly<{ rest: string; value: T }>;
7
7
export type ParserResult < T > = ArrayResult < ValueRest < T > > ;
8
8
9
9
export class Parser < T > {
10
- readonly nonMemoizedParser : ( src : string ) => ParserResult < T > ;
11
- readonly rawParser : ( src : string ) => ParserResult < T > ;
10
+ readonly nonMemoizedParser : ( source : string ) => ParserResult < T > ;
11
+ readonly rawParser : ( source : string ) => ParserResult < T > ;
12
12
static cache : null | ClearableCacheSet = null ;
13
- constructor ( parser : ( src : string ) => ParserResult < T > ) {
13
+ constructor ( parser : ( source : string ) => ParserResult < T > ) {
14
14
this . nonMemoizedParser = parser ;
15
15
if ( Parser . cache != null ) {
16
16
const cache : Map < string , MemoizationCacheResult < ParserResult < T > > > =
@@ -21,35 +21,35 @@ export class Parser<T> {
21
21
this . rawParser = this . nonMemoizedParser ;
22
22
}
23
23
}
24
- parser ( ) : ( src : string ) => ArrayResult < T > {
24
+ parser ( ) : ( source : string ) => ArrayResult < T > {
25
25
const { rawParser } = this ;
26
- return ( src ) => rawParser ( src ) . map ( ( { value } ) => value ) ;
26
+ return ( source ) => rawParser ( source ) . map ( ( { value } ) => value ) ;
27
27
}
28
28
map < U > ( mapper : ( value : T ) => U ) : Parser < U > {
29
29
const { nonMemoizedParser : unmemoizedParser } = this ;
30
- return new Parser ( ( src ) =>
31
- unmemoizedParser ( src )
30
+ return new Parser ( ( source ) =>
31
+ unmemoizedParser ( source )
32
32
. map ( ( { value, rest } ) => ( { value : mapper ( value ) , rest } ) )
33
33
) ;
34
34
}
35
35
filter ( mapper : ( value : T ) => boolean ) : Parser < T > {
36
36
const { nonMemoizedParser : unmemoizedParser } = this ;
37
- return new Parser ( ( src ) =>
38
- unmemoizedParser ( src ) . filter ( ( { value } ) => mapper ( value ) )
37
+ return new Parser ( ( source ) =>
38
+ unmemoizedParser ( source ) . filter ( ( { value } ) => mapper ( value ) )
39
39
) ;
40
40
}
41
41
then < U > ( mapper : ( value : T ) => Parser < U > ) : Parser < U > {
42
42
const { cache } = Parser ;
43
43
const { nonMemoizedParser : unmemoizedParser } = this ;
44
- return new Parser ( ( src ) => {
45
- const parser = Parser . inContext ( ( ) => unmemoizedParser ( src ) , cache ) ;
44
+ return new Parser ( ( source ) => {
45
+ const parser = Parser . inContext ( ( ) => unmemoizedParser ( source ) , cache ) ;
46
46
return parser . flatMap ( ( { value, rest } ) => mapper ( value ) . rawParser ( rest ) ) ;
47
47
} ) ;
48
48
}
49
49
sort ( comparer : ( left : T , right : T ) => number ) : Parser < T > {
50
50
const { nonMemoizedParser : unmemoizedParser } = this ;
51
- return new Parser ( ( src ) =>
52
- unmemoizedParser ( src ) . sort ( ( left , right ) =>
51
+ return new Parser ( ( source ) =>
52
+ unmemoizedParser ( source ) . sort ( ( left , right ) =>
53
53
comparer ( left . value , right . value )
54
54
)
55
55
) ;
@@ -99,31 +99,36 @@ export function error(error: ArrayResultError): Parser<never> {
99
99
return new Parser ( ( ) => new ArrayResult ( error ) ) ;
100
100
}
101
101
export const empty = new Parser < never > ( ( ) => new ArrayResult ( ) ) ;
102
- export const nothing = new Parser ( ( src ) =>
103
- new ArrayResult ( [ { value : null , rest : src } ] )
102
+ export const nothing = new Parser ( ( source ) =>
103
+ new ArrayResult ( [ { value : null , rest : source } ] )
104
104
) ;
105
105
export const emptyArray = nothing . map ( ( ) => [ ] ) ;
106
106
export function lookAhead < T > ( parser : Parser < T > ) : Parser < T > {
107
- return new Parser ( ( src ) =>
108
- parser . nonMemoizedParser ( src ) . map ( ( { value } ) => ( { value, rest : src } ) )
107
+ return new Parser ( ( source ) =>
108
+ parser . nonMemoizedParser ( source ) . map ( ( { value } ) => ( {
109
+ value,
110
+ rest : source ,
111
+ } ) )
109
112
) ;
110
113
}
111
114
export function lazy < T > ( parser : ( ) => Parser < T > ) : Parser < T > {
112
115
const { cache } = Parser ;
113
116
if ( Parser . cache != null ) {
114
117
const cachedParser = new Lazy ( ( ) => Parser . inContext ( parser , cache ) ) ;
115
118
Parser . addToCache ( cachedParser ) ;
116
- return new Parser ( ( src ) => cachedParser . getValue ( ) . nonMemoizedParser ( src ) ) ;
119
+ return new Parser ( ( source ) =>
120
+ cachedParser . getValue ( ) . nonMemoizedParser ( source )
121
+ ) ;
117
122
} else {
118
- return new Parser ( ( src ) =>
119
- Parser . inContext ( parser , cache ) . nonMemoizedParser ( src )
123
+ return new Parser ( ( source ) =>
124
+ Parser . inContext ( parser , cache ) . nonMemoizedParser ( source )
120
125
) ;
121
126
}
122
127
}
123
128
export function choice < T > ( ...choices : ReadonlyArray < Parser < T > > ) : Parser < T > {
124
129
assert ( choices . length > 1 , "`choice` called with less than 2 arguments" ) ;
125
- return new Parser ( ( src ) =>
126
- new ArrayResult ( choices ) . flatMap ( ( parser ) => parser . rawParser ( src ) )
130
+ return new Parser ( ( source ) =>
131
+ new ArrayResult ( choices ) . flatMap ( ( parser ) => parser . rawParser ( source ) )
127
132
) ;
128
133
}
129
134
export function choiceOnlyOne < T > (
@@ -135,10 +140,10 @@ export function choiceOnlyOne<T>(
135
140
) ;
136
141
return choices . reduceRight (
137
142
( right , left ) =>
138
- new Parser ( ( src ) => {
139
- const arrayResult = left . rawParser ( src ) ;
143
+ new Parser ( ( source ) => {
144
+ const arrayResult = left . rawParser ( source ) ;
140
145
if ( arrayResult . isError ( ) ) {
141
- return ArrayResult . concat ( arrayResult , right . rawParser ( src ) ) ;
146
+ return ArrayResult . concat ( arrayResult , right . rawParser ( source ) ) ;
142
147
} else {
143
148
return arrayResult ;
144
149
}
@@ -192,13 +197,13 @@ export function allAtLeastOnce<T>(parser: Parser<T>): Parser<ReadonlyArray<T>> {
192
197
export function count ( parser : Parser < { length : number } > ) : Parser < number > {
193
198
return parser . map ( ( { length } ) => length ) ;
194
199
}
195
- function describeSource ( src : string ) : string {
196
- if ( src === "" ) {
200
+ function describeSource ( source : string ) : string {
201
+ if ( source === "" ) {
197
202
return "end of text" ;
198
203
} else {
199
- const [ token ] = src . match ( / \S * / ) ! ;
204
+ const [ token ] = source . match ( / \S * / ) ! ;
200
205
if ( token === "" ) {
201
- if ( / ^ \r ? \n / . test ( src ) ) {
206
+ if ( / ^ \r ? \n / . test ( source ) ) {
202
207
return "newline" ;
203
208
} else {
204
209
return "space" ;
@@ -213,16 +218,16 @@ export function matchCapture(
213
218
description : string ,
214
219
) : Parser < RegExpMatchArray > {
215
220
const newRegex = new RegExp ( `^${ regex . source } ` , regex . flags ) ;
216
- return new Parser ( ( src ) => {
217
- const match = src . match ( newRegex ) ;
221
+ return new Parser ( ( source ) => {
222
+ const match = source . match ( newRegex ) ;
218
223
if ( match != null ) {
219
224
return new ArrayResult ( [ {
220
225
value : match ,
221
- rest : src . slice ( match [ 0 ] . length ) ,
226
+ rest : source . slice ( match [ 0 ] . length ) ,
222
227
} ] ) ;
223
228
} else {
224
229
return new ArrayResult (
225
- new UnexpectedError ( describeSource ( src ) , description ) ,
230
+ new UnexpectedError ( describeSource ( source ) , description ) ,
226
231
) ;
227
232
}
228
233
} ) ;
@@ -231,43 +236,49 @@ export function match(regex: RegExp, description: string): Parser<string> {
231
236
return matchCapture ( regex , description ) . map ( ( [ matched ] ) => matched ) ;
232
237
}
233
238
export function slice ( length : number , description : string ) : Parser < string > {
234
- return new Parser ( ( src ) =>
235
- src . length >= length
239
+ return new Parser ( ( source ) =>
240
+ source . length >= length
236
241
? new ArrayResult ( [ {
237
- rest : src . slice ( length ) ,
238
- value : src . slice ( 0 , length ) ,
242
+ rest : source . slice ( length ) ,
243
+ value : source . slice ( 0 , length ) ,
239
244
} ] )
240
- : new ArrayResult ( new UnexpectedError ( describeSource ( src ) , description ) )
245
+ : new ArrayResult (
246
+ new UnexpectedError ( describeSource ( source ) , description ) ,
247
+ )
241
248
) ;
242
249
}
243
250
export function matchString (
244
251
match : string ,
245
252
description = `"${ match } "` ,
246
253
) : Parser < string > {
247
- return new Parser ( ( src ) =>
248
- src . length >= match . length && src . slice ( 0 , match . length ) === match
254
+ return new Parser ( ( source ) =>
255
+ source . length >= match . length && source . slice ( 0 , match . length ) === match
249
256
? new ArrayResult ( [ {
250
- rest : src . slice ( match . length ) ,
257
+ rest : source . slice ( match . length ) ,
251
258
value : match ,
252
259
} ] )
253
- : new ArrayResult ( new UnexpectedError ( describeSource ( src ) , description ) )
260
+ : new ArrayResult (
261
+ new UnexpectedError ( describeSource ( source ) , description ) ,
262
+ )
254
263
) ;
255
264
}
256
- export const everything = new Parser ( ( src ) =>
257
- new ArrayResult ( [ { value : src , rest : "" } ] )
265
+ export const everything = new Parser ( ( source ) =>
266
+ new ArrayResult ( [ { value : source , rest : "" } ] )
258
267
) ;
259
268
export const character = match ( / ./ us, "character" ) ;
260
- export const end = new Parser ( ( src ) =>
261
- src === ""
269
+ export const end = new Parser ( ( source ) =>
270
+ source === ""
262
271
? new ArrayResult ( [ { value : null , rest : "" } ] )
263
- : new ArrayResult ( new UnexpectedError ( describeSource ( src ) , "end of text" ) )
272
+ : new ArrayResult (
273
+ new UnexpectedError ( describeSource ( source ) , "end of text" ) ,
274
+ )
264
275
) ;
265
276
export function withSource < T > (
266
277
parser : Parser < T > ,
267
278
) : Parser < readonly [ value : T , source : string ] > {
268
- return new Parser ( ( src ) =>
269
- parser . nonMemoizedParser ( src ) . map ( ( { value, rest } ) => ( {
270
- value : [ value , src . slice ( 0 , src . length - rest . length ) ] ,
279
+ return new Parser ( ( source ) =>
280
+ parser . nonMemoizedParser ( source ) . map ( ( { value, rest } ) => ( {
281
+ value : [ value , source . slice ( 0 , source . length - rest . length ) ] ,
271
282
rest,
272
283
} ) )
273
284
) ;
0 commit comments