1use smallvec::{smallvec, SmallVec};
2
3use crate::decline::{Gender, Case};
4use crate::inflection::{Number};
5
6pub(super) type Suffixes<'a> = SmallVec::<[&'a str; 2]>;
7
8pub(super) fn first_endings<'a>(number: Number, case: Case, _gender: Gender) -> Option<Suffixes<'a>> {
10 match (number, case) {
11 (Number::Singular, Case::Nominative) => Some(smallvec!["a"]),
12 (Number::Singular, Case::Genitive) => Some(smallvec!["ae"]),
13 (Number::Singular, Case::Dative) => Some(smallvec!["ae"]),
14 (Number::Singular, Case::Accusative) => Some(smallvec!["am"]),
15 (Number::Singular, Case::Ablative) => Some(smallvec!["ā"]),
16 (Number::Singular, Case::Vocative) => Some(smallvec!["a"]),
17 (Number::Plural, Case::Nominative) => Some(smallvec!["ae"]),
18 (Number::Plural, Case::Genitive) => Some(smallvec!["ārum"]),
19 (Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
20 (Number::Plural, Case::Accusative) => Some(smallvec!["ās"]),
21 (Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
22 (Number::Plural, Case::Vocative) => Some(smallvec!["ae"]),
23 }
24}
25
26pub(super) fn second_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
27 match (gender, number, case) {
28 (Gender::Neuter, Number::Singular, Case::Nominative) => Some(smallvec!["um"]),
29 (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
30 (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
31 (Gender::Neuter, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
32 (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
33 (Gender::Neuter, Number::Singular, Case::Vocative) => Some(smallvec!["um"]),
34 (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
35 (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
36 (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
37 (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
38 (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
39 (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
40 (_, Number::Singular, Case::Nominative) => Some(smallvec!["us"]),
44 (_, Number::Singular, Case::Genitive) => Some(smallvec!["ī"]),
45 (_, Number::Singular, Case::Dative) => Some(smallvec!["ō"]),
46 (_, Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
47 (_, Number::Singular, Case::Ablative) => Some(smallvec!["ō"]),
48 (_, Number::Singular, Case::Vocative) => Some(smallvec!["e"]),
49 (_, Number::Plural, Case::Nominative) => Some(smallvec!["ī"]),
50 (_, Number::Plural, Case::Genitive) => Some(smallvec!["ōrum"]),
51 (_, Number::Plural, Case::Dative) => Some(smallvec!["īs"]),
52 (_, Number::Plural, Case::Accusative) => Some(smallvec!["ōs"]),
53 (_, Number::Plural, Case::Ablative) => Some(smallvec!["īs"]),
54 (_, Number::Plural, Case::Vocative) => Some(smallvec!["ī"]),
55 }
56}
57
58pub(super) fn second_ius_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
59 match (gender, number, case) {
60 (Gender::Neuter, Number::Singular, Case::Nominative) => Some(smallvec!["ium"]),
61 (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["iī"]),
62 (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["iō"]),
63 (Gender::Neuter, Number::Singular, Case::Accusative) => Some(smallvec!["ium"]),
64 (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["iō"]),
65 (Gender::Neuter, Number::Singular, Case::Vocative) => Some(smallvec!["ium"]),
66 (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["ia"]),
67 (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["iōrum"]),
68 (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["iīs"]),
69 (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["ia"]),
70 (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["iīs"]),
71 (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["ia"]),
72
73 (_, Number::Singular, Case::Nominative) => Some(smallvec!["ius"]),
74 (_, Number::Singular, Case::Genitive) => Some(smallvec!["iī"]),
75 (_, Number::Singular, Case::Dative) => Some(smallvec!["iō"]),
76 (_, Number::Singular, Case::Accusative) => Some(smallvec!["ium"]),
77 (_, Number::Singular, Case::Ablative) => Some(smallvec!["iō"]),
78 (_, Number::Singular, Case::Vocative) => Some(smallvec!["ī"]),
79 (_, Number::Plural, Case::Nominative) => Some(smallvec!["iī"]),
80 (_, Number::Plural, Case::Genitive) => Some(smallvec!["iōrum"]),
81 (_, Number::Plural, Case::Dative) => Some(smallvec!["iīs"]),
82 (_, Number::Plural, Case::Accusative) => Some(smallvec!["iōs"]),
83 (_, Number::Plural, Case::Ablative) => Some(smallvec!["iīs"]),
84 (_, Number::Plural, Case::Vocative) => Some(smallvec!["iī"]),
85 }
86}
87
88pub(super) fn second_r_endings<'a>(number: Number, case: Case, gender: Gender) ->Option<Suffixes<'a>> {
89 match (gender, number, case) {
90 (_, Number::Singular, Case::Nominative) => None,
99 (_, Number::Singular, Case::Vocative) => None,
100 _ => second_endings(number, case, gender),
102 }
103}
104
105pub(super) fn third_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
106 match (gender, number, case) {
107 (Gender::Neuter, Number::Singular, Case::Nominative) => None,
111 (Gender::Neuter, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
112 (Gender::Neuter, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
113 (Gender::Neuter, Number::Singular, Case::Accusative) => None,
114 (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
115 (Gender::Neuter, Number::Singular, Case::Vocative) => None,
116 (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["a"]),
117 (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
118 (Gender::Neuter, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
119 (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["a"]),
120 (Gender::Neuter, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
121 (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["a"]),
122 (_, Number::Singular, Case::Nominative) => None,
125 (_, Number::Singular, Case::Genitive) => Some(smallvec!["is"]),
126 (_, Number::Singular, Case::Dative) => Some(smallvec!["ī"]),
127 (_, Number::Singular, Case::Accusative) => Some(smallvec!["em"]),
128 (_, Number::Singular, Case::Ablative) => Some(smallvec!["e"]),
129 (_, Number::Singular, Case::Vocative) => None,
130 (_, Number::Plural, Case::Nominative) => Some(smallvec!["ēs"]),
131 (_, Number::Plural, Case::Genitive) => Some(smallvec!["um"]),
132 (_, Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
133 (_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs"]),
134 (_, Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
135 (_, Number::Plural, Case::Vocative) => Some(smallvec!["ēs"]),
136 }
137}
138
139pub(super) fn third_i_stem_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
140 match (gender, number, case) {
141 (Gender::Neuter, Number::Singular, Case::Ablative) => Some(smallvec!["ī"]),
142 (Gender::Neuter, Number::Plural, Case::Nominative) => Some(smallvec!["ia"]),
143 (Gender::Neuter, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
144 (Gender::Neuter, Number::Plural, Case::Accusative) => Some(smallvec!["ia"]),
145 (Gender::Neuter, Number::Plural, Case::Vocative) => Some(smallvec!["ia"]),
146 (_, Number::Singular, Case::Accusative) => Some(smallvec!["em", "im"]),
147 (_, Number::Plural, Case::Genitive) => Some(smallvec!["ium"]),
148 (_, Number::Plural, Case::Accusative) => Some(smallvec!["ēs", "īs"]),
149 _ => third_endings(number, case, gender),
150 }
151}
152
153pub(super) fn fourth_endings<'a>(number: Number, case: Case, _gender: Gender) -> Option<Suffixes<'a>> {
162 match (number, case) {
163 (Number::Singular, Case::Nominative) => Some(smallvec!["us"]),
164 (Number::Singular, Case::Genitive) => Some(smallvec!["ūs"]),
165 (Number::Singular, Case::Dative) => Some(smallvec!["uī"]),
166 (Number::Singular, Case::Accusative) => Some(smallvec!["um"]),
167 (Number::Singular, Case::Ablative) => Some(smallvec!["ū"]),
168 (Number::Singular, Case::Vocative) => Some(smallvec!["us"]),
169 (Number::Plural, Case::Nominative) => Some(smallvec!["ūs"]),
170 (Number::Plural, Case::Genitive) => Some(smallvec!["uum"]),
171 (Number::Plural, Case::Dative) => Some(smallvec!["ibus"]),
172 (Number::Plural, Case::Accusative) => Some(smallvec!["ūs"]),
173 (Number::Plural, Case::Ablative) => Some(smallvec!["ibus"]),
174 (Number::Plural, Case::Vocative) => Some(smallvec!["ūs"]),
175 }
176}
177
178pub(super) fn fourth_u_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
179 match (number, case) {
180 (Number::Singular, Case::Nominative) => Some(smallvec!["ū"]),
181 (Number::Singular, Case::Dative) => Some(smallvec!["ū"]),
182 (Number::Singular, Case::Accusative) => Some(smallvec!["ū"]),
183 (Number::Singular, Case::Vocative) => Some(smallvec!["ū"]),
184 (Number::Plural, Case::Nominative) => Some(smallvec!["ua"]),
185 (Number::Plural, Case::Accusative) => Some(smallvec!["ua"]),
186 (Number::Plural, Case::Vocative) => Some(smallvec!["ua"]),
187 _ => fourth_endings(number, case, gender),
188 }
189}
190
191pub(super) fn fifth_endings<'a>(number: Number, case: Case, _gender: Gender) -> Option<Suffixes<'a>> {
192 match (number, case) {
193 (Number::Singular, Case::Nominative) => Some(smallvec!["ēs"]),
194 (Number::Singular, Case::Genitive) => Some(smallvec!["eī"]),
195 (Number::Singular, Case::Dative) => Some(smallvec!["eī"]),
196 (Number::Singular, Case::Accusative) => Some(smallvec!["em"]),
197 (Number::Singular, Case::Ablative) => Some(smallvec!["ē"]),
198 (Number::Singular, Case::Vocative) => Some(smallvec!["ēs"]),
199 (Number::Plural, Case::Nominative) => Some(smallvec!["ēs"]),
200 (Number::Plural, Case::Genitive) => Some(smallvec!["ērum"]),
201 (Number::Plural, Case::Dative) => Some(smallvec!["ēbus"]),
202 (Number::Plural, Case::Accusative) => Some(smallvec!["ēs"]),
203 (Number::Plural, Case::Ablative) => Some(smallvec!["ēbus"]),
204 (Number::Plural, Case::Vocative) => Some(smallvec!["ēs"]),
205 }
206}
207
208pub(super) fn fifth_vowel_stem_endings<'a>(number: Number, case: Case, gender: Gender) -> Option<Suffixes<'a>> {
209 match (number, case) {
210 (Number::Singular, Case::Genitive) => Some(smallvec!["ēī"]),
211 (Number::Singular, Case::Dative) => Some(smallvec!["ēī"]),
212 _ => fifth_endings(number, case, gender),
213 }
214}