Skip to main content

cipher_salad/
alphabet.rs

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