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
40
41
42
43
44
use crate::{Rng, ValueGenerator};

#[derive(Clone, Debug)]
pub struct MapGenerator<Generator, Map> {
    pub(crate) generator: Generator,
    pub(crate) map: Map,
}

impl<G: ValueGenerator, M: Fn(G::Output) -> T, T> ValueGenerator for MapGenerator<G, M> {
    type Output = T;

    fn generate<R: Rng>(&self, rng: &mut R) -> Self::Output {
        (self.map)(self.generator.generate(rng))
    }
}

#[test]
fn map_test() {
    let _ = generator_test!(gen::<bool>().map(|value| !value));
    let _ = generator_test!(gen::<u8>().map(|value| value > 4));
}

#[derive(Clone, Debug)]
pub struct AndThenGenerator<Generator, AndThen> {
    pub(crate) generator: Generator,
    pub(crate) and_then: AndThen,
}

impl<G: ValueGenerator, H: ValueGenerator, F: Fn(G::Output) -> H> ValueGenerator
    for AndThenGenerator<G, F>
{
    type Output = H::Output;

    fn generate<R: Rng>(&self, rng: &mut R) -> Self::Output {
        let value = self.generator.generate(rng);
        (self.and_then)(value).generate(rng)
    }
}

#[test]
fn and_then_test() {
    let _ = generator_test!(gen::<bool>().and_then(|value| !value));
    let _ = generator_test!(gen::<u8>().and_then(|value| value..));
}