use smallvec::{smallvec, SmallVec};
use crate::decline::{Gender, Case};
use crate::inflection::{Number};
pub(super) type Suffixes<'a> = SmallVec::<[&'a str; 2]>;
pub(super) fn first_second_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
match (gender, number, case) {
(Gender::Masculine, Number::Singular, Case::Nominative) => Some(smallvec!["us"]),
(Gender::Masculine, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
(Gender::Masculine, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
(Gender::Masculine, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
(Gender::Masculine, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
(Gender::Masculine, Number::Singular, Case::Vocative) => Some(smallvec!["e"]),
(Gender::Masculine, Number::Plural, Case::Nominative) => Some(smallvec!["ī"]),
(Gender::Masculine, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
(Gender::Masculine, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
(Gender::Masculine, Number::Plural, Case::Accusative) => Some(smallvec!["ōs"]),
(Gender::Masculine, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
(Gender::Masculine, Number::Plural, Case::Vocative) => Some(smallvec!["ī"]),
(Gender::Feminine, Number::Singular, Case::Nominative) => Some(smallvec!["a"]),
(Gender::Feminine, Number::Singular, Case::Genitive) => Some(smallvec!["ae"]),
(Gender::Feminine, Number::Singular, Case::Dative) => Some(smallvec!["ae"]),
(Gender::Feminine, Number::Singular, Case::Accusative) => Some(smallvec!["am"]),
(Gender::Feminine, Number::Singular, Case::Ablative) => Some(smallvec!["ā"]),
(Gender::Feminine, Number::Singular, Case::Vocative) => Some(smallvec!["a"]),
(Gender::Feminine, Number::Plural, Case::Nominative) => Some(smallvec!["ae"]),
(Gender::Feminine, Number::Plural, Case::Genitive) => Some(smallvec!["ārum"]),
(Gender::Feminine, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
(Gender::Feminine, Number::Plural, Case::Accusative) => Some(smallvec!["ās"]),
(Gender::Feminine, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
(Gender::Feminine, Number::Plural, Case::Vocative) => Some(smallvec!["ae"]),
(Gender::Neuter, Number::Singular, Case::Nominative) => Some(smallvec!["um"]),
(Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
(Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
(Gender::Neuter, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
(Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
(Gender::Neuter, Number::Singular, Case::Vocative) => Some(smallvec!["um"]),
(Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
(Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
(Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
(Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
(Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
(Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
}
}
pub(super) fn first_second_ius_genitive_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
match (gender, number, case) {
(_, Number::Singular, Case::Genitive) => Some(smallvec!["īus"]),
(_, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
_ => first_second_endings(number, case, gender)
}
}
pub(super) fn first_second_r_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
match (gender, number, case) {
(Gender::Masculine, Number::Singular, Case::Nominative) => None,
(Gender::Masculine, Number::Singular, Case::Vocative) => None,
_ => first_second_endings(number, case, gender),
}
}
pub(super) fn third_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
match (gender, number, case) {
(Gender::Neuter, Number::Singular, Case::Nominative) => None,
(Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
(Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
(Gender::Neuter, Number::Singular, Case::Accusative) => None,
(Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ī"]),
(Gender::Neuter, Number::Singular, Case::Vocative) => None,
(Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["ia"]),
(Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
(Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
(Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["ia"]),
(Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
(Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["ia"]),
(_, Number::Singular, Case::Nominative) => None,
(_, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
(_, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
(_, Number::Singular, Case::Accusative) => Some(smallvec!["em"]),
(_, Number::Singular, Case::Ablative) => Some(smallvec!["ī"]),
(_, Number::Singular, Case::Vocative) => None,
(_, Number::Plural, Case::Nominative) => Some(smallvec!["ēs"]),
(_, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
(_, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
(_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs", "īs"]),
(_, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
(_, Number::Plural, Case::Vocative) => Some(smallvec!["ēs"]),
}
}
pub(super) fn third_c_stem_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
match (gender, number, case) {
(Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
(Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
(Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
(Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
(Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
(_, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
(_, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
(_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs"]),
_ => third_endings(number, case, gender),
}
}