@@ -49,9 +49,11 @@ export class Parser<T> {
49
49
* parser is then also parsed.
50
50
*/
51
51
then < U > ( mapper : ( value : T ) => Parser < U > ) : Parser < U > {
52
- return new Parser ( ( src ) =>
53
- this . parser ( src ) . flatMap ( ( { value, rest } ) => mapper ( value ) . parser ( rest ) )
54
- ) ;
52
+ const { cache } = Parser ;
53
+ return new Parser ( ( src ) => {
54
+ const parser = Parser . inContext ( ( ) => this . parser ( src ) , cache ) ;
55
+ return parser . flatMap ( ( { value, rest } ) => mapper ( value ) . parser ( rest ) ) ;
56
+ } ) ;
55
57
}
56
58
sort ( comparer : ( left : T , right : T ) => number ) : Parser < T > {
57
59
return new Parser ( ( src ) =>
@@ -84,6 +86,13 @@ export class Parser<T> {
84
86
static startOrEndCache ( cache : null | Cache = null ) : void {
85
87
Parser . cache = cache ;
86
88
}
89
+ static inContext < T > ( fn : ( ) => T , cache : null | Cache = null ) : T {
90
+ const previousCache = Parser . cache ;
91
+ Parser . startOrEndCache ( cache ) ;
92
+ const value = fn ( ) ;
93
+ Parser . startOrEndCache ( previousCache ) ;
94
+ return value ;
95
+ }
87
96
}
88
97
/** Represents Error with unexpected and expected elements. */
89
98
export class UnexpectedError extends ArrayResultError {
@@ -131,13 +140,7 @@ export function lookAhead<T>(parser: Parser<T>): Parser<T> {
131
140
*/
132
141
export function lazy < T > ( parser : ( ) => Parser < T > ) : Parser < T > {
133
142
const { cache } = Parser ;
134
- const cachedParser = new Lazy ( ( ) => {
135
- const previousCache = Parser . cache ;
136
- Parser . startOrEndCache ( cache ) ;
137
- const useParser = parser ( ) ;
138
- Parser . startOrEndCache ( previousCache ) ;
139
- return useParser ;
140
- } ) ;
143
+ const cachedParser = new Lazy ( ( ) => Parser . inContext ( parser , cache ) ) ;
141
144
Parser . addToCache ( cachedParser ) ;
142
145
return new Parser ( ( src ) => cachedParser . getValue ( ) . parser ( src ) ) ;
143
146
}
0 commit comments