@reventlessdev/reventless-seed 1.0.0-alpha.1 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +67 -0
- package/lib/bs/.compiler.log +2 -2
- package/lib/bs/.sourcedirs.json +1 -0
- package/lib/bs/ReventlessSeed.cmi +0 -0
- package/lib/bs/ReventlessSeed.cmt +0 -0
- package/lib/bs/ReventlessSeed.mlmap +3 -0
- package/lib/bs/compiler-info.json +2 -2
- package/lib/bs/src/Seed-ReventlessSeed.cmi +0 -0
- package/lib/bs/src/Seed-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed.ast +0 -0
- package/lib/bs/src/Seed.res +19 -0
- package/lib/bs/src/Seed.res.mjs +6 -0
- package/lib/bs/src/Seed_Client-ReventlessSeed.cmi +0 -0
- package/lib/bs/src/Seed_Client-ReventlessSeed.cmj +0 -0
- package/lib/bs/src/Seed_Client-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Client.ast +0 -0
- package/lib/bs/src/Seed_Client.res +62 -11
- package/lib/bs/src/Seed_Client.res.mjs +51 -5
- package/lib/bs/src/Seed_Connect-ReventlessSeed.cmi +0 -0
- package/lib/bs/src/Seed_Connect-ReventlessSeed.cmj +0 -0
- package/lib/bs/src/Seed_Connect-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Connect.ast +0 -0
- package/lib/bs/src/Seed_Connect.res +86 -0
- package/lib/bs/src/Seed_Connect.res.mjs +62 -0
- package/lib/bs/src/Seed_Prompt-ReventlessSeed.cmi +0 -0
- package/lib/bs/src/Seed_Prompt-ReventlessSeed.cmj +0 -0
- package/lib/bs/src/Seed_Prompt-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Prompt.ast +0 -0
- package/lib/bs/src/Seed_Prompt.res +178 -0
- package/lib/bs/src/Seed_Prompt.res.mjs +172 -0
- package/lib/bs/src/Seed_Random-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Runner-ReventlessSeed.cmi +0 -0
- package/lib/bs/src/Seed_Runner-ReventlessSeed.cmj +0 -0
- package/lib/bs/src/Seed_Runner-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Runner.ast +0 -0
- package/lib/bs/src/Seed_Runner.res +122 -6
- package/lib/bs/src/Seed_Runner.res.mjs +87 -1
- package/lib/bs/src/Seed_Types-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Upload-ReventlessSeed.cmi +0 -0
- package/lib/bs/src/Seed_Upload-ReventlessSeed.cmj +0 -0
- package/lib/bs/src/Seed_Upload-ReventlessSeed.cmt +0 -0
- package/lib/bs/src/Seed_Upload.ast +0 -0
- package/lib/bs/src/Seed_Upload.res +40 -42
- package/lib/bs/src/Seed_Upload.res.mjs +65 -69
- package/lib/bs/tests/Seed_RandomTest-ReventlessSeed.cmi +0 -0
- package/lib/bs/tests/Seed_RandomTest-ReventlessSeed.cmj +0 -0
- package/lib/bs/tests/Seed_RandomTest-ReventlessSeed.cmt +0 -0
- package/lib/bs/tests/Seed_RandomTest.ast +0 -0
- package/lib/bs/tests/Seed_RandomTest.res +160 -0
- package/lib/bs/tests/Seed_RandomTest.res.mjs +208 -0
- package/lib/ocaml/.compiler.log +2 -2
- package/lib/ocaml/ReventlessSeed.cmi +0 -0
- package/lib/ocaml/ReventlessSeed.cmt +0 -0
- package/lib/ocaml/ReventlessSeed.mlmap +3 -0
- package/lib/ocaml/Seed-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed.ast +0 -0
- package/lib/ocaml/Seed.res +19 -0
- package/lib/ocaml/Seed_Client-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed_Client-ReventlessSeed.cmj +0 -0
- package/lib/ocaml/Seed_Client-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_Client.ast +0 -0
- package/lib/ocaml/Seed_Client.res +62 -11
- package/lib/ocaml/Seed_Connect-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed_Connect-ReventlessSeed.cmj +0 -0
- package/lib/ocaml/Seed_Connect-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_Connect.ast +0 -0
- package/lib/ocaml/Seed_Connect.res +86 -0
- package/lib/ocaml/Seed_Prompt-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed_Prompt-ReventlessSeed.cmj +0 -0
- package/lib/ocaml/Seed_Prompt-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_Prompt.ast +0 -0
- package/lib/ocaml/Seed_Prompt.res +178 -0
- package/lib/ocaml/Seed_Random-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_RandomTest-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed_RandomTest-ReventlessSeed.cmj +0 -0
- package/lib/ocaml/Seed_RandomTest-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_RandomTest.ast +0 -0
- package/lib/ocaml/Seed_RandomTest.res +160 -0
- package/lib/ocaml/Seed_Runner-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed_Runner-ReventlessSeed.cmj +0 -0
- package/lib/ocaml/Seed_Runner-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_Runner.ast +0 -0
- package/lib/ocaml/Seed_Runner.res +122 -6
- package/lib/ocaml/Seed_Types-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_Upload-ReventlessSeed.cmi +0 -0
- package/lib/ocaml/Seed_Upload-ReventlessSeed.cmj +0 -0
- package/lib/ocaml/Seed_Upload-ReventlessSeed.cmt +0 -0
- package/lib/ocaml/Seed_Upload.ast +0 -0
- package/lib/ocaml/Seed_Upload.res +40 -42
- package/package.json +6 -2
- package/rescript.json +9 -1
- package/src/Seed.res +19 -0
- package/src/Seed.res.mjs +6 -0
- package/src/Seed_Client.res +62 -11
- package/src/Seed_Client.res.mjs +51 -5
- package/src/Seed_Connect.res +86 -0
- package/src/Seed_Connect.res.mjs +62 -0
- package/src/Seed_Prompt.res +178 -0
- package/src/Seed_Prompt.res.mjs +172 -0
- package/src/Seed_Runner.res +122 -6
- package/src/Seed_Runner.res.mjs +87 -1
- package/src/Seed_Upload.res +40 -42
- package/src/Seed_Upload.res.mjs +65 -69
- package/tests/Seed_RandomTest.res +160 -0
- package/tests/Seed_RandomTest.res.mjs +208 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
4
|
+
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
5
|
+
import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
|
|
6
|
+
import * as Primitive_string from "@rescript/runtime/lib/es6/Primitive_string.js";
|
|
7
|
+
import * as Seed_Random$ReventlessSeed from "../src/Seed_Random.res.mjs";
|
|
8
|
+
|
|
9
|
+
globalThis.describe("Seed_Random:", () => {
|
|
10
|
+
let take = (seed, n) => {
|
|
11
|
+
let r = Seed_Random$ReventlessSeed.make(seed);
|
|
12
|
+
return Stdlib_Array.make(n, 0.0).map(param => Seed_Random$ReventlessSeed.float(r));
|
|
13
|
+
};
|
|
14
|
+
globalThis.describe("reproducibility — the reason this module exists:", () => {
|
|
15
|
+
globalThis.test("the same seed replays the same sequence", () => {
|
|
16
|
+
globalThis.expect(take(42, 25)).toEqual(take(42, 25));
|
|
17
|
+
});
|
|
18
|
+
globalThis.test("different seeds diverge", () => {
|
|
19
|
+
globalThis.expect(Primitive_object.equal(take(42, 25), take(43, 25))).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
globalThis.test("a fresh generator does not continue the previous one", () => {
|
|
22
|
+
let r = Seed_Random$ReventlessSeed.make(7);
|
|
23
|
+
let first = Seed_Random$ReventlessSeed.float(r);
|
|
24
|
+
Seed_Random$ReventlessSeed.float(r);
|
|
25
|
+
globalThis.expect(Seed_Random$ReventlessSeed.float(Seed_Random$ReventlessSeed.make(7))).toEqual(first);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
globalThis.describe("float stays a unit interval:", () => {
|
|
29
|
+
globalThis.test("every draw is in [0, 1)", () => {
|
|
30
|
+
globalThis.expect(take(99, 500).every(f => {
|
|
31
|
+
if (f >= 0.0) {
|
|
32
|
+
return f < 1.0;
|
|
33
|
+
} else {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
})).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
globalThis.test("and the draws are not all the same value", () => {
|
|
39
|
+
let draws = take(99, 100);
|
|
40
|
+
globalThis.expect(draws.some(f => f !== draws[0])).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
globalThis.describe("int is inclusive on both ends, as documented:", () => {
|
|
44
|
+
let draws = (min, max, n) => {
|
|
45
|
+
let r = Seed_Random$ReventlessSeed.make(5);
|
|
46
|
+
return Stdlib_Array.make(n, 0).map(param => Seed_Random$ReventlessSeed.int(r, min, max));
|
|
47
|
+
};
|
|
48
|
+
globalThis.test("never escapes the range", () => {
|
|
49
|
+
globalThis.expect(draws(3, 7, 500).every(i => {
|
|
50
|
+
if (i >= 3) {
|
|
51
|
+
return i <= 7;
|
|
52
|
+
} else {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
})).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
globalThis.test("reaches both bounds", () => {
|
|
58
|
+
let d = draws(3, 7, 500);
|
|
59
|
+
globalThis.expect([
|
|
60
|
+
d.includes(3),
|
|
61
|
+
d.includes(7)
|
|
62
|
+
]).toEqual([
|
|
63
|
+
true,
|
|
64
|
+
true
|
|
65
|
+
]);
|
|
66
|
+
});
|
|
67
|
+
globalThis.test("a single-value range is that value", () => {
|
|
68
|
+
globalThis.expect(draws(4, 4, 10).every(i => i === 4)).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
globalThis.describe("pick:", () => {
|
|
72
|
+
globalThis.test("returns None for an empty array", () => {
|
|
73
|
+
globalThis.expect(Seed_Random$ReventlessSeed.pick(Seed_Random$ReventlessSeed.make(1), [])).toEqual(undefined);
|
|
74
|
+
});
|
|
75
|
+
globalThis.test("always lands on a member", () => {
|
|
76
|
+
let r = Seed_Random$ReventlessSeed.make(2);
|
|
77
|
+
let xs = [
|
|
78
|
+
"a",
|
|
79
|
+
"b",
|
|
80
|
+
"c",
|
|
81
|
+
"d"
|
|
82
|
+
];
|
|
83
|
+
let hits = Stdlib_Array.make(200, "").map(param => Seed_Random$ReventlessSeed.pickOr(r, "MISS", xs));
|
|
84
|
+
globalThis.expect(hits.every(h => xs.includes(h))).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
globalThis.test("pickOr falls back only when there is nothing to pick", () => {
|
|
87
|
+
globalThis.expect(Seed_Random$ReventlessSeed.pickOr(Seed_Random$ReventlessSeed.make(3), "fallback", [])).toBe("fallback");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
globalThis.describe("sampleWeighted is without replacement:", () => {
|
|
91
|
+
let equal = xs => xs.map(x => [
|
|
92
|
+
x,
|
|
93
|
+
1.0
|
|
94
|
+
]);
|
|
95
|
+
globalThis.test("count = length yields a permutation, not a multiset", () => {
|
|
96
|
+
let xs = [
|
|
97
|
+
"a",
|
|
98
|
+
"b",
|
|
99
|
+
"c",
|
|
100
|
+
"d",
|
|
101
|
+
"e"
|
|
102
|
+
];
|
|
103
|
+
let out = Seed_Random$ReventlessSeed.sampleWeighted(Seed_Random$ReventlessSeed.make(11), equal(xs), 5);
|
|
104
|
+
let sorted = out.toSorted(Primitive_string.compare);
|
|
105
|
+
globalThis.expect([
|
|
106
|
+
out.length,
|
|
107
|
+
sorted
|
|
108
|
+
]).toEqual([
|
|
109
|
+
5,
|
|
110
|
+
[
|
|
111
|
+
"a",
|
|
112
|
+
"b",
|
|
113
|
+
"c",
|
|
114
|
+
"d",
|
|
115
|
+
"e"
|
|
116
|
+
]
|
|
117
|
+
]);
|
|
118
|
+
});
|
|
119
|
+
globalThis.test("count < length returns exactly count distinct items", () => {
|
|
120
|
+
let xs = [
|
|
121
|
+
"a",
|
|
122
|
+
"b",
|
|
123
|
+
"c",
|
|
124
|
+
"d",
|
|
125
|
+
"e"
|
|
126
|
+
];
|
|
127
|
+
let out = Seed_Random$ReventlessSeed.sampleWeighted(Seed_Random$ReventlessSeed.make(12), equal(xs), 3);
|
|
128
|
+
let distinct = new Set(out).size;
|
|
129
|
+
globalThis.expect([
|
|
130
|
+
out.length,
|
|
131
|
+
distinct
|
|
132
|
+
]).toEqual([
|
|
133
|
+
3,
|
|
134
|
+
3
|
|
135
|
+
]);
|
|
136
|
+
});
|
|
137
|
+
globalThis.test("count > length clamps to the pool", () => {
|
|
138
|
+
globalThis.expect(Seed_Random$ReventlessSeed.sampleWeighted(Seed_Random$ReventlessSeed.make(13), equal([
|
|
139
|
+
"a",
|
|
140
|
+
"b"
|
|
141
|
+
]), 99).length).toBe(2);
|
|
142
|
+
});
|
|
143
|
+
globalThis.test("a zero-weight entry is never chosen while others remain", () => {
|
|
144
|
+
let out = Seed_Random$ReventlessSeed.sampleWeighted(Seed_Random$ReventlessSeed.make(14), [
|
|
145
|
+
[
|
|
146
|
+
"never",
|
|
147
|
+
0.0
|
|
148
|
+
],
|
|
149
|
+
[
|
|
150
|
+
"a",
|
|
151
|
+
1.0
|
|
152
|
+
],
|
|
153
|
+
[
|
|
154
|
+
"b",
|
|
155
|
+
1.0
|
|
156
|
+
]
|
|
157
|
+
], 2);
|
|
158
|
+
globalThis.expect(out.includes("never")).toBe(false);
|
|
159
|
+
});
|
|
160
|
+
globalThis.test("is reproducible for a given seed", () => {
|
|
161
|
+
let run = () => Seed_Random$ReventlessSeed.sampleWeighted(Seed_Random$ReventlessSeed.make(15), equal([
|
|
162
|
+
"a",
|
|
163
|
+
"b",
|
|
164
|
+
"c",
|
|
165
|
+
"d",
|
|
166
|
+
"e",
|
|
167
|
+
"f"
|
|
168
|
+
]), 4);
|
|
169
|
+
globalThis.expect(run()).toEqual(run());
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
globalThis.describe("zipfWeights skews toward the head:", () => {
|
|
173
|
+
let weights = Seed_Random$ReventlessSeed.zipfWeights([
|
|
174
|
+
"a",
|
|
175
|
+
"b",
|
|
176
|
+
"c",
|
|
177
|
+
"d",
|
|
178
|
+
"e"
|
|
179
|
+
], 1.1);
|
|
180
|
+
globalThis.test("keeps every item, in order", () => {
|
|
181
|
+
globalThis.expect(weights.map(param => param[0])).toEqual([
|
|
182
|
+
"a",
|
|
183
|
+
"b",
|
|
184
|
+
"c",
|
|
185
|
+
"d",
|
|
186
|
+
"e"
|
|
187
|
+
]);
|
|
188
|
+
});
|
|
189
|
+
globalThis.test("weight decreases monotonically with rank", () => {
|
|
190
|
+
let ws = weights.map(param => param[1]);
|
|
191
|
+
let decreasing = ws.every((w, i) => {
|
|
192
|
+
if (i === 0) {
|
|
193
|
+
return true;
|
|
194
|
+
} else {
|
|
195
|
+
return w < ws[i - 1 | 0];
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
globalThis.expect(decreasing).toBe(true);
|
|
199
|
+
});
|
|
200
|
+
globalThis.test("the leader is clear — first outweighs last several times over", () => {
|
|
201
|
+
let first = Stdlib_Option.mapOr(weights[0], 0.0, param => param[1]);
|
|
202
|
+
let last = Stdlib_Option.mapOr(weights[4], 0.0, param => param[1]);
|
|
203
|
+
globalThis.expect(first > last * 3.0).toBe(true);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
/* Not a pure module */
|