Skip to content

Commit 861e2e4

Browse files
committed
reimplement back shuffling
1 parent cf6baf3 commit 861e2e4

File tree

1 file changed

+40
-11
lines changed

1 file changed

+40
-11
lines changed

src/translator/translator.ts

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import { shuffle } from "@std/random/shuffle";
12
import { errors } from "../../telo_misikeke/telo_misikeke.js";
23
import { IterableResult, ResultError } from "../compound.ts";
34
import { parser } from "../parser/parser.ts";
45
import { settings } from "../settings.ts";
56
import * as EnglishComposer from "./composer.ts";
67
import { multipleSentences } from "./sentence.ts";
78

9+
const RANDOMIZATION_LIMIT = 10000;
10+
811
export 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

Comments
 (0)