use rand::{Rng, SeedableRng};
pub const DEFAULT_SEED_FOR_TESTS: u64 = 42;
pub type StandardRng = rand::rngs::StdRng;
pub fn create_rnd_from_seed(seed: u64) -> StandardRng {
rand::rngs::StdRng::seed_from_u64(seed)
}
pub fn create_rnd_in_tests() -> StandardRng {
create_rnd_from_seed(DEFAULT_SEED_FOR_TESTS)
}
pub fn create_rnd_from_seed_in_tests(seed: u64) -> StandardRng {
create_rnd_from_seed(seed)
}
#[cfg(not(any(test, feature = "testing")))]
#[allow(clippy::disallowed_methods)]
pub fn create_rnd() -> StandardRng {
rand::rngs::StdRng::from_os_rng()
}
#[cfg(any(test, feature = "testing"))]
pub fn create_rnd() -> StandardRng {
create_rnd_from_seed(DEFAULT_SEED_FOR_TESTS)
}
pub fn create_rnd_provider_from_seed(seed: u64) -> RandomProvider<StandardRng> {
RandomProvider {
seed: Some(seed),
factory: rand::rngs::StdRng::seed_from_u64,
}
}
pub fn create_rnd_provider_from_seed_in_tests(seed: u64) -> RandomProvider<StandardRng> {
RandomProvider {
seed: Some(seed),
factory: rand::rngs::StdRng::seed_from_u64,
}
}
#[cfg(not(any(test, feature = "testing")))]
pub fn create_rnd_provider() -> RandomProvider<StandardRng> {
RandomProvider {
seed: None,
factory: |_seed| create_rnd(),
}
}
#[cfg(any(test, feature = "testing"))]
pub fn create_rnd_provider() -> RandomProvider<StandardRng> {
RandomProvider {
seed: None,
factory: rand::rngs::StdRng::seed_from_u64,
}
}
pub fn create_rnd_from_optional_seed(optional_seed: Option<u64>) -> StandardRng {
match optional_seed {
Some(seed) => create_rnd_from_seed(seed),
None => create_rnd(),
}
}
pub fn create_rnd_provider_from_optional_seed(
optional_seed: Option<u64>,
) -> RandomProvider<StandardRng> {
match optional_seed {
Some(seed) => create_rnd_provider_from_seed(seed),
None => create_rnd_provider(),
}
}
pub struct RandomProvider<T: Rng + 'static> {
seed: Option<u64>,
factory: fn(u64) -> T,
}
impl<T: Rng + 'static> RandomProvider<T> {
pub fn create_rnd(&self) -> T {
match self.seed {
Some(seed) => (self.factory)(seed),
None => (self.factory)(DEFAULT_SEED_FOR_TESTS),
}
}
pub fn create_rnd_from_seed(&self, additional_seed: u64) -> T {
match self.seed {
Some(seed) => (self.factory)(seed.wrapping_add(additional_seed)),
None => (self.factory)(additional_seed),
}
}
}