deep_causality_rand/traits/
sample_uniform.rs

1/*
2 * SPDX-License-Identifier: MIT
3 * Copyright (c) "2025" . The DeepCausality Authors and Contributors. All Rights Reserved.
4 */
5
6use crate::{Rng, SampleBorrow, UniformDistributionError};
7
8pub trait SampleUniform: Sized {
9    type Sampler: UniformSampler<X = Self>;
10}
11
12pub trait UniformSampler: Sized {
13    type X;
14
15    fn new<B1, B2>(low: B1, high: B2) -> Result<Self, UniformDistributionError>
16    where
17        B1: SampleBorrow<Self::X> + Sized,
18        B2: SampleBorrow<Self::X> + Sized;
19
20    fn new_inclusive<B1, B2>(low: B1, high: B2) -> Result<Self, UniformDistributionError>
21    where
22        B1: SampleBorrow<Self::X> + Sized,
23        B2: SampleBorrow<Self::X> + Sized;
24
25    fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X;
26
27    fn sample_single<R: Rng + ?Sized, B1, B2>(
28        low: B1,
29        high: B2,
30        rng: &mut R,
31    ) -> Result<Self::X, UniformDistributionError>
32    where
33        B1: SampleBorrow<Self::X> + Sized,
34        B2: SampleBorrow<Self::X> + Sized,
35    {
36        let uniform: Self = UniformSampler::new(low, high)?;
37        Ok(uniform.sample(rng))
38    }
39
40    fn sample_single_inclusive<R: Rng + ?Sized, B1, B2>(
41        low: B1,
42        high: B2,
43        rng: &mut R,
44    ) -> Result<Self::X, UniformDistributionError>
45    where
46        B1: SampleBorrow<Self::X> + Sized,
47        B2: SampleBorrow<Self::X> + Sized,
48    {
49        let uniform: Self = UniformSampler::new_inclusive(low, high)?;
50        Ok(uniform.sample(rng))
51    }
52}