All files / kernel-agents-repl/src/strategies/repl random.ts

92.3% Statements 12/13
83.33% Branches 5/6
100% Functions 3/3
92.3% Lines 12/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 401x                   1x 48x 48x 48x 48x                     1x 1x 1x 48x       48x       48x      
const MAX_LENGTH = 8;
 
/**
 * A simple seeded random number generator
 * Not cryptographically secure.
 *
 * @param a - The seed to use for the PRNG.
 * @returns A PsuedoRandomNumberGenerator.
 */
/* eslint-disable */ // CTRL+V implementation from https://stackoverflow.com/a/47593316/1123955
const mulberry32 = (a: number): number => {
  let t = (a += 0x6d2b79f5);
  t = Math.imul(t ^ (t >>> 15), t | 1);
  t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
  return (t ^ (t >>> 14)) >>> 0;
};
/* eslint-enable */
 
/**
 * Make a PsuedoRandomNumberGenerator.
 *
 * @param args - The arguments to make the PRNG.
 * @param args.seed - The seed to use for the PRNG.
 * @returns A PsuedoRandomNumberGenerator.
 */
export const makeRandom = ({ seed }: { seed?: number }) => {
  let _seed = seed ?? 1;
  return (length: number = MAX_LENGTH, radix: number = 16): string => {
    Iif (length > MAX_LENGTH) {
      throw new Error(`Length must be less than or equal to ${MAX_LENGTH}`);
    }
    // Get a random 32-bit unsigned integer and update the seed
    _seed = mulberry32(_seed);
 
    // Convert to hex and slice to desired length
    // padStart ensures we have leading zeros if needed
    return _seed.toString(radix).padStart(length, '0').slice(0, length);
  };
};