hyphenator/
lib.rs

1const VOWELS: &str = "aeiouy";
2const CONSONANTS: &str = "bcdfghjklmnpqrstvwxz";
3
4pub fn split(word: &str) -> Vec<Vec<String>> {
5    let validate = |syllable: &str| -> bool {
6        let (mut vowels, mut consonants) = (false, false);
7        for c in syllable.chars().map(|c| c.to_ascii_lowercase()) {
8            vowels |= VOWELS.contains(c);
9            consonants |= CONSONANTS.contains(c);
10            if vowels && consonants {
11                return true;
12            }
13        }
14        false
15    };
16
17    let mut results = Vec::new();
18    let mut stack: Vec<(usize, Vec<String>)> = vec![(0, vec![])];
19
20    while let Some((start, state)) = stack.pop() {
21        if start >= word.len() {
22            results.push(state);
23            continue;
24        }
25        for length in 2..=4 {
26            if start + length <= word.len() {
27                let syllable = &word[start..start + length];
28                if validate(syllable) {
29                    let mut updated = state.clone();
30                    updated.push(syllable.to_string());
31                    stack.push((start + length, updated));
32                }
33            }
34        }
35    }
36
37    results.sort();
38    results.dedup();
39    results
40}