@@ -146,19 +146,58 @@ class PseudolangWordGenerator extends Wordset {
146146}
147147
148148export class PolyglotWordset extends Wordset {
149- public wordsWithLanguage : Map < string , Language > ;
150- public languageProperties : Map < Language , JSONData . LanguageProperties > ;
149+ readonly wordsMap : Map < Language , Wordset > ;
150+ readonly languageProperties : Map < Language , JSONData . LanguageProperties > ;
151+ private currLang : Language ;
152+ readonly langs : Language [ ] ;
151153
152154 constructor (
153- wordsWithLanguage : Map < string , Language > ,
155+ wordsMap : Map < Language , Wordset > ,
154156 languageProperties : Map < Language , JSONData . LanguageProperties > ,
155157 ) {
156- // build and shuffle the word array
157- const wordArray = Array . from ( wordsWithLanguage . keys ( ) ) ;
158- Arrays . shuffle ( wordArray ) ;
159- super ( wordArray ) ;
160- this . wordsWithLanguage = wordsWithLanguage ;
158+ super ( [ ] ) ;
161159 this . languageProperties = languageProperties ;
160+ this . langs = Array . from ( languageProperties . keys ( ) ) ;
161+ this . wordsMap = wordsMap ;
162+ this . resetIndexes ( ) ;
163+ this . length = Array . from ( this . wordsMap . values ( ) ) . reduce (
164+ ( sum , ws ) => sum + ws . words . length ,
165+ 0 ,
166+ ) ;
167+ this . currLang = this . langs [ 0 ] as Language ;
168+ }
169+
170+ get currentLanguage ( ) : Language {
171+ return this . currLang ;
172+ }
173+
174+ override resetIndexes ( ) : void {
175+ this . wordsMap . forEach ( ( ws , _ ) => {
176+ ws . resetIndexes ( ) ;
177+ } ) ;
178+ }
179+
180+ private uniformLang ( ) : Language {
181+ const index = Math . floor ( Math . random ( ) * this . langs . length ) ;
182+ this . currLang = this . langs [ index ] as Language ;
183+ return this . currLang ;
184+ }
185+
186+ private getWordset ( ) : Wordset {
187+ const lang = this . uniformLang ( ) ;
188+ return this . wordsMap . get ( lang ) as Wordset ;
189+ }
190+
191+ override randomWord ( mode : FunboxWordsFrequency ) : string {
192+ return this . getWordset ( ) . randomWord ( mode ) ;
193+ }
194+
195+ override shuffledWord ( ) : string {
196+ return this . getWordset ( ) . shuffledWord ( ) ;
197+ }
198+
199+ override nextWord ( ) : string {
200+ return this . getWordset ( ) . nextWord ( ) ;
162201 }
163202}
164203
@@ -764,13 +803,10 @@ const list: Partial<Record<FunboxName, FunboxFunctions>> = {
764803 ] ) ,
765804 ) ;
766805
767- const wordsWithLanguage = new Map (
768- languages . flatMap ( ( lang ) =>
769- lang . words . map ( ( word ) => [ word , lang . name ] ) ,
770- ) ,
806+ const wordsMap : Map < Language , Wordset > = new Map (
807+ languages . map ( ( lang ) => [ lang . name , new Wordset ( lang . words ) ] ) ,
771808 ) ;
772-
773- return new PolyglotWordset ( wordsWithLanguage , languageProperties ) ;
809+ return new PolyglotWordset ( wordsMap , languageProperties ) ;
774810 } ,
775811 } ,
776812} ;
0 commit comments