use super::super::rand::R;
use super::base::{BoxGenerator, Generator};
use super::numerical::range;
pub struct AsciiString(BoxGenerator<usize>);
impl Generator for AsciiString {
type Item = String;
fn generate(&self, r: &mut R) -> Self::Item {
let sz = self.0.generate(&mut r.sub());
let mut chars_r = r.sub();
let mut out = Vec::with_capacity(sz);
let ascii_range = range(0x20..0x7f).map(|n| std::char::from_u32(n).unwrap());
for _ in 0..sz {
out.push(ascii_range.generate(&mut chars_r))
}
out.iter().collect()
}
}
pub fn ascii<SZ: Generator<Item = usize> + 'static>(size: SZ) -> AsciiString {
AsciiString(size.into_boxed())
}
pub struct StringGenerator(BoxGenerator<usize>, BoxGenerator<char>);
impl Generator for StringGenerator {
type Item = String;
fn generate(&self, r: &mut R) -> Self::Item {
let sz = self.0.generate(&mut r.sub());
let mut chars_r = r.sub();
let mut out = Vec::with_capacity(sz);
for _ in 0..sz {
out.push(self.1.generate(&mut chars_r))
}
out.iter().collect()
}
}
pub fn string<SZ: Generator<Item = usize> + 'static, C: Generator<Item = char> + 'static>(
size: SZ,
chars: C,
) -> StringGenerator {
StringGenerator(size.into_boxed(), chars.into_boxed())
}