use crate::{
COLLECTS,
any::Any,
array::Array,
boxed::Boxed,
collect::{Collect, Count},
convert::Convert,
dampen::Dampen,
filter::Filter,
filter_map::FilterMap,
flatten::Flatten,
keep::Keep,
map::Map,
prelude,
primitive::{Constant, Range, usize::Usize},
shrink::Shrink,
size::Size,
state::{Sizes, State},
unify::Unify,
};
use core::iter::FromIterator;
pub trait FullGenerate {
type Item;
type Generator: Generate<Item = Self::Item>;
fn generator() -> Self::Generator;
}
#[must_use = "generators do nothing until used"]
pub trait Generate {
type Item;
type Shrink: Shrink<Item = Self::Item>;
const CARDINALITY: Option<u128>;
fn generate(&self, state: &mut State) -> Self::Shrink;
fn cardinality(&self) -> Option<u128> {
Self::CARDINALITY
}
fn boxed(self) -> Boxed<Self::Item>
where
Self: Sized + 'static,
{
prelude::boxed(Box::new(self))
}
fn map<T, F: Fn(Self::Item) -> T + Clone>(self, map: F) -> Map<Self, F>
where
Self: Sized,
{
prelude::map(self, map)
}
fn filter<F: Fn(&Self::Item) -> bool + Clone>(self, filter: F) -> Filter<Self, F>
where
Self: Sized,
{
prelude::filter(self, filter)
}
fn filter_map<T, F: Fn(Self::Item) -> Option<T> + Clone>(self, filter: F) -> FilterMap<Self, F>
where
Self: Sized,
{
prelude::filter_map(self, filter)
}
fn flat_map<G: Generate, F: Fn(Self::Item) -> G + Clone>(self, map: F) -> Flatten<Map<Self, F>>
where
Self: Sized,
{
prelude::flat_map(self, map)
}
fn flatten(self) -> Flatten<Self>
where
Self: Sized,
Self::Item: Generate,
{
prelude::flatten(self)
}
fn any(self) -> Any<Self>
where
Self: Sized,
{
prelude::any(self)
}
fn array<const N: usize>(self) -> Array<Self, N>
where
Self: Sized,
{
prelude::array(self)
}
fn collect<F: FromIterator<Self::Item>>(
self,
) -> Collect<Self, Range<Usize<0>, Usize<COLLECTS>>, F>
where
Self: Sized,
{
prelude::collect(self, Constant::VALUE)
}
fn collect_with<C: Count, F: FromIterator<Self::Item>>(self, count: C) -> Collect<Self, C, F>
where
Self: Sized,
{
prelude::collect(self, count)
}
fn size<S: Into<Sizes>, F: Fn(Sizes) -> S>(self, map: F) -> Size<Self, F>
where
Self: Sized,
{
prelude::size(self, map)
}
fn dampen(self) -> Dampen<Self>
where
Self: Sized,
{
prelude::dampen(self, 1.0, 8, 8192)
}
fn dampen_with(self, pressure: f64, deepest: usize, limit: usize) -> Dampen<Self>
where
Self: Sized,
{
prelude::dampen(self, pressure, deepest, limit)
}
fn keep(self) -> Keep<Self>
where
Self: Sized,
{
prelude::keep(self)
}
fn unify<T>(self) -> Unify<Self, T>
where
Self: Sized,
{
prelude::unify(self)
}
fn convert<T: From<Self::Item>>(self) -> Convert<Self, T>
where
Self: Sized,
{
prelude::convert(self)
}
}
impl<G: Generate + ?Sized> Generate for &G {
type Item = G::Item;
type Shrink = G::Shrink;
const CARDINALITY: Option<u128> = G::CARDINALITY;
fn generate(&self, state: &mut State) -> Self::Shrink {
G::generate(self, state)
}
fn cardinality(&self) -> Option<u128> {
G::cardinality(self)
}
}
impl<G: Generate + ?Sized> Generate for &mut G {
type Item = G::Item;
type Shrink = G::Shrink;
const CARDINALITY: Option<u128> = G::CARDINALITY;
fn generate(&self, state: &mut State) -> Self::Shrink {
G::generate(self, state)
}
fn cardinality(&self) -> Option<u128> {
G::cardinality(self)
}
}