cipher_salad/
alphabet.rs

1use unicode_segmentation::UnicodeSegmentation;
2
3pub struct Alphabet {
4    graphemes: Vec<String>,
5}
6
7impl Alphabet {
8    pub fn new(graphemes: String) -> Alphabet {
9        let graphemes = graphemes.graphemes(true).map(String::from).collect();
10        Alphabet { graphemes }
11    }
12
13    pub fn grapheme_at(&self, index: usize) -> Option<&String> {
14        self.graphemes.get(index)
15    }
16
17    pub fn index_of(&self, grapheme: &str) -> Option<usize> {
18        self.graphemes.iter().position(|value| value == grapheme)
19    }
20
21    pub fn length(&self) -> usize {
22        self.graphemes.len()
23    }
24
25    pub fn contains(&self, grapheme: &str) -> bool {
26        self.index_of(grapheme).is_some()
27    }
28}