random_char_iter.rs

 1use rand::prelude::*;
 2
 3pub struct RandomCharIter<T: Rng>(T);
 4
 5impl<T: Rng> RandomCharIter<T> {
 6    pub fn new(rng: T) -> Self {
 7        Self(rng)
 8    }
 9}
10
11impl<T: Rng> Iterator for RandomCharIter<T> {
12    type Item = char;
13
14    fn next(&mut self) -> Option<Self::Item> {
15        match self.0.gen_range(0..100) {
16            // whitespace
17            0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(),
18            // two-byte greek letters
19            20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
20            // three-byte characters
21            33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
22            // four-byte characters
23            46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
24            // ascii letters
25            _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
26        }
27    }
28}