all tenses in equative explorer 💪

This commit is contained in:
lingdocs 2021-10-22 23:22:09 -04:00
parent 9466bc5ff8
commit 2d17daf81f
9 changed files with 217 additions and 57 deletions

View File

@ -5,7 +5,7 @@
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.4",
"@lingdocs/lingdocs-main": "^0.2.0",
"@lingdocs/pashto-inflector": "^1.3.1",
"@lingdocs/pashto-inflector": "^1.3.2",
"@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10",

View File

@ -9,15 +9,15 @@ import {
ParticipleInput,
isParticipleInput,
getEnglishParticiple,
TenseInput,
} from "../../lib/equative-machine";
export function sort<T extends (Adjective | Noun | ParticipleInput)>(arr: Readonly<T[]>): T[] {
return [...arr].sort((a, b) => a.p.localeCompare(b.p));
}
export function makeBlockWPronouns(e: Adjective | UnisexNoun, tense: TenseInput, length?: "short" | "long"): T.SingleOrLengthOpts<T.VerbBlock> {
if (tense === "past" && !length) {
export function makeBlockWPronouns(e: Adjective | UnisexNoun, tense: EquativeTense, length?: "short" | "long"): T.SingleOrLengthOpts<T.VerbBlock> {
// if the output's gonna have long / short forms (if it's past or wouldBe) then recursive call to make the long and short versions
if (!length && "long" in assembleEquativeOutput(equativeMachine(0, e, tense))) {
return {
short: makeBlockWPronouns(e, tense, "short") as T.VerbBlock,
long: makeBlockWPronouns(e, tense, "long") as T.VerbBlock,

View File

@ -112,32 +112,34 @@ export function SubjectSelector({ state, dispatch }: {
{...zIndexProps}
/>
<div className="d-flex flex-row justify-content-center mt-3">
{state.subjectType !== "participle" && <>
<div className="mr-2">
<ButtonSelect
small
options={[
...(state.subjectType === "unisexNoun" || ("noun" && isMascNoun(state.subjectsSelected[state.subjectType])))
? [{ label: "Masc.", value: "masc" }] : [],
...(state.subjectType === "unisexNoun" || ("noun" && isFemNoun(state.subjectsSelected[state.subjectType])))
? [{ label: "Fem.", value: "fem" }] : [],
]}
value={state.subjectType === "noun" ? (isMascNoun(state.subjectsSelected[state.subjectType]) ? "masc" : "fem") : state.subjectsSelected.info.gender}
handleChange={state.subjectType === "noun" ? p => null : (p) => dispatch({ type: "setSubjectGender", payload: p as T.Gender })}
/>
</div>
<div className="ml-2">
<ButtonSelect
small
options={[
...!pluralNounSelected ? [{ label: "Singular", value: "singular" }] : [],
{ label: "Plural", value: "plural" },
]}
value={(state.subjectsSelected.info.plural || pluralNounSelected) ? "plural" : "singular"}
handleChange={(p) => dispatch({ type: "setSubjectPlural", payload: p === "plural" ? true : false })}
/>
</div>
</>}
<div className="mr-2">
<ButtonSelect
small
options={[
...(state.subjectType === "unisexNoun" || (state.subjectType === "participle") || (isMascNoun(state.subjectsSelected[state.subjectType])))
? [{ label: "Masc.", value: "masc" }] : [],
...(state.subjectType === "unisexNoun" || ((state.subjectType !== "participle") && isFemNoun(state.subjectsSelected[state.subjectType])))
? [{ label: "Fem.", value: "fem" }] : [],
]}
value={state.subjectType === "noun"
? (isMascNoun(state.subjectsSelected[state.subjectType]) ? "masc" : "fem")
: state.subjectType === "participle"
? "masc"
: state.subjectsSelected.info.gender}
handleChange={state.subjectType === "noun" ? p => null : (p) => dispatch({ type: "setSubjectGender", payload: p as T.Gender })}
/>
</div>
<div className="ml-2">
<ButtonSelect
small
options={[
...(!pluralNounSelected && state.subjectType !== "participle") ? [{ label: "Singular", value: "singular" }] : [],
{ label: "Plural", value: "plural" },
]}
value={(state.subjectsSelected.info.plural || pluralNounSelected || state.subjectType === "participle") ? "plural" : "singular"}
handleChange={(p) => dispatch({ type: "setSubjectPlural", payload: p === "plural" ? true : false })}
/>
</div>
</div>
</>
}
@ -208,9 +210,13 @@ export function TenseSelector({ state, dispatch }: {
state: ExplorerState,
dispatch: (action: ExplorerReducerAction) => void,
}) {
const options = [
const options: { value: EquativeTense, label: string }[] = [
{ value: "present", label: "Present" },
{ value: "subjunctive", label: "Habitual / Subjunctive" },
{ value: "past", label: "Past" },
{ value: "future", label: "Future" },
{ value: "wouldBe", label: '"Would Be"' },
{ value: "pastSubjunctive", label: "Past Subjunctive" },
];
function onTenseSelect({ value }: any) {
dispatch({ type: "setTense", payload: value });

View File

@ -1,11 +1,11 @@
import { Types as T } from "@lingdocs/pashto-inflector";
import { ParticipleInput, TenseInput } from "../../lib/equative-machine";
import { ParticipleInput } from "../../lib/equative-machine";
export type PredicateType = keyof PredicatesSelected;
export type SubjectType = "noun" | "pronouns" | "participle" | "unisexNoun";
export type ExplorerState = {
tense: TenseInput,
tense: EquativeTense,
length: "short" | "long",
subjectType: SubjectType,
subjectsSelected: SubjectSelected,
@ -39,7 +39,7 @@ export type ExplorerReducerAction = {
} | {
type: "setSubjectGender", payload: T.Gender,
} | {
type: "setTense", payload: TenseInput,
type: "setTense", payload: EquativeTense,
} | {
type: "setLength", payload: "short" | "long",
};

View File

@ -28,7 +28,7 @@ import EquativeFormChoice from "../../components/EquativeFormChoice";
import Formula from "../../components/formula/Formula";
import Link from "../../components/Link";
## Future / Presumptive Equative
## Future Equative
This is used for:
@ -161,12 +161,13 @@ It is usually used in the short form.
},
])}</Examples>
## Affirmative Equative
## "Would be" Equative
This is used:
1. To affirm or to make a strong assumption that something will have been something. ("I'll have been ...")
2. To say what would have happened if a hypothetical condition were true. ("If ..., I'd be ...")
1. To talk about something being something repeatedly in the past
2. To say something would have been something
1. To affirm or to make a strong assumption that something will have been something
Like the <Link to="#past-equative">past equative</Link> that it's based on, it's usually used with the short form.
@ -212,23 +213,23 @@ Like the <Link to="#past-equative">past equative</Link> that it's based on, it's
<Examples opts={opts}>{psmd([
{
p: "ډوډۍ **به** تیاره **وه**.",
f: "DoDúy **ba** tayáara **wa**.",
e: "The food **will have been** ready.",
p: "زه به هر سهار هلته وم",
f: "zu ba hăr saháar halta wum",
e: "I would be there every morning",
},
{
p: "ته **به** خبر **وې**",
f: "tu **ba** khabúr **we**.",
e: "Youwill have known.",
e: "You would have known.",
},
{
p: "که خوب مې نه وای کړی، زه **به** ستړی **وم**.",
f: "ku khob me nu waay kúRey, zu **ba** stúRey **wum**.",
e: "If I hadn't slept, I **would have been** tired.",
e: "If I hadn't slept, I **would be been** tired.",
},
])}</Examples>
## Conterfactual / Past Subjunctive / Wish Equative
## Past Subjunctive
This is used to talk about something being hypothetically something, or to wish that something were something. ("If I was ...", "If only I was ..."). It is also used for prayers and blessings in some dialects.

View File

@ -5,7 +5,6 @@ import {
PredicateInput,
ParticipleInput,
assembleEquativeOutput,
TenseInput,
} from "./equative-machine";
import {
Types as T,
@ -46,7 +45,7 @@ const abilities: {
in: {
subject: SubjectInput,
predicate: PredicateInput,
tense: TenseInput,
tense: EquativeTense,
},
out: EquativeMachineOutput,
}[],
@ -62,6 +61,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "زه", f: "zu", e: "I (m.)" }],
predicate: [{ p: "ستړی", f: "stúRey", e: "tired" }],
equative: [{ p: "یم", f: "yum", e: "am" }],
@ -74,6 +74,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "تاسو", f: "táaso", e: "You (f. pl.)" }, { p: "تاسې", f: "táase", e: "You (f. pl.)"}],
predicate: [{ p: "ستړې", f: "stúRe", e: "tired" }],
equative: [{ p: "یئ", f: "yeyy", e: "are" }],
@ -87,6 +88,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "هغه", f: "haghá", e: "She/it (f.)" }],
predicate: [{ p: "خفه", f: "khufa", e: "sad" }],
equative: [{ p: "ده", f: "da", e: "is" }],
@ -104,6 +106,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "زه", f: "zu", e: "I (f.)" }],
predicate: [{ p: "افغانۍ", f: "afghaanúy", e: "(a/the) Afghan" }],
equative: [{ p: "یم", f: "yum", e: "am" }],
@ -116,6 +119,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "مونږ", f: "moonG", e: "We (f. pl.)" }, { p: "موږ", f: "mooG", e: "We (f. pl.)" }],
predicate: [
{ p: "افغانیانې", f: "afghaaniyáane", e: "(the) Afghans" },
@ -131,6 +135,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "مونږ", f: "moonG", e: "We (f. pl.)" }, { p: "موږ", f: "mooG", e: "We (f. pl.)" }],
predicate: [{ p: "انسانانې", f: "insaanáane", e: "(the) humans" }, { p: "انسانې", f: "insaane", e: "(the) humans" }],
equative: [{ p: "یو", f: "yoo", e: "are" }],
@ -143,6 +148,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "ته", f: "tu", e: "You (f.)" }],
predicate: [{ p: "انسانه", f: "insaana", e: "(a/the) human" }],
equative: [{ p: "یې", f: "ye", e: "are" }],
@ -163,6 +169,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: [{ p: "دی", f: "dey", e: "is" }],
@ -178,6 +185,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "کتابونه", f: "kitaabóona", e: "(The) books" }],
predicate: [{ p: "زاړه", f: "zaaRu", e: "old" }],
equative: [{ p: "دي", f: "dee", e: "are" }],
@ -193,6 +201,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "ښځه", f: "xúdza", e: "(A/The) woman" }],
predicate: [{ p: "زړه", f: "zaRa", e: "old" }],
equative: [{ p: "ده", f: "da", e: "is" }],
@ -208,6 +217,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "ښځې", f: "xúdze", e: "(The) women" }],
predicate: [{ p: "زړې", f: "zaRe", e: "old" }],
equative: [{ p: "دي", f: "dee", e: "are" }],
@ -224,6 +234,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "ښځې", f: "xúdze", e: "(The) women" }],
predicate: [{ p: "خفه", f: "khufa", e: "sad" }],
equative: [{ p: "دي", f: "dee", e: "are" }],
@ -244,6 +255,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "شودې", f: "shoodé", e: "(The) milk" }],
predicate: [{ p: "ښې", f: "xe", e: "good" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -259,6 +271,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "غنم", f: "ghanúm", e: "(The) wheat" }],
predicate: [{ p: "زاړه", f: "zaaRu", e: "old" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -276,6 +289,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "خوړل", f: "khoRul", e: "eating" }],
predicate: [{ p: "ښه", f: "xu", e: "good" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -288,6 +302,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "اخیستل", f: "akheestul", e: "taking" }],
predicate: [{ p: "زاړه", f: "zaaRu", e: "old" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -300,6 +315,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "جګېدل", f: "jugedul", e: "getting up" }],
predicate: [{ p: "سخت", f: "sakht", e: "hard" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -317,6 +333,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "ته", f: "tu", e: "You (m.)" }],
predicate: [{ p: "لیکل", f: "leekul", e: "writing" }],
equative: [{ p: "دي", f: "dee", e: "are" }],
@ -340,6 +357,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "خوشحالي", f: "khosh`haalee", e: "(A/The) happiness" }],
predicate: [{ p: "خوراک", f: "khoráak", e: "(a/the) food" }],
equative: [{ p: "دی", f: "dey", e: "is" }],
@ -360,6 +378,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "وروروالی", f: "wrorwaaley", e: "(A/The) brotherhood" }],
predicate: [{ p: "زغمل", f: "zghamul", e: "enduring" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -380,6 +399,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "لیکل", f: "leekul", e: "writing" }],
predicate: [{ p: "خوشحالي", f: "khosh`haalee", e: "(a/the) happiness" }],
equative: [{ p: "ده", f: "da", e: "is" }],
@ -397,6 +417,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "لیکل", f: "leekul", e: "writing" }],
predicate: [{ p: "پوهېدل", f: "pohedul", e: "understanding" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -421,6 +442,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "کتابونه", f: "kitaabóona", e: "(The) books" }],
predicate: [{ p: "نرسه", f: "narsa", e: "(a/the) nurse" }],
equative: [{ p: "ده", f: "da", e: "are" }],
@ -442,6 +464,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [
{ p: "نرسانې", f: "narsáane", e: "(The) nurses" },
{ p: "نرسې", f: "narse", e: "(The) nurses" },
@ -469,6 +492,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "نرسه", f: "narsa", e: "(A/The) nurse" }],
predicate: [{ p: "کتابونه", f: "kitaabóona", e: "(the) books" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -490,6 +514,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "نرسه", f: "narsa", e: "(A/The) nurse" }],
predicate: [{ p: "غږېدل", f: "ghuGedul", e: "speaking" }],
equative: [{ p: "دي", f: "dee", e: "is" }],
@ -511,6 +536,7 @@ const abilities: {
tense: "present",
},
out: {
ba: false,
subject: [{ p: "لیکل", f: "leekul", e: "writing" }],
predicate: [{ p: "نرسه", f: "narsa", e: "(a/the) nurse" }],
equative: [{ p: "ده", f: "da", e: "is" }],
@ -531,6 +557,7 @@ const abilities: {
tense: "past",
},
out: {
ba: false,
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: {
@ -541,6 +568,96 @@ const abilities: {
},
],
},
{
label: '"Would be" tense',
tests: [
{
in: {
subject: {
entry: { "ts":1527812817,"i":9921,"p":"کتاب","f":"kitáab","g":"kitaab","e":"book","c":"n. m." } as SingularEntry<Noun>,
plural: false,
},
predicate: {"ts":1527815451,"i":7193,"p":"زوړ","f":"zoR","g":"zoR","e":"old","c":"adj. irreg.","infap":"زاړه","infaf":"zaaRu","infbp":"زړ","infbf":"zaR"} as Adjective,
tense: "wouldBe",
},
out: {
ba: true,
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: {
short: [{ p: "و", f: "wo", e: "would be" }],
long: [{ p: "ولو", f: "wulo", e: "would be" }],
},
},
},
],
},
{
label: "Subjunctive tense",
tests: [
{
in: {
subject: {
entry: { "ts":1527812817,"i":9921,"p":"کتاب","f":"kitáab","g":"kitaab","e":"book","c":"n. m." } as SingularEntry<Noun>,
plural: false,
},
predicate: {"ts":1527815451,"i":7193,"p":"زوړ","f":"zoR","g":"zoR","e":"old","c":"adj. irreg.","infap":"زاړه","infaf":"zaaRu","infbp":"زړ","infbf":"zaR"} as Adjective,
tense: "subjunctive",
},
out: {
ba: false,
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: [{ p: "وي", f: "wee", e: "is" }],
},
},
],
},
{
label: "Future tense",
tests: [
{
in: {
subject: {
entry: { "ts":1527812817,"i":9921,"p":"کتاب","f":"kitáab","g":"kitaab","e":"book","c":"n. m." } as SingularEntry<Noun>,
plural: false,
},
predicate: {"ts":1527815451,"i":7193,"p":"زوړ","f":"zoR","g":"zoR","e":"old","c":"adj. irreg.","infap":"زاړه","infaf":"zaaRu","infbp":"زړ","infbf":"zaR"} as Adjective,
tense: "future",
},
out: {
ba: true,
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: [{ p: "وي", f: "wee", e: "will be" }],
},
},
],
},
{
label: "Past Subjunctive Tense",
tests: [
{
in: {
subject: {
entry: { "ts":1527812817,"i":9921,"p":"کتاب","f":"kitáab","g":"kitaab","e":"book","c":"n. m." } as SingularEntry<Noun>,
plural: false,
},
predicate: {"ts":1527815451,"i":7193,"p":"زوړ","f":"zoR","g":"zoR","e":"old","c":"adj. irreg.","infap":"زاړه","infaf":"zaaRu","infbp":"زړ","infbf":"zaR"} as Adjective,
tense: "pastSubjunctive",
},
out: {
ba: false,
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: [
{ p: "وای", f: "waay", e: "were" },
{ p: "وی", f: "wey", e: "were" },
],
},
},
],
},
];
describe("equativeMachine", () => {
@ -558,6 +675,7 @@ test("assembleEquativeOutput", () => {
subject: [{ p: "کتابونه", f: "kitaabóona", e: "(The) books" }],
predicate: [{ p: "زاړه", f: "zaaRu", e: "old" }],
equative: [{ p: "دي", f: "dee", e: "are" }],
ba: false,
})).toEqual([{ p: "کتابونه زاړه دي", f: "kitaabóona zaaRu dee", e: "(The) books are old" }]);
expect(assembleEquativeOutput({
subject: [{ p: "مونږ", f: "moonG", e: "We (f. pl.)" }, { p: "موږ", f: "mooG", e: "We (f. pl.)" }],
@ -566,6 +684,7 @@ test("assembleEquativeOutput", () => {
{ p: "افغانۍ", f: "afghaanúy", e: "(the) Afghans" },
],
equative: [{ p: "یو", f: "yoo", e: "are" }],
ba: false,
})).toEqual([
{ p: "مونږ افغانیانې یو", f: "moonG afghaaniyáane yoo", e: "We (f. pl.) are (the) Afghans" },
{ p: "مونږ افغانۍ یو", f: "moonG afghaanúy yoo", e: "We (f. pl.) are (the) Afghans" },
@ -579,8 +698,21 @@ test("assembleEquativeOutput", () => {
short: [{ p: "و", f: "wo", e: "was" }],
long: [{ p: "ولو", f: "wulo", e: "was" }],
},
ba: false,
})).toEqual({
short: [{ p: "کتاب زوړ و", f: "kitáab zoR wo", e: "(A/The) book was old" }],
long: [{ p: "کتاب زوړ ولو", f: "kitáab zoR wulo", e: "(A/The) book was old" }],
});
expect(assembleEquativeOutput({
subject: [{ p: "کتاب", f: "kitáab", e: "(A/The) book" }],
predicate: [{ p: "زوړ", f: "zoR", e: "old" }],
equative: {
short: [{ p: "و", f: "wo", e: "would be" }],
long: [{ p: "ولو", f: "wulo", e: "would be" }],
},
ba: true,
})).toEqual({
short: [{ p: "کتاب به زوړ و", f: "kitáab ba zoR wo", e: "(A/The) book would be old" }],
long: [{ p: "کتاب به زوړ ولو", f: "kitáab ba zoR wulo", e: "(A/The) book would be old" }],
});
});

View File

@ -21,6 +21,7 @@ export type EquativeMachineOutput = {
subject: T.PsString[],
predicate: T.PsString[],
equative: T.SingleOrLengthOpts<T.ArrayOneOrMore<T.PsString>>,
ba: boolean,
};
export type NounInput = {
@ -38,9 +39,8 @@ export type PersonInput = T.Person;
export type EntityInput = SubjectInput | PredicateInput;
export type SubjectInput = PersonInput | NounInput | ParticipleInput | SpecifiedUnisexNounInput;
export type PredicateInput = PersonInput | NounInput | Adjective | SpecifiedUnisexNounInput | UnisexNoun | ParticipleInput;
export type TenseInput = "present" | "past";
export function equativeMachine(sub: SubjectInput, pred: PredicateInput, tense: TenseInput = "present"): EquativeMachineOutput {
export function equativeMachine(sub: SubjectInput, pred: PredicateInput, tense: EquativeTense): EquativeMachineOutput {
// - english equative always agrees with subject
// - pashto equative agrees with predicate, unless it's an adjective, in which case the
// agreement reverts to the subject
@ -49,10 +49,12 @@ export function equativeMachine(sub: SubjectInput, pred: PredicateInput, tense:
const subject = makeEntity(sub);
const predicate = makeEntity(pred, subjPerson);
const equative = makeEquative(subjPerson, predPerson, sub, tense);
const ba = determineBa(tense);
return {
subject,
predicate,
equative,
ba,
};
}
@ -67,10 +69,11 @@ export function assembleEquativeOutput(o: EquativeMachineOutput): T.SingleOrLeng
// soooo cool how this works 🤓
const equatives = o.equative;
const predicates = o.predicate;
const ba = o.ba ? { p: " به", f: " ba" } : "";
const ps = o.subject.flatMap(subj => (
predicates.flatMap(pred => (
equatives.map(eq => (
concatPsString(subj, " ", pred, " ", eq))
concatPsString(subj, ba, " ", pred, " ", eq))
)
))
));
@ -80,6 +83,10 @@ export function assembleEquativeOutput(o: EquativeMachineOutput): T.SingleOrLeng
// LEVEL 2 FUNCTIONS
function determineBa(tense: EquativeTense): boolean {
return (tense === "future" || tense === "wouldBe");
}
function getInputPerson(e: SubjectInput, part: "subject"): T.Person;
function getInputPerson(e: PredicateInput, part: "predicate"): T.Person | undefined;
function getInputPerson(e: EntityInput, part: "subject" | "predicate"): T.Person | undefined {
@ -121,7 +128,14 @@ function makeEntity(e: EntityInput, subjPerson?: T.Person): T.PsString[] {
throw new Error(`invalid entity in ${subjPerson ? "predicate" : "subject"}`);
}
function makeEquative(subj: T.Person, pred: T.Person, subjectInput: SubjectInput, tense: TenseInput): T.SentenceForm {
function makeEquative(subj: T.Person, pred: T.Person, subjectInput: SubjectInput, tense: EquativeTense): T.SentenceForm {
function getEngEq(row: number, col: number): string {
const t = grammarUnits.englishEquative[tense === "subjunctive" ? "present" : tense];
return typeof t === "string"
? t
: t[row][col];
}
const isPluralNoun = isNounInput(subjectInput) && isPluralEntry(subjectInput.entry);
// The subject's person information, for the English equative
const [eeRow, eeCol] = getVerbBlockPosFromPerson(
@ -129,10 +143,15 @@ function makeEquative(subj: T.Person, pred: T.Person, subjectInput: SubjectInput
? T.Person.ThirdSingMale
: subj
);
const baseTense = (tense === "future")
? "subjunctive"
: tense === "wouldBe"
? "past"
: tense;
return addEnglish(
grammarUnits.englishEquative[tense][eeRow][eeCol],
getEngEq(eeRow, eeCol),
// pashto agrees with predicate (if possible)
getPersonFromVerbForm(grammarUnits.equativeEndings[tense], pred),
getPersonFromVerbForm(grammarUnits.equativeEndings[baseTense], pred),
);
}

4
src/types.d.ts vendored
View File

@ -56,4 +56,6 @@ type Words = {
nouns: Noun[],
adjectives: Adjective[],
verbs: Verb[],
}
}
type EquativeTense = "present" | "subjunctive" | "past" | "future" | "wouldBe" | "pastSubjunctive";

View File

@ -1684,10 +1684,10 @@
pbf "^3.2.1"
rambda "^6.7.0"
"@lingdocs/pashto-inflector@^1.3.1":
version "1.3.1"
resolved "https://npm.lingdocs.com/@lingdocs%2fpashto-inflector/-/pashto-inflector-1.3.1.tgz#09aca1e52507361d6efd5a87b7b7135704dc03a3"
integrity sha512-y8KKqvBau64zWrDP3Z7F4Zl9dxHXcB9WUyp1YRhL6jW1uqx4e92jF962p72oRkhlXGVLOXFuPFWmQqWHBVhvqw==
"@lingdocs/pashto-inflector@^1.3.2":
version "1.3.2"
resolved "https://npm.lingdocs.com/@lingdocs%2fpashto-inflector/-/pashto-inflector-1.3.2.tgz#a5501d9a56c8590eee052a88ffdbe38a07594f29"
integrity sha512-crZlvjLssb+Q6kh6sAHlg4A4BerJnurSFUMz0fyYl3PlULsZyVHGvKepHYhP5AXyWt34zGiTzHTWapzIWsWtiQ==
dependencies:
classnames "^2.2.6"
pbf "^3.2.1"