This repository was archived by the owner on Apr 16, 2023. It is now read-only.
File tree 3 files changed +24
-23
lines changed
3 files changed +24
-23
lines changed Original file line number Diff line number Diff line change 1
- import { Replacement } from './index ' ;
1
+ import { Replacement } from './Replacement ' ;
2
2
3
3
export class Intermediate < ContextClass = unknown > {
4
4
public readonly value : string ;
@@ -37,7 +37,7 @@ export class Intermediate<ContextClass = unknown> {
37
37
}
38
38
39
39
absorb ( other : Intermediate < ContextClass > ) : this {
40
- if ( this . value !== other . value ) {
40
+ if ( this . equals ( other ) ) {
41
41
throw new Error (
42
42
`Cannot merge different intermediates: ${ this . value } and ${ other . value } ` ,
43
43
) ;
@@ -57,15 +57,12 @@ export class Intermediate<ContextClass = unknown> {
57
57
return this ;
58
58
}
59
59
60
- * replacements ( ) : IterableIterator < Replacement < ContextClass > > {
60
+ * chain ( ) : IterableIterator < Intermediate < ContextClass > > {
61
61
// eslint-disable-next-line @typescript-eslint/no-this-alias
62
62
let item : Intermediate < ContextClass > | null = this ;
63
63
64
64
while ( item ) {
65
- if ( item . via ) {
66
- yield item . via ;
67
- }
68
-
65
+ yield item ;
69
66
item = item . parent ;
70
67
}
71
68
}
Original file line number Diff line number Diff line change @@ -13,27 +13,29 @@ export class Multireplacer<Context = unknown> {
13
13
) : MultireplacerOutput < Context > {
14
14
const intermediatesCache = new IntermediatesCache < Context > ( ) ;
15
15
16
- let intermediates = values . map ( ( v ) => new Intermediate ( v , record ) ) ;
16
+ let intermediates = values . map ( ( v ) => {
17
+ return intermediatesCache . resolve ( new Intermediate ( v , record ) ) ;
18
+ } ) ;
17
19
let nextIntermediates : Intermediate < Context > [ ] = [ ] ;
18
- let applied = false ;
19
20
let rule : MultireplacerRule < Context > ;
20
21
let value : Intermediate < Context > ;
21
22
22
23
for ( rule of this . rules ) {
23
24
rule . intermediatesCache = intermediatesCache ;
25
+
24
26
nextIntermediates = [ ] ;
25
- applied = false ;
26
27
27
28
for ( value of intermediates ) {
28
29
if ( rule . appliesTo ( value ) ) {
29
30
rule . apply ( value , nextIntermediates ) ;
30
- applied = true ;
31
31
}
32
32
}
33
33
34
- if ( applied ) {
34
+ if ( nextIntermediates . length > 0 ) {
35
35
intermediates = nextIntermediates ;
36
36
}
37
+
38
+ rule . intermediatesCache = null ;
37
39
}
38
40
39
41
return { variants : intermediates } ;
Original file line number Diff line number Diff line change @@ -42,18 +42,20 @@ export class MultireplacerRule<Context>
42
42
? intermediate . value . replace ( this . splitter , replacerFn )
43
43
: replacerFn ( intermediate . value ) ;
44
44
45
- let newIntermediate = new Intermediate < Context > (
46
- newValue ,
47
- intermediate ,
48
- variant ,
49
- ) ;
50
-
51
- if ( this . intermediatesCache ) {
52
- newIntermediate = this . intermediatesCache . resolve ( newIntermediate ) ;
53
- }
45
+ if ( newValue !== intermediate . value ) {
46
+ let newIntermediate = new Intermediate < Context > (
47
+ newValue ,
48
+ intermediate ,
49
+ variant ,
50
+ ) ;
51
+
52
+ if ( this . intermediatesCache ) {
53
+ newIntermediate = this . intermediatesCache . resolve ( newIntermediate ) ;
54
+ }
54
55
55
- if ( ! results . includes ( newIntermediate ) ) {
56
- results . push ( newIntermediate ) ;
56
+ if ( ! results . includes ( newIntermediate ) ) {
57
+ results . push ( newIntermediate ) ;
58
+ }
57
59
}
58
60
}
59
61
You can’t perform that action at this time.
0 commit comments