1+ import { shuffle } from "@std/random/shuffle" ;
12import { errors } from "../../telo_misikeke/telo_misikeke.js" ;
23import { IterableResult , ResultError } from "../compound.ts" ;
34import { parser } from "../parser/parser.ts" ;
45import { settings } from "../settings.ts" ;
56import * as EnglishComposer from "./composer.ts" ;
67import { multipleSentences } from "./sentence.ts" ;
78
9+ const RANDOMIZATION_LIMIT = 10000 ;
10+
811export function translate ( tokiPona : string ) : IterableResult < string > {
912 return new IterableResult ( function * ( ) {
1013 const iterableResult = parser
@@ -15,18 +18,44 @@ export function translate(tokiPona: string): IterableResult<string> {
1518 let yielded = false ;
1619 const aggregateErrors : Array < ResultError > = [ ] ;
1720 const unique : Set < string > = new Set ( ) ;
18- for ( const result of iterableResult . iterable ( ) ) {
19- switch ( result . type ) {
20- case "value" :
21- if ( ! unique . has ( result . value ) ) {
22- yielded = true ;
23- yield result ;
21+ if ( settings . randomize ) {
22+ let i = 0 ;
23+ for ( const result of iterableResult . iterable ( ) ) {
24+ if ( i >= RANDOMIZATION_LIMIT ) {
25+ yield {
26+ type : "error" ,
27+ error : new ResultError ( "too much output to shuffle" ) ,
28+ } ;
29+ return ;
30+ }
31+ switch ( result . type ) {
32+ case "value" :
2433 unique . add ( result . value ) ;
25- }
26- break ;
27- case "error" :
28- aggregateErrors . push ( result . error ) ;
29- break ;
34+ i ++ ;
35+ break ;
36+ case "error" :
37+ aggregateErrors . push ( result . error ) ;
38+ break ;
39+ }
40+ }
41+ for ( const value of shuffle ( [ ...unique ] ) ) {
42+ yielded = true ;
43+ yield { type : "value" , value } ;
44+ }
45+ } else {
46+ for ( const result of iterableResult . iterable ( ) ) {
47+ switch ( result . type ) {
48+ case "value" :
49+ if ( ! unique . has ( result . value ) ) {
50+ yielded = true ;
51+ yield result ;
52+ unique . add ( result . value ) ;
53+ }
54+ break ;
55+ case "error" :
56+ aggregateErrors . push ( result . error ) ;
57+ break ;
58+ }
3059 }
3160 }
3261 if ( ! yielded ) {
0 commit comments