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}