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}