@yar.ua/numerals
Version:
Number to text - Inflector for Ukrainian numerals
45 lines (44 loc) • 1.76 kB
JavaScript
import { Lexeme } from "./lexeme.js";
import { InternalDataError } from "../errors.js";
export class ParadigmLexeme extends Lexeme {
constructor(value, paradigm, persistent_form) {
super(value, {}, persistent_form);
this.paradigm = paradigm;
}
inflected(form) {
const result = new ParadigmLexeme(this.value, this.paradigm, this.persistent_form);
result.updateForm(this.form());
result.updateForm(form);
return result;
}
text() {
const invariants = this.paradigm.reduce((filtered, [form, text]) => {
const defaulted_form = Object.assign({ ["case"]: "", gender: "", number: "", animacy: "" }, form);
const formCase = defaulted_form["case"];
const formGender = defaulted_form["gender"];
const formNumber = defaulted_form["number"];
const formAnimacy = defaulted_form["animacy"];
const this_form = this.form();
if (["", this_form["case"]].includes(formCase) &&
["", this_form.gender].includes(formGender) &&
["", this_form["number"]].includes(formNumber) &&
["", this_form.animacy].includes(formAnimacy)) {
filtered.push(text);
}
return filtered;
}, []);
if (invariants.length === 0) {
throw new InternalDataError();
}
return invariants[0];
}
}
export class CompoundOrdinalLexeme extends ParadigmLexeme {
constructor(value, prefixes, paradigm, persistent_form) {
super(value, paradigm, persistent_form);
this.cardinal_values = prefixes;
}
text() {
return [...this.cardinal_values.slice().reverse(), super.text()].join("");
}
}