@@ -754,16 +754,27 @@ function extractConcatChain(left: StdRegex, right: StdRegex): [number, StdRegex
754
754
}
755
755
}
756
756
757
- /**
758
- * TODO
759
- *
760
- * @public
761
- */
762
- export function * enumerate ( re : StdRegex ) : Generator < string > {
763
- yield * enumerateAux ( re )
757
+ export function enumerate ( regex : StdRegex ) : Stream . Stream < string > {
758
+ return enumerateMemoized ( regex , new Map ( ) )
764
759
}
765
760
766
- export function enumerateAux ( regex : StdRegex ) : Stream . Stream < string > {
761
+ function enumerateMemoized (
762
+ regex : StdRegex ,
763
+ cache : Map < number , Stream . Stream < string > | undefined >
764
+ ) : Stream . Stream < string > {
765
+ const cached = cache . get ( regex . hash )
766
+ if ( cached !== undefined ) {
767
+ return cached
768
+ } else {
769
+ const result = enumerateMemoizedAux ( regex , cache )
770
+ cache . set ( regex . hash , result )
771
+ return result
772
+ }
773
+ }
774
+ function enumerateMemoizedAux (
775
+ regex : StdRegex ,
776
+ cache : Map < number , Stream . Stream < string > | undefined >
777
+ ) : Stream . Stream < string > {
767
778
switch ( regex . type ) {
768
779
case 'epsilon' :
769
780
return Stream . singleton ( '' )
@@ -772,21 +783,21 @@ export function enumerateAux(regex: StdRegex): Stream.Stream<string> {
772
783
case 'concat' :
773
784
return Stream . diagonalize (
774
785
( l , r ) => l + r ,
775
- enumerateAux ( regex . left ) ,
776
- enumerateAux ( regex . right ) ,
786
+ enumerateMemoized ( regex . left , cache ) ,
787
+ enumerateMemoized ( regex . right , cache ) ,
777
788
)
778
789
case 'union' :
779
790
return Stream . interleave (
780
- enumerateAux ( regex . left ) ,
781
- enumerateAux ( regex . right ) ,
791
+ enumerateMemoized ( regex . left , cache ) ,
792
+ enumerateMemoized ( regex . right , cache ) ,
782
793
)
783
794
case 'star' :
784
795
return Stream . cons (
785
796
'' ,
786
797
( ) => Stream . diagonalize (
787
798
( l , r ) => l + r ,
788
- enumerateAux ( regex . inner ) ,
789
- enumerateAux ( regex ) ,
799
+ enumerateMemoized ( regex . inner , cache ) ,
800
+ enumerateMemoized ( regex , cache ) ,
790
801
)
791
802
)
792
803
}
0 commit comments