@@ -35,33 +35,22 @@ export class Parser<T> {
3535 }
3636 return this [ rawParser ] ( 0 ) . map ( ( { value } ) => value ) ;
3737 }
38- #rawMap< U > ( mapper : ( value : T ) => U ) : Parser < U > {
39- return new Parser ( ( input ) =>
40- this [ rawParser ] ( input )
41- . map ( ( { value, length } ) : ValueLength < U > => ( {
42- value : mapper ( value ) ,
43- length,
44- } ) )
45- ) ;
46- }
38+
4739 map < U > ( mapper : ( value : T ) => U ) : Parser < U > {
4840 return withPosition ( this )
4941 . #rawMap( ( value ) =>
5042 withPositionedError ( ( ) => mapper ( value . value ) , value )
5143 ) ;
5244 }
53- #rawFilter( mapper : ( value : T ) => boolean ) : Parser < T > {
54- return new Parser ( ( input ) =>
55- this [ rawParser ] ( input ) . filter ( ( { value } ) => mapper ( value ) )
56- ) ;
57- }
45+
5846 filter ( mapper : ( value : T ) => boolean ) : Parser < T > {
5947 return withPosition ( this )
6048 . #rawFilter( ( value ) =>
6149 withPositionedError ( ( ) => mapper ( value . value ) , value )
6250 )
6351 . map ( ( { value } ) => value ) ;
6452 }
53+
6554 then < U > ( mapper : ( value : T ) => Parser < U > ) : Parser < U > {
6655 return new Parser ( ( position ) =>
6756 this [ rawParser ] ( position )
@@ -75,21 +64,41 @@ export class Parser<T> {
7564 )
7665 ) ;
7766 }
67+
7868 sort ( comparer : ( left : T , right : T ) => number ) : Parser < T > {
7969 return new Parser ( ( input ) =>
8070 this [ rawParser ] ( input )
8171 . sort ( ( left , right ) => comparer ( left . value , right . value ) )
8272 ) ;
8373 }
74+
8475 sortBy ( mapper : ( value : T ) => number ) : Parser < T > {
8576 return this . sort ( ( left , right ) => mapper ( left ) - mapper ( right ) ) ;
8677 }
78+
8779 with < U > ( parser : Parser < U > ) : Parser < U > {
8880 return sequence ( this , parser ) . map ( ( [ _ , arrayResult ] ) => arrayResult ) ;
8981 }
82+
9083 skip < U > ( parser : Parser < U > ) : Parser < T > {
9184 return sequence ( this , parser ) . map ( ( [ arrayResult ] ) => arrayResult ) ;
9285 }
86+
87+ #rawMap< U > ( mapper : ( value : T ) => U ) : Parser < U > {
88+ return new Parser ( ( input ) =>
89+ this [ rawParser ] ( input )
90+ . map ( ( { value, length } ) : ValueLength < U > => ( {
91+ value : mapper ( value ) ,
92+ length,
93+ } ) )
94+ ) ;
95+ }
96+
97+ #rawFilter( mapper : ( value : T ) => boolean ) : Parser < T > {
98+ return new Parser ( ( input ) =>
99+ this [ rawParser ] ( input ) . filter ( ( { value } ) => mapper ( value ) )
100+ ) ;
101+ }
93102}
94103export type Position = Readonly < { position : number ; length : number } > ;
95104export class PositionedError extends ResultError {
0 commit comments