use crate::{
any::Any,
array::Array,
boxed::Boxed,
cardinality::Cardinality,
collect::{Collect, Count},
convert::Convert,
dampen::Dampen,
filter::Filter,
filter_map::FilterMap,
flatten::Flatten,
generate::Generate,
keep::Keep,
lazy::Lazy,
map::Map,
primitive::Number,
same::Same,
shrink::Shrinker,
size::Size,
standard::{character, number, with},
state::Sizes,
unify::Unify,
};
use core::marker::PhantomData;
#[inline]
pub const fn same<T: Clone>(value: T) -> Same<T> {
Same(value)
}
#[inline]
pub const fn any<G>(generators: G) -> Any<G> {
Any(generators)
}
#[inline]
pub const fn unify<G: Generate, T>(generator: G) -> Unify<G, T> {
Unify(PhantomData, generator)
}
#[inline]
pub const fn shrinker<G: Generate>(generator: G) -> Shrinker<G> {
Shrinker(generator)
}
#[inline]
pub const fn map<G: Generate, T, F: Fn(G::Item) -> T + Clone>(generator: G, map: F) -> Map<G, F> {
Map(map, generator)
}
#[inline]
pub const fn flat_map<G: Generate, T: Generate, F: Fn(G::Item) -> T + Clone>(
generator: G,
map: F,
) -> Flatten<Map<G, F>> {
flatten(self::map(generator, map))
}
#[inline]
pub const fn flatten<G: Generate>(generator: G) -> Flatten<G>
where
G::Item: Generate,
{
Flatten(generator)
}
#[inline]
pub const fn filter<G: Generate, F: Fn(&G::Item) -> bool + Clone>(
generator: G,
filter: F,
) -> Filter<G, F> {
Filter { generator, filter }
}
#[inline]
pub const fn filter_map<G: Generate, T, F: Fn(G::Item) -> Option<T> + Clone>(
generator: G,
filter: F,
) -> FilterMap<G, F> {
FilterMap { generator, filter }
}
#[inline]
pub const fn boxed<G: Generate + 'static>(generator: Box<G>) -> Boxed<G::Item> {
Boxed::new(generator)
}
#[inline]
pub const fn array<G: Generate, const N: usize>(generator: G) -> Array<G, N> {
Array(generator)
}
#[inline]
pub const fn collect<G: Generate, C: Count, F: FromIterator<G::Item>>(
generator: G,
count: C,
) -> Collect<G, C, F> {
Collect {
_marker: PhantomData,
count,
generator,
}
}
#[inline]
pub const fn size<G: Generate, S: Into<Sizes>, F: Fn(Sizes) -> S>(
generator: G,
map: F,
) -> Size<G, F> {
Size(generator, map)
}
#[inline]
pub const fn dampen<G: Generate>(
generator: G,
pressure: f64,
deepest: usize,
limit: usize,
) -> Dampen<G> {
Dampen::new(pressure, deepest, limit, generator)
}
#[inline]
pub const fn keep<G: Generate>(generator: G) -> Keep<G> {
Keep(generator)
}
#[inline]
pub const fn convert<G: Generate, T: From<G::Item>>(generator: G) -> Convert<G, T> {
Convert(PhantomData, generator)
}
#[cfg(feature = "regex")]
#[inline]
pub fn regex(
pattern: &str,
repeats: Option<u32>,
) -> Result<crate::regex::Regex, crate::regex::Error> {
crate::regex::Regex::new(pattern, repeats)
}
#[inline]
pub const fn number<T: Number>() -> number::Number<T> {
number::Number(PhantomData)
}
#[inline]
pub const fn positive<T: Number>() -> number::Positive<T> {
number::Positive(PhantomData)
}
#[inline]
pub const fn negative<T: Number>() -> number::Negative<T> {
number::Negative(PhantomData)
}
#[inline]
pub const fn letter() -> character::Letter {
character::Letter(PhantomData)
}
#[inline]
pub const fn digit() -> character::Digit {
character::Digit(PhantomData)
}
#[inline]
pub const fn ascii() -> character::Ascii {
character::Ascii(PhantomData)
}
#[inline]
pub const fn with<T, F: Fn() -> T + Clone>(generate: F) -> with::With<F> {
with::With::new(generate)
}
#[inline]
pub const fn lazy<G: Generate, F: Fn() -> G>(generator: F) -> Lazy<G, F> {
Lazy::new(generator)
}
#[inline]
pub const fn cardinality<G: Generate, const C: u128>(generator: G) -> Cardinality<G, C> {
Cardinality(generator)
}