checkito/
dampen.rs

1use crate::{
2    check::Sizes,
3    generate::{Generate, State},
4};
5
6#[derive(Clone, Debug)]
7pub struct Dampen<G: ?Sized> {
8    pub(crate) pressure: f64,
9    pub(crate) deepest: usize,
10    pub(crate) limit: usize,
11    pub(crate) generator: G,
12}
13
14impl<G: Generate + ?Sized> Generate for Dampen<G> {
15    type Item = G::Item;
16    type Shrink = G::Shrink;
17
18    fn generate(&self, state: &mut State) -> Self::Shrink {
19        let old = state.size;
20        let new = if state.depth as usize >= self.deepest || state.limit as usize >= self.limit {
21            0.0
22        } else {
23            old.start() / (state.depth as f64 * self.pressure).max(1.0)
24        };
25        state.size = Sizes::from(new..=old.end());
26        let shrinker = self.generator.generate(state);
27        state.size = old;
28        shrinker
29    }
30
31    fn constant(&self) -> bool {
32        self.generator.constant()
33    }
34}