use rand::prelude::*; pub struct RandomCharIter(T); impl RandomCharIter { pub fn new(rng: T) -> Self { Self(rng) } } impl Iterator for RandomCharIter { type Item = char; fn next(&mut self) -> Option { match self.0.gen_range(0..100) { // whitespace 0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(), // two-byte greek letters 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))), // three-byte characters 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(), // four-byte characters 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(), // ascii letters _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()), } } }