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
use crate::generate::{Generate, State};
#[derive(Clone, Debug, Default)]
pub struct Filter<I: ?Sized, F = fn(&<I as Generate>::Item) -> bool> {
filter: F,
iterations: usize,
inner: I,
}
impl<G: Generate, F: Fn(&G::Item) -> bool> Filter<G, F> {
pub const fn new(generate: G, filter: F, iterations: usize) -> Self {
Self {
inner: generate,
filter,
iterations,
}
}
}
impl<G: Generate + ?Sized, F: Fn(&G::Item) -> bool + Clone> Generate for Filter<G, F> {
type Item = Option<G::Item>;
type Shrink = Option<G::Shrink>;
fn generate(&self, state: &mut State) -> (Self::Item, Self::Shrink) {
for _ in 0..self.iterations {
let (item, shrink) = self.inner.generate(state);
if (self.filter)(&item) {
return (Some(item), Some(shrink));
}
}
(None, None)
}
}