1use crate::{
2 any::Any,
3 array::Array,
4 boxed::Boxed,
5 cardinality::Cardinality,
6 collect::{Collect, Count},
7 convert::Convert,
8 dampen::Dampen,
9 filter::Filter,
10 filter_map::FilterMap,
11 flatten::Flatten,
12 generate::Generate,
13 keep::Keep,
14 lazy::Lazy,
15 map::Map,
16 primitive::Number,
17 same::Same,
18 shrink::Shrinker,
19 size::Size,
20 standard::{character, number, with},
21 state::Sizes,
22 unify::Unify,
23};
24use core::marker::PhantomData;
25
26#[inline]
31pub const fn same<T: Clone>(value: T) -> Same<T> {
32 Same(value)
33}
34
35#[inline]
39pub const fn any<G>(generators: G) -> Any<G> {
40 Any(generators)
41}
42
43#[inline]
47pub const fn unify<G: Generate, T>(generator: G) -> Unify<G, T> {
48 Unify(PhantomData, generator)
49}
50
51#[inline]
54pub const fn shrinker<G: Generate>(generator: G) -> Shrinker<G> {
55 Shrinker(generator)
56}
57
58#[inline]
60pub const fn map<G: Generate, T, F: Fn(G::Item) -> T + Clone>(generator: G, map: F) -> Map<G, F> {
61 Map(map, generator)
62}
63
64#[inline]
66pub const fn flat_map<G: Generate, T: Generate, F: Fn(G::Item) -> T + Clone>(
67 generator: G,
68 map: F,
69) -> Flatten<Map<G, F>> {
70 flatten(self::map(generator, map))
71}
72
73#[inline]
75pub const fn flatten<G: Generate>(generator: G) -> Flatten<G>
76where
77 G::Item: Generate,
78{
79 Flatten(generator)
80}
81
82#[inline]
84pub const fn filter<G: Generate, F: Fn(&G::Item) -> bool + Clone>(
85 generator: G,
86 filter: F,
87) -> Filter<G, F> {
88 Filter { generator, filter }
89}
90
91#[inline]
93pub const fn filter_map<G: Generate, T, F: Fn(G::Item) -> Option<T> + Clone>(
94 generator: G,
95 filter: F,
96) -> FilterMap<G, F> {
97 FilterMap { generator, filter }
98}
99
100#[inline]
102pub const fn boxed<G: Generate + 'static>(generator: Box<G>) -> Boxed<G::Item> {
103 Boxed::new(generator)
104}
105
106#[inline]
108pub const fn array<G: Generate, const N: usize>(generator: G) -> Array<G, N> {
109 Array(generator)
110}
111
112#[inline]
114pub const fn collect<G: Generate, C: Count, F: FromIterator<G::Item>>(
115 generator: G,
116 count: C,
117) -> Collect<G, C, F> {
118 Collect {
119 _marker: PhantomData,
120 count,
121 generator,
122 }
123}
124
125#[inline]
127pub const fn size<G: Generate, S: Into<Sizes>, F: Fn(Sizes) -> S>(
128 generator: G,
129 map: F,
130) -> Size<G, F> {
131 Size(generator, map)
132}
133
134#[inline]
136pub const fn dampen<G: Generate>(
137 generator: G,
138 pressure: f64,
139 deepest: usize,
140 limit: usize,
141) -> Dampen<G> {
142 Dampen::new(pressure, deepest, limit, generator)
143}
144
145#[inline]
147pub const fn keep<G: Generate>(generator: G) -> Keep<G> {
148 Keep(generator)
149}
150
151#[inline]
153pub const fn convert<G: Generate, T: From<G::Item>>(generator: G) -> Convert<G, T> {
154 Convert(PhantomData, generator)
155}
156
157#[cfg(feature = "regex")]
162#[inline]
163pub fn regex(
164 pattern: &str,
165 repeats: Option<u32>,
166) -> Result<crate::regex::Regex, crate::regex::Error> {
167 crate::regex::Regex::new(pattern, repeats)
168}
169
170#[inline]
174pub const fn number<T: Number>() -> number::Number<T> {
175 number::Number(PhantomData)
176}
177
178#[inline]
182pub const fn positive<T: Number>() -> number::Positive<T> {
183 number::Positive(PhantomData)
184}
185
186#[inline]
190pub const fn negative<T: Number>() -> number::Negative<T> {
191 number::Negative(PhantomData)
192}
193
194#[inline]
196pub const fn letter() -> character::Letter {
197 character::Letter(PhantomData)
198}
199
200#[inline]
202pub const fn digit() -> character::Digit {
203 character::Digit(PhantomData)
204}
205
206#[inline]
208pub const fn ascii() -> character::Ascii {
209 character::Ascii(PhantomData)
210}
211
212#[inline]
227pub const fn with<T, F: Fn() -> T + Clone>(generate: F) -> with::With<F> {
228 with::With::new(generate)
229}
230
231#[inline]
236pub const fn lazy<G: Generate, F: Fn() -> G>(generator: F) -> Lazy<G, F> {
237 Lazy::new(generator)
238}
239
240#[inline]
248pub const fn cardinality<G: Generate, const C: u128>(generator: G) -> Cardinality<G, C> {
249 Cardinality(generator)
250}