deep_causality_rand/traits/
sample_uniform.rs1use 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}