@delali/narsil 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/NOTICE +54 -0
  2. package/README.md +38 -972
  3. package/dist/adapters/filesystem.mjs +1 -1
  4. package/dist/adapters/indexeddb.mjs +1 -1
  5. package/dist/{chunk-WISGW24C.mjs → chunk-AUMKFYTG.mjs} +1 -1
  6. package/dist/{chunk-HRABJLPB.mjs → chunk-BKAI2WXI.mjs} +1 -0
  7. package/dist/chunk-GHJWC2E5.mjs +9 -0
  8. package/dist/chunk-KH3YGMVT.mjs +15 -0
  9. package/dist/{chunk-ALB35PRQ.mjs → chunk-M2EDG55Y.mjs} +8 -0
  10. package/dist/{chunk-HMO6OMZ3.mjs → chunk-S6IAXOBA.mjs} +1073 -506
  11. package/dist/chunk-TGP5M5R7.mjs +880 -0
  12. package/dist/chunk-U2BKYEC7.mjs +254 -0
  13. package/dist/{chunk-MEW7HD75.mjs → chunk-XAKNSWIK.mjs} +2543 -1154
  14. package/dist/{config-CojEPOgS.d.ts → config-P27AtSn4.d.ts} +28 -7
  15. package/dist/direct-executor-2FV3MEDD.mjs +5 -0
  16. package/dist/distribution/coordinator/etcd.d.ts +2 -2
  17. package/dist/distribution/coordinator/etcd.mjs +2 -2
  18. package/dist/distribution/coordinator/in-memory.d.ts +2 -2
  19. package/dist/distribution.d.ts +10 -4
  20. package/dist/distribution.mjs +1875 -1772
  21. package/dist/embeddings/openai.mjs +1 -1
  22. package/dist/index.browser.mjs +4566 -1783
  23. package/dist/index.d.ts +14 -5
  24. package/dist/index.mjs +6 -5
  25. package/dist/{language-ONQ3iVDf.d.ts → language-CmJBHf1j.d.ts} +4 -1
  26. package/dist/languages/albanian.d.ts +5 -0
  27. package/dist/languages/albanian.mjs +103 -0
  28. package/dist/languages/amharic.d.ts +5 -0
  29. package/dist/languages/amharic.mjs +240 -0
  30. package/dist/languages/arabic.d.ts +1 -1
  31. package/dist/languages/arabic.mjs +939 -154
  32. package/dist/languages/armenian.d.ts +1 -1
  33. package/dist/languages/armenian.mjs +275 -243
  34. package/dist/languages/azerbaijani.d.ts +5 -0
  35. package/dist/languages/azerbaijani.mjs +152 -0
  36. package/dist/languages/bambara.d.ts +5 -0
  37. package/dist/languages/bambara.mjs +60 -0
  38. package/dist/languages/basque.d.ts +5 -0
  39. package/dist/languages/basque.mjs +726 -0
  40. package/dist/languages/belarusian.d.ts +5 -0
  41. package/dist/languages/belarusian.mjs +100 -0
  42. package/dist/languages/bengali.d.ts +5 -0
  43. package/dist/languages/bengali.mjs +128 -0
  44. package/dist/languages/bosnian.d.ts +5 -0
  45. package/dist/languages/bosnian.mjs +197 -0
  46. package/dist/languages/breton.d.ts +5 -0
  47. package/dist/languages/breton.mjs +96 -0
  48. package/dist/languages/bulgarian.d.ts +1 -1
  49. package/dist/languages/bulgarian.mjs +11 -2
  50. package/dist/languages/burmese.d.ts +5 -0
  51. package/dist/languages/burmese.mjs +57 -0
  52. package/dist/languages/catalan.d.ts +5 -0
  53. package/dist/languages/catalan.mjs +987 -0
  54. package/dist/languages/chinese.d.ts +1 -1
  55. package/dist/languages/chinese.mjs +4 -3
  56. package/dist/languages/croatian.d.ts +5 -0
  57. package/dist/languages/croatian.mjs +191 -0
  58. package/dist/languages/czech.d.ts +5 -0
  59. package/dist/languages/czech.mjs +628 -0
  60. package/dist/languages/dagbani.d.ts +1 -1
  61. package/dist/languages/dagbani.mjs +11 -2
  62. package/dist/languages/danish.d.ts +1 -1
  63. package/dist/languages/danish.mjs +215 -110
  64. package/dist/languages/dutch.d.ts +1 -1
  65. package/dist/languages/dutch.mjs +1248 -163
  66. package/dist/languages/english.d.ts +1 -1
  67. package/dist/languages/english.mjs +2 -1
  68. package/dist/languages/esperanto.d.ts +5 -0
  69. package/dist/languages/esperanto.mjs +689 -0
  70. package/dist/languages/estonian.d.ts +5 -0
  71. package/dist/languages/estonian.mjs +2160 -0
  72. package/dist/languages/ewe.d.ts +1 -1
  73. package/dist/languages/ewe.mjs +11 -2
  74. package/dist/languages/faroese.d.ts +5 -0
  75. package/dist/languages/faroese.mjs +93 -0
  76. package/dist/languages/fijian.d.ts +5 -0
  77. package/dist/languages/fijian.mjs +55 -0
  78. package/dist/languages/finnish.d.ts +1 -1
  79. package/dist/languages/finnish.mjs +528 -263
  80. package/dist/languages/french.d.ts +1 -1
  81. package/dist/languages/french.mjs +950 -437
  82. package/dist/languages/ga.d.ts +1 -1
  83. package/dist/languages/ga.mjs +2 -1
  84. package/dist/languages/galician.d.ts +5 -0
  85. package/dist/languages/galician.mjs +172 -0
  86. package/dist/languages/georgian.d.ts +5 -0
  87. package/dist/languages/georgian.mjs +91 -0
  88. package/dist/languages/german.d.ts +1 -1
  89. package/dist/languages/german.mjs +432 -162
  90. package/dist/languages/greek.d.ts +1 -1
  91. package/dist/languages/greek.mjs +1970 -281
  92. package/dist/languages/guarani.d.ts +5 -0
  93. package/dist/languages/guarani.mjs +132 -0
  94. package/dist/languages/gujarati.d.ts +5 -0
  95. package/dist/languages/gujarati.mjs +234 -0
  96. package/dist/languages/haitian-creole.d.ts +5 -0
  97. package/dist/languages/haitian-creole.mjs +106 -0
  98. package/dist/languages/hausa.d.ts +1 -1
  99. package/dist/languages/hausa.mjs +2 -1
  100. package/dist/languages/hawaiian.d.ts +5 -0
  101. package/dist/languages/hawaiian.mjs +69 -0
  102. package/dist/languages/hebrew.d.ts +5 -0
  103. package/dist/languages/hebrew.mjs +213 -0
  104. package/dist/languages/hindi.d.ts +1 -1
  105. package/dist/languages/hindi.mjs +175 -97
  106. package/dist/languages/hungarian.d.ts +1 -1
  107. package/dist/languages/hungarian.mjs +412 -326
  108. package/dist/languages/icelandic.d.ts +5 -0
  109. package/dist/languages/icelandic.mjs +161 -0
  110. package/dist/languages/igbo.d.ts +1 -1
  111. package/dist/languages/igbo.mjs +2 -1
  112. package/dist/languages/indonesian.d.ts +1 -1
  113. package/dist/languages/indonesian.mjs +329 -137
  114. package/dist/languages/irish.d.ts +1 -1
  115. package/dist/languages/irish.mjs +223 -139
  116. package/dist/languages/italian.d.ts +1 -1
  117. package/dist/languages/italian.mjs +703 -406
  118. package/dist/languages/japanese.d.ts +1 -1
  119. package/dist/languages/japanese.mjs +5 -108
  120. package/dist/languages/kannada.d.ts +5 -0
  121. package/dist/languages/kannada.mjs +94 -0
  122. package/dist/languages/kazakh.d.ts +5 -0
  123. package/dist/languages/kazakh.mjs +90 -0
  124. package/dist/languages/khmer.d.ts +5 -0
  125. package/dist/languages/khmer.mjs +181 -0
  126. package/dist/languages/kinyarwanda.d.ts +5 -0
  127. package/dist/languages/kinyarwanda.mjs +99 -0
  128. package/dist/languages/kirundi.d.ts +5 -0
  129. package/dist/languages/kirundi.mjs +92 -0
  130. package/dist/languages/korean.d.ts +5 -0
  131. package/dist/languages/korean.mjs +252 -0
  132. package/dist/languages/kurmanji.d.ts +5 -0
  133. package/dist/languages/kurmanji.mjs +50 -0
  134. package/dist/languages/kyrgyz.d.ts +5 -0
  135. package/dist/languages/kyrgyz.mjs +108 -0
  136. package/dist/languages/lao.d.ts +5 -0
  137. package/dist/languages/lao.mjs +63 -0
  138. package/dist/languages/latin.d.ts +5 -0
  139. package/dist/languages/latin.mjs +69 -0
  140. package/dist/languages/latvian.d.ts +5 -0
  141. package/dist/languages/latvian.mjs +173 -0
  142. package/dist/languages/lingala.d.ts +5 -0
  143. package/dist/languages/lingala.mjs +61 -0
  144. package/dist/languages/lithuanian.d.ts +5 -0
  145. package/dist/languages/lithuanian.mjs +571 -0
  146. package/dist/languages/luxembourgish.d.ts +5 -0
  147. package/dist/languages/luxembourgish.mjs +214 -0
  148. package/dist/languages/macedonian.d.ts +5 -0
  149. package/dist/languages/macedonian.mjs +808 -0
  150. package/dist/languages/malagasy.d.ts +5 -0
  151. package/dist/languages/malagasy.mjs +67 -0
  152. package/dist/languages/malay.d.ts +5 -0
  153. package/dist/languages/malay.mjs +482 -0
  154. package/dist/languages/malayalam.d.ts +5 -0
  155. package/dist/languages/malayalam.mjs +122 -0
  156. package/dist/languages/maltese.d.ts +5 -0
  157. package/dist/languages/maltese.mjs +139 -0
  158. package/dist/languages/maori.d.ts +5 -0
  159. package/dist/languages/maori.mjs +79 -0
  160. package/dist/languages/marathi.d.ts +5 -0
  161. package/dist/languages/marathi.mjs +111 -0
  162. package/dist/languages/nepali.d.ts +1 -1
  163. package/dist/languages/nepali.mjs +209 -99
  164. package/dist/languages/norwegian.d.ts +1 -1
  165. package/dist/languages/norwegian.mjs +218 -85
  166. package/dist/languages/oromo.d.ts +5 -0
  167. package/dist/languages/oromo.mjs +78 -0
  168. package/dist/languages/persian.d.ts +5 -0
  169. package/dist/languages/persian.mjs +710 -0
  170. package/dist/languages/polish.d.ts +5 -0
  171. package/dist/languages/polish.mjs +614 -0
  172. package/dist/languages/portuguese.d.ts +1 -1
  173. package/dist/languages/portuguese.mjs +613 -380
  174. package/dist/languages/punjabi.d.ts +5 -0
  175. package/dist/languages/punjabi.mjs +197 -0
  176. package/dist/languages/romanian.d.ts +1 -1
  177. package/dist/languages/romanian.mjs +561 -382
  178. package/dist/languages/russian.d.ts +1 -1
  179. package/dist/languages/russian.mjs +373 -244
  180. package/dist/languages/samoan.d.ts +5 -0
  181. package/dist/languages/samoan.mjs +63 -0
  182. package/dist/languages/sanskrit.d.ts +1 -1
  183. package/dist/languages/sanskrit.mjs +2 -2
  184. package/dist/languages/scottish-gaelic.d.ts +5 -0
  185. package/dist/languages/scottish-gaelic.mjs +370 -0
  186. package/dist/languages/serbian.d.ts +1 -1
  187. package/dist/languages/serbian.mjs +3635 -155
  188. package/dist/languages/shona.d.ts +5 -0
  189. package/dist/languages/shona.mjs +91 -0
  190. package/dist/languages/sinhala.d.ts +5 -0
  191. package/dist/languages/sinhala.mjs +182 -0
  192. package/dist/languages/slovak.d.ts +5 -0
  193. package/dist/languages/slovak.mjs +430 -0
  194. package/dist/languages/slovenian.d.ts +1 -1
  195. package/dist/languages/slovenian.mjs +11 -2
  196. package/dist/languages/sorani.d.ts +5 -0
  197. package/dist/languages/sorani.mjs +156 -0
  198. package/dist/languages/spanish.d.ts +1 -1
  199. package/dist/languages/spanish.mjs +676 -374
  200. package/dist/languages/swahili.d.ts +1 -1
  201. package/dist/languages/swahili.mjs +2 -1
  202. package/dist/languages/swedish.d.ts +1 -1
  203. package/dist/languages/swedish.mjs +237 -95
  204. package/dist/languages/tagalog.d.ts +5 -0
  205. package/dist/languages/tagalog.mjs +159 -0
  206. package/dist/languages/tamil.d.ts +1 -1
  207. package/dist/languages/tamil.mjs +836 -64
  208. package/dist/languages/tatar.d.ts +5 -0
  209. package/dist/languages/tatar.mjs +1017 -0
  210. package/dist/languages/telugu.d.ts +5 -0
  211. package/dist/languages/telugu.mjs +62 -0
  212. package/dist/languages/thai.d.ts +5 -0
  213. package/dist/languages/thai.mjs +65 -0
  214. package/dist/languages/tibetan.d.ts +5 -0
  215. package/dist/languages/tibetan.mjs +119 -0
  216. package/dist/languages/tigrinya.d.ts +5 -0
  217. package/dist/languages/tigrinya.mjs +194 -0
  218. package/dist/languages/tongan.d.ts +5 -0
  219. package/dist/languages/tongan.mjs +56 -0
  220. package/dist/languages/turkish.d.ts +1 -1
  221. package/dist/languages/turkish.mjs +1246 -393
  222. package/dist/languages/twi.d.ts +1 -1
  223. package/dist/languages/twi.mjs +13 -2
  224. package/dist/languages/ukrainian.d.ts +1 -1
  225. package/dist/languages/ukrainian.mjs +125 -47
  226. package/dist/languages/urdu.d.ts +5 -0
  227. package/dist/languages/urdu.mjs +528 -0
  228. package/dist/languages/vietnamese.d.ts +5 -0
  229. package/dist/languages/vietnamese.mjs +277 -0
  230. package/dist/languages/welsh.d.ts +5 -0
  231. package/dist/languages/welsh.mjs +446 -0
  232. package/dist/languages/wolof.d.ts +5 -0
  233. package/dist/languages/wolof.mjs +79 -0
  234. package/dist/languages/xhosa.d.ts +5 -0
  235. package/dist/languages/xhosa.mjs +95 -0
  236. package/dist/languages/yoruba.d.ts +1 -1
  237. package/dist/languages/yoruba.mjs +1 -0
  238. package/dist/languages/zulu.d.ts +1 -1
  239. package/dist/languages/zulu.mjs +2 -1
  240. package/dist/narsil-CMZRPDlQ.d.ts +159 -0
  241. package/dist/persistence/durability/checkpoint-worker.d.ts +13 -0
  242. package/dist/persistence/durability/checkpoint-worker.mjs +6 -5
  243. package/dist/{schema-DCgkO1j4.d.ts → schema-BnvLvjRp.d.ts} +5 -3
  244. package/dist/server.d.ts +12 -3
  245. package/dist/server.mjs +183 -64
  246. package/dist/{types-DHX6zGeD.d.ts → types-BRTcBgAp.d.ts} +1 -1
  247. package/dist/workers/entry.mjs +2 -2
  248. package/package.json +10 -3
  249. package/dist/chunk-TW6BXTOL.mjs +0 -338
  250. package/dist/direct-executor-E52FFGDE.mjs +0 -4
  251. package/dist/narsil-D-84Nvm4.d.ts +0 -72
@@ -0,0 +1,254 @@
1
+ // src/languages/snowball/base-stemmer.ts
2
+ var BaseStemmer = class {
3
+ current = "";
4
+ c = 0;
5
+ limit = 0;
6
+ limit_backward = 0;
7
+ bra = 0;
8
+ ket = 0;
9
+ af = 0;
10
+ setCurrent(value) {
11
+ this.current = value;
12
+ this.c = 0;
13
+ this.limit = this.current.length;
14
+ this.limit_backward = 0;
15
+ this.bra = 0;
16
+ this.ket = 0;
17
+ }
18
+ getCurrent() {
19
+ return this.current;
20
+ }
21
+ in_grouping(s, min, max) {
22
+ if (this.c >= this.limit) return false;
23
+ let ch = this.current.charCodeAt(this.c);
24
+ if (ch > max || ch < min) return false;
25
+ ch -= min;
26
+ if ((s[ch >>> 3] & 1 << (ch & 7)) === 0) return false;
27
+ this.c++;
28
+ return true;
29
+ }
30
+ go_in_grouping(s, min, max) {
31
+ while (this.c < this.limit) {
32
+ let ch = this.current.charCodeAt(this.c);
33
+ if (ch > max || ch < min) return true;
34
+ ch -= min;
35
+ if ((s[ch >>> 3] & 1 << (ch & 7)) === 0) return true;
36
+ this.c++;
37
+ }
38
+ return false;
39
+ }
40
+ in_grouping_b(s, min, max) {
41
+ if (this.c <= this.limit_backward) return false;
42
+ let ch = this.current.charCodeAt(this.c - 1);
43
+ if (ch > max || ch < min) return false;
44
+ ch -= min;
45
+ if ((s[ch >>> 3] & 1 << (ch & 7)) === 0) return false;
46
+ this.c--;
47
+ return true;
48
+ }
49
+ go_in_grouping_b(s, min, max) {
50
+ while (this.c > this.limit_backward) {
51
+ let ch = this.current.charCodeAt(this.c - 1);
52
+ if (ch > max || ch < min) return true;
53
+ ch -= min;
54
+ if ((s[ch >>> 3] & 1 << (ch & 7)) === 0) return true;
55
+ this.c--;
56
+ }
57
+ return false;
58
+ }
59
+ out_grouping(s, min, max) {
60
+ if (this.c >= this.limit) return false;
61
+ let ch = this.current.charCodeAt(this.c);
62
+ if (ch > max || ch < min) {
63
+ this.c++;
64
+ return true;
65
+ }
66
+ ch -= min;
67
+ if ((s[ch >>> 3] & 1 << (ch & 7)) === 0) {
68
+ this.c++;
69
+ return true;
70
+ }
71
+ return false;
72
+ }
73
+ go_out_grouping(s, min, max) {
74
+ while (this.c < this.limit) {
75
+ let ch = this.current.charCodeAt(this.c);
76
+ if (ch <= max && ch >= min) {
77
+ ch -= min;
78
+ if ((s[ch >>> 3] & 1 << (ch & 7)) !== 0) return true;
79
+ }
80
+ this.c++;
81
+ }
82
+ return false;
83
+ }
84
+ out_grouping_b(s, min, max) {
85
+ if (this.c <= this.limit_backward) return false;
86
+ let ch = this.current.charCodeAt(this.c - 1);
87
+ if (ch > max || ch < min) {
88
+ this.c--;
89
+ return true;
90
+ }
91
+ ch -= min;
92
+ if ((s[ch >>> 3] & 1 << (ch & 7)) === 0) {
93
+ this.c--;
94
+ return true;
95
+ }
96
+ return false;
97
+ }
98
+ go_out_grouping_b(s, min, max) {
99
+ while (this.c > this.limit_backward) {
100
+ let ch = this.current.charCodeAt(this.c - 1);
101
+ if (ch <= max && ch >= min) {
102
+ ch -= min;
103
+ if ((s[ch >>> 3] & 1 << (ch & 7)) !== 0) return true;
104
+ }
105
+ this.c--;
106
+ }
107
+ return false;
108
+ }
109
+ eq_s(s) {
110
+ if (this.limit - this.c < s.length) return false;
111
+ if (!this.current.startsWith(s, this.c)) return false;
112
+ this.c += s.length;
113
+ return true;
114
+ }
115
+ eq_s_b(s) {
116
+ if (this.c - this.limit_backward < s.length) return false;
117
+ if (!this.current.endsWith(s, this.c)) return false;
118
+ this.c -= s.length;
119
+ return true;
120
+ }
121
+ find_among(v, call_among_func) {
122
+ let i = 0;
123
+ let j = v.length;
124
+ const c = this.c;
125
+ const l = this.limit;
126
+ let common_i = 0;
127
+ let common_j = 0;
128
+ let first_key_inspected = false;
129
+ while (true) {
130
+ const k = i + (j - i >>> 1);
131
+ let diff = 0;
132
+ let common = common_i < common_j ? common_i : common_j;
133
+ const s = v[k][0];
134
+ for (let i2 = common; i2 < s.length; i2++) {
135
+ if (c + common === l) {
136
+ diff = -1;
137
+ break;
138
+ }
139
+ diff = this.current.charCodeAt(c + common) - s.charCodeAt(i2);
140
+ if (diff !== 0) break;
141
+ common++;
142
+ }
143
+ if (diff < 0) {
144
+ j = k;
145
+ common_j = common;
146
+ } else {
147
+ i = k;
148
+ common_i = common;
149
+ }
150
+ if (j - i <= 1) {
151
+ if (i > 0) break;
152
+ if (j === i) break;
153
+ if (first_key_inspected) break;
154
+ first_key_inspected = true;
155
+ }
156
+ }
157
+ while (true) {
158
+ const w = v[i];
159
+ const len = w[0].length;
160
+ if (common_i >= len) {
161
+ this.c = c + len;
162
+ const action = w[3];
163
+ if (action === void 0) return w[1];
164
+ this.af = action;
165
+ if (call_among_func?.call(this) === true) {
166
+ this.c = c + len;
167
+ return w[1];
168
+ }
169
+ }
170
+ const back = w[2];
171
+ if (back === void 0 || back === 0) return 0;
172
+ i -= back;
173
+ }
174
+ }
175
+ find_among_b(v, call_among_func) {
176
+ let i = 0;
177
+ let j = v.length;
178
+ const c = this.c;
179
+ const lb = this.limit_backward;
180
+ let common_i = 0;
181
+ let common_j = 0;
182
+ let first_key_inspected = false;
183
+ while (true) {
184
+ const k = i + (j - i >> 1);
185
+ let diff = 0;
186
+ let common = common_i < common_j ? common_i : common_j;
187
+ const s = v[k][0];
188
+ for (let i2 = s.length - 1 - common; i2 >= 0; i2--) {
189
+ if (c - common === lb) {
190
+ diff = -1;
191
+ break;
192
+ }
193
+ diff = this.current.charCodeAt(c - 1 - common) - s.charCodeAt(i2);
194
+ if (diff !== 0) break;
195
+ common++;
196
+ }
197
+ if (diff < 0) {
198
+ j = k;
199
+ common_j = common;
200
+ } else {
201
+ i = k;
202
+ common_i = common;
203
+ }
204
+ if (j - i <= 1) {
205
+ if (i > 0) break;
206
+ if (j === i) break;
207
+ if (first_key_inspected) break;
208
+ first_key_inspected = true;
209
+ }
210
+ }
211
+ while (true) {
212
+ const w = v[i];
213
+ const len = w[0].length;
214
+ if (common_i >= len) {
215
+ this.c = c - len;
216
+ const action = w[3];
217
+ if (action === void 0) return w[1];
218
+ this.af = action;
219
+ if (call_among_func?.call(this) === true) {
220
+ this.c = c - len;
221
+ return w[1];
222
+ }
223
+ }
224
+ const back = w[2];
225
+ if (back === void 0 || back === 0) return 0;
226
+ i -= back;
227
+ }
228
+ }
229
+ replace_s(c_bra, c_ket, s) {
230
+ const adjustment = s.length - (c_ket - c_bra);
231
+ this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
232
+ this.limit += adjustment;
233
+ if (this.c >= c_ket) this.c += adjustment;
234
+ else if (this.c > c_bra) this.c = c_bra;
235
+ return adjustment;
236
+ }
237
+ slice_from(s) {
238
+ this.replace_s(this.bra, this.ket, s);
239
+ this.ket = this.bra + s.length;
240
+ }
241
+ slice_del() {
242
+ this.slice_from("");
243
+ }
244
+ insert(c_bra, c_ket, s) {
245
+ const adjustment = this.replace_s(c_bra, c_ket, s);
246
+ if (c_bra <= this.bra) this.bra += adjustment;
247
+ if (c_bra <= this.ket) this.ket += adjustment;
248
+ }
249
+ slice_to() {
250
+ return this.current.slice(this.bra, this.ket);
251
+ }
252
+ };
253
+
254
+ export { BaseStemmer };