osom_lib_rand/randomness_sources/
constant_randomness_source.rs

1use crate::number::Number;
2use crate::pseudo_random_number_generators::LinearCongruentialGenerator;
3use crate::traits::RandomnessSource;
4
5/// A trivial [`RandomnessSource`] that always returns the same sequence of
6/// values based on a seed. Which by default is constant as well.
7///
8/// # Warning
9///
10/// This struct should only be used for testing purposes, not in production.
11#[derive(Debug, Clone, PartialEq, Eq)]
12#[must_use]
13#[repr(transparent)]
14pub struct ConstantRandomnessSource<ANumber: Number> {
15    generator: LinearCongruentialGenerator<ANumber>,
16}
17
18impl<ANumber: Number> ConstantRandomnessSource<ANumber> {
19    /// Creates a new [`ConstantRandomnessSource`] with the given seed.
20    pub fn new(seed: ANumber) -> Self {
21        Self {
22            generator: LinearCongruentialGenerator::new(seed),
23        }
24    }
25}
26
27impl<ANumber: Number> RandomnessSource for ConstantRandomnessSource<ANumber> {
28    type TNumber = ANumber;
29
30    fn next_number(&mut self) -> Self::TNumber {
31        self.generator.next_value()
32    }
33}
34
35impl<ANumber: Number> Default for ConstantRandomnessSource<ANumber> {
36    fn default() -> Self {
37        Self::new(ANumber::ONE)
38    }
39}