use crate::conlang::types::{PhonemeKind, Phonology};
pub const STOP: u8 = 1;
pub const AFFRICATE: u8 = 2;
pub const FRICATIVE: u8 = 3;
pub const NASAL: u8 = 4;
pub const LIQUID: u8 = 5;
pub const GLIDE: u8 = 6;
pub const VOWEL: u8 = 7;
const TABLE: &[(&str, u8)] = &[
("t͡ʃ", AFFRICATE), ("d͡ʒ", AFFRICATE), ("tʃ", AFFRICATE), ("dʒ", AFFRICATE),
("ts", AFFRICATE), ("dz", AFFRICATE),
("p", STOP), ("b", STOP), ("t", STOP), ("d", STOP), ("k", STOP), ("g", STOP),
("q", STOP), ("ʔ", STOP), ("c", STOP), ("ɟ", STOP), ("ʈ", STOP), ("ɖ", STOP),
("f", FRICATIVE), ("v", FRICATIVE), ("θ", FRICATIVE), ("ð", FRICATIVE),
("s", FRICATIVE), ("z", FRICATIVE), ("ʃ", FRICATIVE), ("ʒ", FRICATIVE),
("x", FRICATIVE), ("ɣ", FRICATIVE), ("h", FRICATIVE), ("ç", FRICATIVE),
("ħ", FRICATIVE), ("ʕ", FRICATIVE), ("ɸ", FRICATIVE), ("β", FRICATIVE),
("m", NASAL), ("n", NASAL), ("ŋ", NASAL), ("ɲ", NASAL), ("ɳ", NASAL), ("ɱ", NASAL),
("l", LIQUID), ("r", LIQUID), ("ɾ", LIQUID), ("ʀ", LIQUID), ("ʁ", LIQUID),
("ɭ", LIQUID), ("ɽ", LIQUID), ("ʎ", LIQUID),
("j", GLIDE), ("w", GLIDE), ("ɥ", GLIDE), ("ʋ", GLIDE), ("ɰ", GLIDE),
("a", VOWEL), ("e", VOWEL), ("i", VOWEL), ("o", VOWEL), ("u", VOWEL),
("ɛ", VOWEL), ("ɔ", VOWEL), ("ɪ", VOWEL), ("ʊ", VOWEL), ("ə", VOWEL),
("æ", VOWEL), ("ɑ", VOWEL), ("y", VOWEL), ("ø", VOWEL), ("œ", VOWEL),
("ɨ", VOWEL), ("ʉ", VOWEL), ("ɯ", VOWEL),
];
fn table_lookup(ipa: &str) -> Option<u8> {
TABLE.iter().find(|(sym, _)| *sym == ipa).map(|(_, r)| *r)
}
pub fn sonority_of(phon: &Phonology, ipa: &str) -> u8 {
if let Some(p) = phon.phoneme(ipa) {
if let Some(s) = p.sonority {
return s;
}
if let Some(s) = table_lookup(ipa) {
return s;
}
return match p.kind {
PhonemeKind::Vowel => VOWEL,
PhonemeKind::Consonant => STOP,
};
}
table_lookup(ipa).unwrap_or(STOP)
}