@guillaume-docquier/tools-ts 7.0.0 → 7.1.0

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/README.md CHANGED
@@ -58,11 +58,12 @@ Use this tool when code needs shared ordering helpers.
58
58
  Use these tools when code needs injectable randomness or deterministic
59
59
  pseudo-random sequences.
60
60
 
61
- | Export | What it is | Use it when |
62
- | ---------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
63
- | `Rng` | Builds an RNG facade from a generator that returns values in [0, 1). | You need range-aware random numbers, shuffling, or draws backed by injectable randomness. |
64
- | `Generator` | Type for raw generators that return values in [0, 1). | You accept or provide the primitive random source used to construct an `Rng`. |
65
- | `mulberry32Prng` | Deterministic seeded pseudo-random generator factory. | Tests, simulations, or generation code need repeatable pseudo-random sequences. |
61
+ | Export | What it is | Use it when |
62
+ | ---------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
63
+ | `Rng` | Builds a stateful RNG facade from a serializable generator. | You need range-aware random numbers, shuffling, draws, or resumable random sequences. |
64
+ | `RngState` | Serializable generator and cached-normal state captured by `Rng`. | You need to persist an `Rng` and resume its exact sequence later. |
65
+ | `Generator` | Contract for random sources that expose their serializable state. | You provide the primitive, resumable random source used to construct an `Rng`. |
66
+ | `mulberry32Prng` | Deterministic, resumable Mulberry32 generator factory. | Tests, simulations, or generation code need repeatable pseudo-random sequences. |
66
67
 
67
68
  ### Utility Types
68
69
 
@@ -26,7 +26,8 @@ export type { LoggerContext } from "./logging/log-context/LoggerContext.js";
26
26
  export type { LogContextProvider } from "./logging/log-context/LogContextProvider.js";
27
27
  export { debounce } from "./debounce.js";
28
28
  export { Sort } from "./Sort.js";
29
- export { Rng, type Generator } from "./rng/Rng.js";
29
+ export { Rng, type RngState } from "./rng/Rng.js";
30
+ export type { Generator } from "./rng/Generator.js";
30
31
  export { mulberry32Prng } from "./rng/mulberry32prng.js";
31
32
  export { Datetime } from "./Datetime.js";
32
33
  export { Angle, UnitOfAngle } from "./measurements/Angle.js";
@@ -1 +1 @@
1
- {"version":3,"file":"entry.tools-ts.js","sourceRoot":"","sources":["../src/entry.tools-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,GAAG,EAAkB,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,OAAO,EAAW,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAY,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAgB,OAAO,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"entry.tools-ts.js","sourceRoot":"","sources":["../src/entry.tools-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,GAAG,EAAiB,MAAM,cAAc,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,OAAO,EAAW,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAY,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAgB,OAAO,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * A stateful generator that returns numbers in the range [0, 1).
3
+ * Its state must be serializable so the generated sequence can be resumed.
4
+ */
5
+ export type Generator<TState = unknown> = {
6
+ next: () => number;
7
+ getState: () => TState;
8
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generator.js","sourceRoot":"","sources":["../../src/rng/Generator.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { Generator } from "./Generator.js";
2
+ export declare function createGeneratorStub(value: number | (() => number)): Generator<null>;
@@ -0,0 +1,8 @@
1
+ import { TypeGuard } from "../TypeGuard.js";
2
+ export function createGeneratorStub(value) {
3
+ return {
4
+ next: TypeGuard.isNumber(value) ? () => value : value,
5
+ getState: () => null,
6
+ };
7
+ }
8
+ //# sourceMappingURL=Generator.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generator.stub.js","sourceRoot":"","sources":["../../src/rng/Generator.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,MAAM,UAAU,mBAAmB,CAAC,KAA8B;IAChE,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;QACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;KACrB,CAAA;AACH,CAAC"}
package/dist/rng/Rng.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { Range } from "../Range.js";
2
- /**
3
- * A generator that returns numbers in the range [0, 1)
4
- */
5
- export type Generator = () => number;
6
- export type Rng = {
2
+ import { type Generator } from "./Generator.js";
3
+ export type RngState<TGeneratorState> = {
4
+ generatorState: TGeneratorState;
5
+ spareNormal: number | null;
6
+ };
7
+ export type Rng<TGeneratorState = unknown> = {
7
8
  /**
8
9
  * Generates a random number based on the given Range.
9
10
  * It will output an int given an int Range, or a float given a float Range.
@@ -36,11 +37,19 @@ export type Rng = {
36
37
  * The std is the spread of the distribution (default: 1)
37
38
  */
38
39
  normal: (mean?: number, std?: number) => number;
40
+ /**
41
+ * Returns the state required to resume the random sequence.
42
+ */
43
+ getState: () => RngState<TGeneratorState>;
39
44
  };
40
45
  export declare const Rng: {
41
46
  /**
42
47
  * Creates a random number generator based on your generator of choice.
43
48
  * @param generator The generator that returns numbers in the range [0, 1)
44
49
  */
45
- create: (generator: Generator) => Rng;
50
+ create<TGeneratorState>(generator: Generator<TGeneratorState>): Rng<TGeneratorState>;
51
+ /**
52
+ * Restores a random number generator from previously captured state.
53
+ */
54
+ fromState<TGeneratorState>(state: RngState<TGeneratorState>, createGenerator: (state: TGeneratorState) => Generator<TGeneratorState>): Rng<TGeneratorState>;
46
55
  };
package/dist/rng/Rng.js CHANGED
@@ -8,74 +8,90 @@ export const Rng = {
8
8
  * Creates a random number generator based on your generator of choice.
9
9
  * @param generator The generator that returns numbers in the range [0, 1)
10
10
  */
11
- create: (generator) => {
12
- function random(range) {
13
- switch (range.numericType) {
14
- case "float":
15
- // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- The fact we have to cast like this sucks a little bit, we'll see if we have to do this often or not.
16
- return float(range);
17
- case "integer":
18
- // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- The fact we have to cast like this sucks a little bit, we'll see if we have to do this often or not.
19
- return int(range);
20
- }
21
- }
22
- function float(range) {
23
- if (range === undefined) {
24
- return generator();
25
- }
26
- // Because of floating point errors, this is inclusive when min > 1, but that's statistically insignificant.
27
- return range.min + generator() * (range.max - range.min);
28
- }
29
- function int(range) {
30
- // We +1 the max because float is exclusive of the max, but for int we want the range to be inclusive.
31
- // We floor before the addition, because the addition can lose precision and generate numbers that are out of bounds when float ~= 1.
32
- // We don't use Math.floor(float(rangeWithMaxPlus1)) for the same reason
33
- return range.min + Math.floor(float() * (range.max + intBoundsOffset[range.maxBoundType] - range.min));
11
+ create(generator) {
12
+ return createRng(generator, null);
13
+ },
14
+ /**
15
+ * Restores a random number generator from previously captured state.
16
+ */
17
+ fromState(state, createGenerator) {
18
+ return createRng(createGenerator(state.generatorState), state.spareNormal);
19
+ },
20
+ };
21
+ function createRng(generator, initialSpareNormal) {
22
+ function random(range) {
23
+ switch (range.numericType) {
24
+ case "float":
25
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- The fact we have to cast like this sucks a little bit, we'll see if we have to do this often or not.
26
+ return float(range);
27
+ case "integer":
28
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- The fact we have to cast like this sucks a little bit, we'll see if we have to do this often or not.
29
+ return int(range);
34
30
  }
35
- /**
36
- * Fisher-Yates shuffle in place.
37
- */
38
- function shuffle(values) {
39
- for (let i = values.length - 1; i > 0; i--) {
40
- const j = Math.floor(generator() * (i + 1));
41
- [values[i], values[j]] = [values[j], values[i]];
42
- }
43
- return values;
31
+ }
32
+ function float(range) {
33
+ if (range === undefined) {
34
+ return generator.next();
44
35
  }
45
- function draw(values, count) {
46
- const shuffled = shuffle(values.slice());
47
- return {
48
- drawn: shuffled,
49
- remaining: shuffled.splice(count),
50
- };
36
+ // Because of floating point errors, this is inclusive when min > 1, but that's statistically insignificant.
37
+ return range.min + generator.next() * (range.max - range.min);
38
+ }
39
+ function int(range) {
40
+ // We +1 the max because float is exclusive of the max, but for int we want the range to be inclusive.
41
+ // We floor before the addition, because the addition can lose precision and generate numbers that are out of bounds when float ~= 1.
42
+ // We don't use Math.floor(float(rangeWithMaxPlus1)) for the same reason
43
+ return range.min + Math.floor(float() * (range.max + intBoundsOffset[range.maxBoundType] - range.min));
44
+ }
45
+ /**
46
+ * Fisher-Yates shuffle in place.
47
+ */
48
+ function shuffle(values) {
49
+ for (let i = values.length - 1; i > 0; i--) {
50
+ const j = Math.floor(generator.next() * (i + 1));
51
+ [values[i], values[j]] = [values[j], values[i]];
51
52
  }
52
- /**
53
- * box-muller outputs 2 numbers, so we keep the extra value that we can return instead of recomputing
54
- */
55
- let spareNormal;
56
- function normal(mean = 0, std = 1) {
57
- if (spareNormal !== undefined) {
58
- const value = spareNormal;
59
- spareNormal = undefined;
60
- return mean + std * value;
61
- }
62
- // u1 must be non-zero
63
- let u1;
64
- do {
65
- u1 = generator();
66
- } while (u1 === 0);
67
- const { z1, z2 } = boxMullerSample(u1, generator());
68
- spareNormal = z1;
69
- return mean + std * z2;
53
+ return values;
54
+ }
55
+ function draw(values, count) {
56
+ const shuffled = shuffle(values.slice());
57
+ return {
58
+ drawn: shuffled,
59
+ remaining: shuffled.splice(count),
60
+ };
61
+ }
62
+ /**
63
+ * box-muller outputs 2 numbers, so we keep the extra value that we can return instead of recomputing
64
+ */
65
+ let spareNormal = initialSpareNormal;
66
+ function normal(mean = 0, std = 1) {
67
+ if (spareNormal !== null) {
68
+ const value = spareNormal;
69
+ spareNormal = null;
70
+ return mean + std * value;
70
71
  }
72
+ // u1 must be non-zero
73
+ let u1;
74
+ do {
75
+ u1 = generator.next();
76
+ } while (u1 === 0);
77
+ const { z1, z2 } = boxMullerSample(u1, generator.next());
78
+ spareNormal = z1;
79
+ return mean + std * z2;
80
+ }
81
+ function getState() {
71
82
  return {
72
- random,
73
- float,
74
- int,
75
- shuffle,
76
- draw,
77
- normal,
83
+ generatorState: generator.getState(),
84
+ spareNormal,
78
85
  };
79
- },
80
- };
86
+ }
87
+ return {
88
+ random,
89
+ float,
90
+ int,
91
+ shuffle,
92
+ draw,
93
+ normal,
94
+ getState,
95
+ };
96
+ }
81
97
  //# sourceMappingURL=Rng.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Rng.js","sourceRoot":"","sources":["../../src/rng/Rng.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Rng.js","sourceRoot":"","sources":["../../src/rng/Rng.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAkDtD,MAAM,eAAe,GAAG;IACtB,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;CAC4C,CAAA;AAE1D,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB;;;OAGG;IACH,MAAM,CAAkB,SAAqC;QAC3D,OAAO,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;OAEG;IACH,SAAS,CACP,KAAgC,EAChC,eAAuE;QAEvE,OAAO,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC5E,CAAC;CACF,CAAA;AAED,SAAS,SAAS,CAAkB,SAAqC,EAAE,kBAAiC;IAC1G,SAAS,MAAM,CAAC,KAAY;QAC1B,QAAQ,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1B,KAAK,OAAO;gBACV,uKAAuK;gBACvK,OAAO,KAAK,CAAC,KAAwC,CAAC,CAAA;YACxD,KAAK,SAAS;gBACZ,uKAAuK;gBACvK,OAAO,GAAG,CAAC,KAAwC,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IAED,SAAS,KAAK,CAAC,KAAsB;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAED,4GAA4G;QAC5G,OAAO,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/D,CAAC;IAED,SAAS,GAAG,CAAC,KAAuB;QAClC,sGAAsG;QACtG,qIAAqI;QACrI,wEAAwE;QACxE,OAAO,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACxG,CAAC;IAED;;OAEG;IACH,SAAS,OAAO,CAAI,MAA0B;QAC5C,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC/C;YAAA,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAClD,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,SAAS,IAAI,CAAI,MAAkC,EAAE,KAAa;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAExC,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;SAClC,CAAA;IACH,CAAC;IAED;;OAEG;IACH,IAAI,WAAW,GAAG,kBAAkB,CAAA;IACpC,SAAS,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;QAC/B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,WAAW,CAAA;YACzB,WAAW,GAAG,IAAI,CAAA;YAClB,OAAO,IAAI,GAAG,GAAG,GAAG,KAAK,CAAA;QAC3B,CAAC;QAED,sBAAsB;QACtB,IAAI,EAAE,CAAA;QACN,GAAG,CAAC;YACF,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QACvB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAC;QAElB,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;QAExD,WAAW,GAAG,EAAE,CAAA;QAChB,OAAO,IAAI,GAAG,GAAG,GAAG,EAAE,CAAA;IACxB,CAAC;IAED,SAAS,QAAQ;QACf,OAAO;YACL,cAAc,EAAE,SAAS,CAAC,QAAQ,EAAE;YACpC,WAAW;SACZ,CAAA;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK;QACL,GAAG;QACH,OAAO;QACP,IAAI;QACJ,MAAM;QACN,QAAQ;KACT,CAAA;AACH,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { Generator } from "./Rng.js";
1
+ import { type Generator } from "./Generator.js";
2
2
  /**
3
3
  * Creates a deterministic pseudo-random number generator based on a 32-bit integer seed using the mulberry32 algorithm.
4
4
  *
5
5
  * It generates floats in the range [0, 1)
6
6
  */
7
- export declare function mulberry32Prng(seed: number): Generator;
7
+ export declare function mulberry32Prng(seed: number): Generator<number>;
@@ -5,12 +5,15 @@
5
5
  */
6
6
  export function mulberry32Prng(seed) {
7
7
  let state = seed >>> 0;
8
- return () => {
9
- state += 0x6d2b79f5;
10
- let next = state;
11
- next = Math.imul(next ^ (next >>> 15), next | 1);
12
- next ^= next + Math.imul(next ^ (next >>> 7), next | 61);
13
- return ((next ^ (next >>> 14)) >>> 0) / 4_294_967_296;
8
+ return {
9
+ next: () => {
10
+ state = (state + 0x6d2b79f5) >>> 0;
11
+ let next = state;
12
+ next = Math.imul(next ^ (next >>> 15), next | 1);
13
+ next ^= next + Math.imul(next ^ (next >>> 7), next | 61);
14
+ return ((next ^ (next >>> 14)) >>> 0) / 4_294_967_296;
15
+ },
16
+ getState: () => state,
14
17
  };
15
18
  }
16
19
  //# sourceMappingURL=mulberry32prng.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mulberry32prng.js","sourceRoot":"","sources":["../../src/rng/mulberry32prng.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAA;IAEtB,OAAO,GAAG,EAAE;QACV,KAAK,IAAI,UAAU,CAAA;QAEnB,IAAI,IAAI,GAAG,KAAK,CAAA;QAChB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;QAChD,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QAExD,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,aAAa,CAAA;IACvD,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"mulberry32prng.js","sourceRoot":"","sources":["../../src/rng/mulberry32prng.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAA;IAEtB,OAAO;QACL,IAAI,EAAE,GAAG,EAAE;YACT,KAAK,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YAElC,IAAI,IAAI,GAAG,KAAK,CAAA;YAChB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;YAChD,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;YAExD,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,aAAa,CAAA;QACvD,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;KACtB,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guillaume-docquier/tools-ts",
3
- "version": "7.0.0",
3
+ "version": "7.1.0",
4
4
  "description": "My personal collection of typescript tools",
5
5
  "homepage": "https://github.com/Guillaume-Docquier/tools-ts",
6
6
  "license": "MIT",