UNPKG

@yar.ua/numerals

Version:

Number to text - Inflector for Ukrainian numerals

45 lines (44 loc) 1.76 kB
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(""); } }