checkito 5.0.0

A safe, efficient and simple QuickCheck-inspired library to generate shrinkable random data mainly oriented towards generative/property/exploratory testing.
Documentation
use crate::{generate::Generate, state::State, utility};

#[derive(Clone, Debug)]
pub struct Dampen<G: ?Sized> {
    pressure: f64,
    deepest: usize,
    limit: usize,
    generator: G,
}

impl<G> Dampen<G> {
    pub const fn new(pressure: f64, deepest: usize, limit: usize, generator: G) -> Self {
        assert!(pressure.is_finite());
        Self {
            pressure: utility::f64::max(pressure, 0.0),
            deepest,
            limit,
            generator,
        }
    }
}

impl<G: Generate + ?Sized> Generate for Dampen<G> {
    type Item = G::Item;
    type Shrink = G::Shrink;

    const CARDINALITY: Option<u128> = G::CARDINALITY;

    fn generate(&self, state: &mut State) -> Self::Shrink {
        self.generator.generate(
            state
                .dampen(self.deepest, self.limit, self.pressure)
                .as_mut(),
        )
    }

    fn cardinality(&self) -> Option<u128> {
        self.generator.cardinality()
    }
}