1
+ import { shuffle } from "@std/random/shuffle" ;
1
2
import { errors } from "../../telo_misikeke/telo_misikeke.js" ;
2
3
import { IterableResult , ResultError } from "../compound.ts" ;
3
4
import { parser } from "../parser/parser.ts" ;
4
5
import { settings } from "../settings.ts" ;
5
6
import * as EnglishComposer from "./composer.ts" ;
6
7
import { multipleSentences } from "./sentence.ts" ;
7
8
9
+ const RANDOMIZATION_LIMIT = 10000 ;
10
+
8
11
export function translate ( tokiPona : string ) : IterableResult < string > {
9
12
return new IterableResult ( function * ( ) {
10
13
const iterableResult = parser
@@ -15,18 +18,44 @@ export function translate(tokiPona: string): IterableResult<string> {
15
18
let yielded = false ;
16
19
const aggregateErrors : Array < ResultError > = [ ] ;
17
20
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" :
24
33
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
+ }
30
59
}
31
60
}
32
61
if ( ! yielded ) {
0 commit comments