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}