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}