@@ -754,16 +754,27 @@ function extractConcatChain(left: StdRegex, right: StdRegex): [number, StdRegex
754754 }
755755}
756756
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 ( ) )
764759}
765760
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 > {
767778 switch ( regex . type ) {
768779 case 'epsilon' :
769780 return Stream . singleton ( '' )
@@ -772,21 +783,21 @@ export function enumerateAux(regex: StdRegex): Stream.Stream<string> {
772783 case 'concat' :
773784 return Stream . diagonalize (
774785 ( l , r ) => l + r ,
775- enumerateAux ( regex . left ) ,
776- enumerateAux ( regex . right ) ,
786+ enumerateMemoized ( regex . left , cache ) ,
787+ enumerateMemoized ( regex . right , cache ) ,
777788 )
778789 case 'union' :
779790 return Stream . interleave (
780- enumerateAux ( regex . left ) ,
781- enumerateAux ( regex . right ) ,
791+ enumerateMemoized ( regex . left , cache ) ,
792+ enumerateMemoized ( regex . right , cache ) ,
782793 )
783794 case 'star' :
784795 return Stream . cons (
785796 '' ,
786797 ( ) => Stream . diagonalize (
787798 ( l , r ) => l + r ,
788- enumerateAux ( regex . inner ) ,
789- enumerateAux ( regex ) ,
799+ enumerateMemoized ( regex . inner , cache ) ,
800+ enumerateMemoized ( regex , cache ) ,
790801 )
791802 )
792803 }
0 commit comments