diff --git a/src/demo-components/VPBuilderDemo.tsx b/src/demo-components/VPBuilderDemo.tsx index 59b5d90..058efb8 100644 --- a/src/demo-components/VPBuilderDemo.tsx +++ b/src/demo-components/VPBuilderDemo.tsx @@ -14,6 +14,7 @@ import { import { entryFeeder } from "./entryFeeder"; import { renderVerb } from "../lib/src/new-verb-engine/render-verb"; import NPPronounPicker from "../components/src/np-picker/NPPronounPicker"; +import { getAllRs } from "../lib/src/new-verb-engine/rs-helpers"; const transitivities: T.Transitivity[] = [ @@ -152,6 +153,7 @@ function VPBuilderDemo({ opts }: { person: testPerson.person, voice: testVoice, }) : undefined; + const rs = v ? getAllRs(v.verb as T.VerbEntry) : undefined return
@@ -249,7 +251,10 @@ function VPBuilderDemo({ opts }: { pronoun={testPerson} role="subject" opts={opts} - /> + /> +
+            {JSON.stringify(rs, null, "  ")}
+        
             {JSON.stringify(rv, null, "  ")}
         
diff --git a/src/lib/src/assert-never.ts b/src/lib/src/assert-never.ts new file mode 100644 index 0000000..39e0c6d --- /dev/null +++ b/src/lib/src/assert-never.ts @@ -0,0 +1,4 @@ +export function assertNever(x: never) { + throw new Error("unexpected object: "+x); + return x; +} \ No newline at end of file diff --git a/src/lib/src/new-verb-engine/render-verb.test.ts b/src/lib/src/new-verb-engine/render-verb.test.ts index db68294..561349d 100644 --- a/src/lib/src/new-verb-engine/render-verb.test.ts +++ b/src/lib/src/new-verb-engine/render-verb.test.ts @@ -1,14 +1,6 @@ import * as T from "../../../types"; import { renderVerb } from "./render-verb"; - -export function vEntry(e: any, c?: any): T.VerbEntry { - return { - entry: e, - ...c ? { - c, - } : {}, - } as T.VerbEntry; -} +import { vEntry } from "./rs-helpers"; const wahul = vEntry({"ts":1527815399,"i":15049,"p":"وهل","f":"wahul","g":"wahul","e":"to hit","r":4,"c":"v. trans.","tppp":"واهه","tppf":"waahu","ec":"hit,hits,hitting,hit,hit"}); const achawul = vEntry({"ts":1527811872,"i":224,"p":"اچول","f":"achawul","g":"achawul","e":"to put, pour, drop, throw, put on","r":4,"c":"v. trans.","ec":"put,puts,putting,put,put"}); diff --git a/src/lib/src/new-verb-engine/roots-and-stems.test.ts b/src/lib/src/new-verb-engine/roots-and-stems.test.ts index 272f4f5..4a63e01 100644 --- a/src/lib/src/new-verb-engine/roots-and-stems.test.ts +++ b/src/lib/src/new-verb-engine/roots-and-stems.test.ts @@ -1,15 +1,14 @@ import * as T from "../../../types"; -import { getRootStem } from "./roots-and-stems"; -import { vEntry } from "./render-verb.test"; -import { ooPrefix } from "../grammar-units"; +import { vEntry } from "./rs-helpers"; +import { getAllRs } from "./rs-helpers"; const wahul = vEntry({"ts":1527815399,"i":15049,"p":"وهل","f":"wahul","g":"wahul","e":"to hit","r":4,"c":"v. trans.","tppp":"واهه","tppf":"waahu","ec":"hit,hits,hitting,hit,hit"}); const achawul = vEntry({"ts":1527811872,"i":224,"p":"اچول","f":"achawul","g":"achawul","e":"to put, pour, drop, throw, put on","r":4,"c":"v. trans.","ec":"put,puts,putting,put,put"}); const ganul = vEntry({"ts":1527812000,"i":11398,"p":"ګڼل","f":"gaNul, guNul","g":"gaNul,guNul","e":"to count, consider, reckon, suppose, assume","r":4,"c":"v. trans.","tppp":"ګاڼه","tppf":"gaaNu","ec":"deem"}); const kawulStat = vEntry({"ts":1579015359582,"i":11030,"p":"کول","f":"kawul","g":"kawul","e":"to make ____ ____ (as in \"He's making me angry.\")","r":4,"c":"v. trans.","ssp":"کړ","ssf":"kR","prp":"کړل","prf":"kRul","pprtp":"کړی","pprtf":"kúRey","noOo":true,"ec":"make,makes,making,made,made"}); -const kawulDyn = vEntry({"ts":1527812752,"i":11031,"p":"کول","f":"kawul","g":"kawul","e":"to do (an action or activity)","r":4,"c":"v. trans./gramm. trans.","ssp":"وکړ","ssf":"óokR","prp":"وکړل","prf":"óokRul","pprtp":"کړی","pprtf":"kúRey","diacExcept":true,"ec":"do,does,doing,did,done"}); +const kawulDyn = vEntry({"ts":1527812752,"i":11031,"p":"کول","f":"kawul","g":"kawul","e":"to do (an action or activity)","r":4,"c":"v. trans./gramm. trans.","ssp":"وکړ","ssf":"óokR","prp":"وکړل","prf":"óokRul","pprtp":"کړی","pprtf":"kúRey","diacExcept":true,"ec":"do,does,doing,did,done","separationAtP":1,"separationAtF":2}); const kedulStat = vEntry({"ts":1581086654898,"i":11100,"p":"کېدل","f":"kedul","g":"kedul","e":"to become _____","r":2,"c":"v. intrans.","ssp":"ش","ssf":"sh","prp":"شول","prf":"shwul","pprtp":"شوی","pprtf":"shúwey","noOo":true,"ec":"become"}); -const kedulDyn = vEntry({"ts":1527812754,"i":11101,"p":"کېدل","f":"kedul","g":"kedul","e":"to happen, occur","r":2,"c":"v. intrans.","ssp":"وش","ssf":"óosh","prp":"وشول","prf":"óoshwul","pprtp":"شوی","pprtf":"shúwey","diacExcept":true,"ec":"happen"}); +const kedulDyn = vEntry({"ts":1527812754,"i":11101,"p":"کېدل","f":"kedul","g":"kedul","e":"to happen, occur","r":2,"c":"v. intrans.","ssp":"وش","ssf":"óosh","prp":"وشول","prf":"óoshwul","pprtp":"شوی","pprtf":"shúwey","diacExcept":true,"ec":"happen","separationAtP":1,"separationAtF":2}); const raatlul = vEntry({"ts":1527815216,"i":6875,"p":"راتلل","f":"raatlúl","g":"raatlul","e":"to come","r":4,"c":"v. intrans.","psp":"راځ","psf":"raadz","ssp":"راش","ssf":"ráash","prp":"راغلل","prf":"ráaghlul","pprtp":"راغلی","pprtf":"raaghúley","tppp":"راغی","tppf":"ráaghey","noOo":true,"separationAtP":2,"separationAtF":3,"ec":"come,comes,coming,came,come"}); const wartlul = vEntry({"ts":1585228579997,"i":14821,"p":"ورتلل","f":"wărtlul","g":"wartlul","e":"to come / go over to (third person or place)","r":4,"c":"v. intrans.","psp":"ورځ","psf":"wărdz","ssp":"ورش","ssf":"wársh","prp":"ورغلل","prf":"wárghlul","pprtp":"ورغلی","pprtf":"wărghúley","tppp":"ورغی","tppf":"wărghey","noOo":true,"separationAtP":2,"separationAtF":3,"ec":"come,comes,coming,came,come"}); const tlul = vEntry({"ts":1527815348,"i":3791,"p":"تلل","f":"tlul","g":"tlul","e":"to go","r":4,"c":"v. intrans.","psp":"ځ","psf":"dz","ssp":"لاړ ش","ssf":"láaR sh","prp":"لاړ","prf":"láaR","ec":"go,goes,going,went,gone"}); @@ -19,168 +18,1021 @@ const azmoyul = vEntry({"ts":1527811605,"i":468,"p":"ازمویل","f":"azmoyul" const khatul = vEntry({"ts":1527814025,"i":5677,"p":"ختل","f":"khatul","g":"khatul","e":"to climb, ascend, rise, go up; to fall out, to fall off, to leave/dissapear; to turn out to be ...; to give a sentence (in law)","r":3,"c":"v. intrans.","psp":"خېژ","psf":"khejz","tppp":"خوت","tppf":"khot","ec":"climb"}); const rasedul = vEntry({"ts":1527813573,"i":7057,"p":"رسېدل","f":"rasedul","g":"rasedul","e":"arrive, reach; (fig.) understand, attain to; mature, ripen","r":4,"c":"v. intrans.","shortIntrans":true,"ec":"arrive"}); const weshul = vEntry({"ts":1527811701,"i":15106,"p":"وېشل","f":"weshul","g":"weshul","e":"divide, distribute, share","r":4,"c":"v. trans.","ec":"divide"}); - -type RSO = ReturnType; -function getAllRs(verb: T.VerbEntry): (typeof regularVerbs)[0]["result"] { - return { - stem: { - perfective: getRootStem({ verb, type: "basic", part: { rs: "stem", aspect: "perfective" }, person: undefined }), - imperfective: getRootStem({ verb, type: "basic", part: { rs: "stem", aspect: "imperfective" }, person: undefined }), - }, - root: { - perfective: getRootStem({ verb, type: "basic", part: { rs: "root", aspect: "perfective" }, person: undefined }), - imperfective: getRootStem({ verb, type: "basic", part: { rs: "root", aspect: "imperfective" }, person: undefined }), - }, - }; -} +const watul = vEntry({"ts":1527823376,"i":14759,"p":"وتل","f":"watul","g":"watul","e":"to go out, exit, leave, emerge","r":4,"c":"v. intrans.","psp":"وځ","psf":"oodz","tppp":"واته","tppf":"waatu","ec":"go,goes,going,went,gone","ep":"out"}); +const wurul = vEntry({"ts":1527816865,"i":14903,"p":"وړل","f":"wuRúl, oRúl, wRul","g":"wuRul,oRul,wRul","e":"to take, carry, bear, move (inanimate objects); to win, earn (subjunctive یوسي - yósee or ویسي - wéesee, simple past یو یې وړلو - yo ye wRulo)","r":3,"c":"v. trans.","ssp":"یوس","ssf":"yos","prp":"یوړل","prf":"yóRul","tppp":"یوړ","tppf":"yoR","noOo":true,"separationAtP":2,"separationAtF":2,"diacExcept":true,"ec":"take,takes,taking,took,taken"}); +const kexodul = vEntry({"ts":1527812284,"i":11113,"p":"کېښودل","f":"kexodul","g":"kexodul","e":"to put, to put down, to set in place","r":4,"c":"v. trans.","psp":"ږد","psf":"Gd","ssp":"کېږد","ssf":"kéGd","noOo":true,"separationAtP":2,"separationAtF":2,"ec":"put,puts,putting,put,put"}); +const kenaastul = vEntry({"ts":1527812759,"i":11124,"p":"کېناستل","f":"kenaastul","g":"kenaastul","e":"to sit down, to have a seat","r":4,"c":"v. intrans.","psp":"کېن","psf":"ken","noOo":true,"separationAtP":2,"separationAtF":2,"ec":"sit,sits,sitting,sat","ep":"down"}); +const ghadzedul = vEntry({"ts":1527812615,"i":9500,"p":"غځېدل","f":"ghadzedul","g":"ghadzedul","e":"stretch out, lie, be extended, expand","r":3,"c":"v. intrans.","ec":"stretch","ep":"out"}); const ooPh: T.PH = { - type: "PH", - ps: { p: "و", f: "óo" }, + type: "PH", + ps: { p: "و", f: "óo" }, }; -const regularVerbs: { - verb: T.VerbEntry, - result: Record<"stem" | "root", { - imperfective: RSO, - perfective: RSO, - }> -}[] = [ - { - verb: weshul, - result: { - stem: { - perfective: [ - ooPh, - [{ p: "وېش", f: "wesh" }], - ], - imperfective: [ - [{ p: "وېش", f: "wesh" }], - ], - }, - root: { - perfective: [ - ooPh, - { - long: [{ p: "وېشل", f: "weshul" }], - short: [{ p: "وېش", f: "wesh" }], - }, - ], - imperfective: [ - { - long: [{ p: "وېشل", f: "weshúl" }], - short: [{ p: "وېش", f: "weshX" }], - }, - ], - }, - }, - }, - { - verb: ganul, - result: { - stem: { - perfective: [ - ooPh, - [{ p: "ګڼ", f: "gaN" }], - ], - imperfective: [ - [{ p: "ګڼ", f: "gaN" }], - ], - }, - root: { - perfective: [ - ooPh, - { - long: [{ p: "ګڼل", f: "gaNul" }], - short: [{ p: "ګڼ", f: "gaN" }], - }, - ], - imperfective: [ - { - long: [{ p: "ګڼل", f: "gaNúl" }], - short: [{ p: "ګڼ", f: "gaNX" }], - }, - ], - }, - }, - }, -]; +type TestGroup = { + verb: T.VerbEntry, + result: Record<"stem" | "root", { + imperfective: T.RootStemOutput, + perfective: T.RootStemOutput, + }> +}[]; -const verbsWithIrregularStems: { - verb: T.VerbEntry, - result: Record<"stem" | "root", { - imperfective: RSO, - perfective: RSO, - }> -}[] = [ +const tests: { + title: string, + testGroup: TestGroup, +}[] = + [ { - verb: khorul, - result: { + title: "regular verbs", + testGroup: [ + { + verb: weshul, + result: { stem: { - perfective: [ - ooPh, - [{ p: "خور", f: "khor" }], - ], - imperfective: [ - [{ p: "خور", f: "khor" }], - ], + perfective: [ + ooPh, + [{ p: "وېش", f: "wesh" }], + ], + imperfective: [ + [{ p: "وېش", f: "wesh" }], + ], }, root: { - perfective: [ - ooPh, - { - long: [{ p: "خوړل", f: "khoRul" }], - short: [{ p: "خوړ", f: "khoR" }], - }, - ], - imperfective: [ - { - long: [{ p: "خوړل", f: "khoRúl" }], - short: [{ p: "خوړ", f: "khoRX" }], - }, - ], + perfective: [ + ooPh, + { + long: [{ p: "وېشل", f: "weshul" }], + short: [{ p: "وېش", f: "wesh" }], + }, + ], + imperfective: [ + { + long: [{ p: "وېشل", f: "weshúl" }], + short: [{ p: "وېش", f: "weshX" }], + }, + ], }, + }, }, - }, - { - verb: khatul, - result: { + { + verb: ganul, + result: { stem: { - perfective: [ - ooPh, - [{ p: "خېژ", f: "khejz" }], - ], - imperfective: [ - [{ p: "خېژ", f: "khejz" }], - ], + perfective: [ + ooPh, + [{ p: "ګڼ", f: "gaN" }], + ], + imperfective: [ + [{ p: "ګڼ", f: "gaN" }], + ], }, root: { - perfective: [ - ooPh, - { - long: [{ p: "ختل", f: "khatul" }], - short: [{ p: "خت", f: "khat" }], - }, - ], - imperfective: [ - { - long: [{ p: "ختل", f: "khatúl" }], - short: [{ p: "خت", f: "khatX" }], - }, - ], + perfective: [ + ooPh, + { + long: [{ p: "ګڼل", f: "gaNul" }], + short: [{ p: "ګڼ", f: "gaN" }], + }, + ], + imperfective: [ + { + long: [{ p: "ګڼل", f: "gaNúl" }], + short: [{ p: "ګڼ", f: "gaNX" }], + }, + ], }, + }, }, + ], }, -]; + { + title: "intransitive edul verbs", + testGroup: [ + // without shorter intrans version + { + verb: ghadzedul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo" + } + }, + [ + { + "p": "غځېد", + "f": "ghadzed" + } + ] + ], + "imperfective": [ + [ + { + "p": "غځېږ", + "f": "ghadzéG" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo" + } + }, + { + "long": [ + { + "p": "غځېدل", + "f": "ghadzedul" + } + ], + "short": [ + { + "p": "غځېد", + "f": "ghadzed" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "غځېدل", + "f": "ghadzedúl" + } + ], + "short": [ + { + "p": "غځېد", + "f": "ghadzedX" + }, + ], + }, + ], + }, + }, + }, + // with shorter intrans version + { + verb: rasedul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo" + } + }, + [ + { + "p": "رسېد", + "f": "rased" + } + ] + ], + "imperfective": [ + { + "long": [ + { + "p": "رسېږ", + "f": "raséG" + } + ], + "short": [ + { + "p": "رس", + "f": "ras" + } + ] + } + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo" + } + }, + { + "long": [ + { + "p": "رسېدل", + "f": "rasedul" + } + ], + "short": [ + { + "p": "رسېد", + "f": "rased" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "رسېدل", + "f": "rasedúl" + } + ], + "short": [ + { + "p": "رسېد", + "f": "rasedX" + } + ] + } + ] + } + }, + }, + ], + }, + { + title: "verbs with irregular stems", + testGroup: [ + { + verb: khorul, + result: { + stem: { + perfective: [ + ooPh, + [{ p: "خور", f: "khor" }], + ], + imperfective: [ + [{ p: "خور", f: "khor" }], + ], + }, + root: { + perfective: [ + ooPh, + { + long: [{ p: "خوړل", f: "khoRul" }], + short: [{ p: "خوړ", f: "khoR" }], + }, + ], + imperfective: [ + { + long: [{ p: "خوړل", f: "khoRúl" }], + short: [{ p: "خوړ", f: "khoRX" }], + }, + ], + }, + }, + }, + { + verb: khatul, + result: { + stem: { + perfective: [ + ooPh, + [{ p: "خېژ", f: "khejz" }], + ], + imperfective: [ + [{ p: "خېژ", f: "khejz" }], + ], + }, + root: { + perfective: [ + ooPh, + { + long: [{ p: "ختل", f: "khatul" }], + short: [{ p: "خت", f: "khat" }], + }, + ], + imperfective: [ + { + long: [{ p: "ختل", f: "khatúl" }], + short: [{ p: "خت", f: "khatX" }], + }, + ], + }, + }, + }, + ], + }, + { + title: "verbs with special prefix behavior", + testGroup: [ + { + verb: achawul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "وا", + "f": "wáa" + } + }, + [ + { + "p": "چو", + "f": "chaw" + } + ] + ], + "imperfective": [ + [ + { + "p": "اچو", + "f": "achaw" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "وا", + "f": "wáa" + } + }, + { + "long": [ + { + "p": "چول", + "f": "chawul" + } + ], + "short": [ + { + "p": "چو", + "f": "chaw" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "اچول", + "f": "achawúl" + } + ], + "short": [ + { + "p": "اچو", + "f": "achawX" + } + ] + } + ] + } + }, + }, + { + verb: watul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "wÚ", + "f": "و" + } + }, + [ + { + "p": "وځ", + "f": "oodz" + } + ] + ], + "imperfective": [ + [ + { + "p": "وځ", + "f": "oodz" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo" + } + }, + { + "long": [ + { + "p": "وتل", + "f": "watul" + } + ], + "short": [ + { + "p": "وت", + "f": "wat" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "وتل", + "f": "watúl" + } + ], + "short": [ + { + "p": "وت", + "f": "watX" + } + ] + } + ] + } + }, + }, + { + verb: azmoyul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و ", + "f": "óo`" + } + }, + [ + { + "p": "ازموی", + "f": "azmoy" + } + ] + ], + "imperfective": [ + [ + { + "p": "ازموی", + "f": "azmoy" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و ", + "f": "óo`" + } + }, + { + "long": [ + { + "p": "ازمویل", + "f": "azmoyul" + } + ], + "short": [ + { + "p": "ازموی", + "f": "azmoy" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "ازمویل", + "f": "azmoyúl" + } + ], + "short": [ + { + "p": "ازموی", + "f": "azmoyX" + } + ] + } + ] + } + }, + }, + ], + }, + { + title: "verbs with seperable oo prefix", + testGroup: [ + { + verb: kenaastul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "کې", + "f": "ké" + } + }, + [ + { + "p": "ن", + "f": "n" + } + ] + ], + "imperfective": [ + [ + { + "p": "کېن", + "f": "ken" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "کې", + "f": "ké" + } + }, + { + "long": [ + { + "p": "ناستل", + "f": "naastul" + } + ], + "short": [ + { + "p": "ناست", + "f": "naast" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "کېناستل", + "f": "kenaastúl" + } + ], + "short": [ + { + "p": "کېناست", + "f": "kenaastX" + } + ] + } + ] + } + }, + }, + ], + }, + { + title: "verbs with irregular roots and stems", + testGroup: [ + { + verb: wurul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "یو", + "f": "yó" + } + }, + [ + { + "p": "س", + "f": "s" + } + ] + ], + "imperfective": [ + [ + { + "p": "وړ", + "f": "wuR" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "یو", + "f": "yó" + } + }, + { + "long": [ + { + "p": "ړل", + "f": "Rul" + } + ], + "short": [ + { + "p": "ړ", + "f": "R" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "وړل", + "f": "wuRúl" + } + ], + "short": [ + { + "p": "وړ", + "f": "wuRX" + } + ] + } + ] + } + } + }, + { + verb: kexodul, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "کې", + "f": "ké" + } + }, + [ + { + "p": "ږد", + "f": "Gd" + } + ] + ], + "imperfective": [ + [ + { + "p": "ږد", + "f": "Gd" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "کې", + "f": "ké" + } + }, + { + "long": [ + { + "p": "ښودل", + "f": "xodul" + } + ], + "short": [ + { + "p": "ښود", + "f": "xod" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "کېښودل", + "f": "kexodúl" + } + ], + "short": [ + { + "p": "کېښود", + "f": "kexodX" + } + ] + } + ] + } + }, + }, + ], + }, + { + title: "especially irregular verbs", + testGroup: [ + { + verb: kedulStat, + result: { + "stem": { + "perfective": [ + [ + { + "p": "ش", + "f": "sh" + } + ] + ], + "imperfective": [ + [ + { + "p": "کېږ", + "f": "kéG", + }, + ] + ] + }, + "root": { + "perfective": [ + { + "long": [ + { + "p": "شول", + "f": "shwul" + } + ], + "short": [ + { + "p": "شو", + "f": "shw" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "کېدل", + "f": "kedúl" + } + ], + "short": [ + { + "p": "کېد", + "f": "kedX" + } + ] + } + ] + } + }, + }, + { + verb: kedulDyn, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "f": "óo", + "p": "و" + } + }, + [ + { + "p": "ش", + "f": "sh" + } + ] + ], + "imperfective": [ + [ + { + "p": "کېږ", + "f": "kéG" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "f": "óo", + "p": "و" + } + }, + { + "long": [ + { + "p": "شول", + "f": "shwul" + } + ], + "short": [ + { + "p": "شو", + "f": "shw" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "کېدل", + "f": "kedúl" + } + ], + "short": [ + { + "p": "کېد", + "f": "kedX" + } + ] + } + ] + } + }, + }, + { + verb: kawulStat, + result: { + "stem": { + "perfective": [ + [ + { + "p": "کړ", + "f": "kR" + } + ] + ], + "imperfective": [ + [ + { + "p": "کو", + "f": "kaw" + } + ] + ] + }, + "root": { + "perfective": [ + { + "long": [ + { + "p": "کړل", + "f": "kRul" + } + ], + "short": [ + { + "p": "کړ", + "f": "kR" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "کول", + "f": "kawúl" + } + ], + "short": [ + { + "p": "کو", + "f": "kawX" + } + ] + } + ] + } + }, + }, + { + verb: kawulDyn, + result: { + "stem": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo", + } + }, + [ + { + "p": "کړ", + "f": "kR" + } + ] + ], + "imperfective": [ + [ + { + "p": "کو", + "f": "kaw" + } + ] + ] + }, + "root": { + "perfective": [ + { + "type": "PH", + "ps": { + "p": "و", + "f": "óo", + }, + }, + { + "long": [ + { + "p": "کړل", + "f": "kRul" + } + ], + "short": [ + { + "p": "کړ", + "f": "kR" + } + ] + } + ], + "imperfective": [ + { + "long": [ + { + "p": "کول", + "f": "kawúl" + } + ], + "short": [ + { + "p": "کو", + "f": "kawX" + } + ] + } + ] + } + }, + } + ], + } + ]; -test("basic roots and stems with regular verbs", () => { - regularVerbs.forEach(({ verb, result }) => { - expect(getAllRs(verb)).toEqual(result); +tests.forEach(({ title, testGroup }) => { + test(title, () => { + testGroup.forEach(({ verb, result }) => { + expect(getAllRs(verb)).toEqual(result); }); + }); }); - -test("baisc roots and stems with verbs with irregular stems", () => { - verbsWithIrregularStems.forEach(({ verb, result }) => { - expect(getAllRs(verb)).toEqual(result); - }); -}); \ No newline at end of file diff --git a/src/lib/src/new-verb-engine/roots-and-stems.ts b/src/lib/src/new-verb-engine/roots-and-stems.ts index 57094e5..5c95792 100644 --- a/src/lib/src/new-verb-engine/roots-and-stems.ts +++ b/src/lib/src/new-verb-engine/roots-and-stems.ts @@ -12,8 +12,7 @@ import { import * as T from "../../../types"; import { makePsString, removeFVarientsFromVerb } from "../accent-and-ps-utils"; import { accentOnNFromEnd, removeAccents } from "../accent-helpers"; - -type RootStemOutput = (T.PH | T.SingleOrLengthOpts)[]; +import { assertNever } from "../assert-never"; export function getRootStem({ verb, part, type, person }: { verb: T.VerbEntry, @@ -28,19 +27,17 @@ export function getRootStem({ verb, part, type, person }: { gender: T.Gender, number: T.NounNumber, } | undefined, -}): RootStemOutput { +}): T.RootStemOutput { const v = removeFVarientsFromVerb(verb); if ("participle" in part) { return []; } - if (part.rs === "stem") { - return getStem(v, part.aspect); - } else { - return getRoot(v, part.aspect); - } + return part.rs === "stem" + ? getStem(v, part.aspect) + : getRoot(v, part.aspect); } -function getRoot(verb: T.VerbEntryNoFVars, aspect: T.Aspect): RootStemOutput { +function getRoot(verb: T.VerbEntryNoFVars, aspect: T.Aspect): T.RootStemOutput { if (aspect === "imperfective") { const infinitive = accentOnNFromEnd(makePsString(verb.entry.p, verb.entry.f), 0); return [ @@ -50,33 +47,43 @@ function getRoot(verb: T.VerbEntryNoFVars, aspect: T.Aspect): RootStemOutput { }, ]; } - if (aspect === "perfective") { - const base = removeAccents( - (verb.entry.prp && verb.entry.prf) - ? makePsString(verb.entry.prp, verb.entry.prf) - : makePsString(verb.entry.p, verb.entry.f) - ); - const [perfectiveHead, rest] = getPerfectiveHead(base, verb); - return [ - ...perfectiveHead ? [perfectiveHead] : [], - { - long: [rest], - short: [removeL(rest)], - }, - ]; - } - throw new Error("unknown aspect"); + // aspect === "perfective" + const base = removeAccents( + (verb.entry.prp && verb.entry.prf) + ? makePsString(verb.entry.prp, verb.entry.prf) + : makePsString(verb.entry.p, verb.entry.f) + ); + const [perfectiveHead, rest] = getPerfectiveHead(base, verb); + return [ + ...perfectiveHead ? [perfectiveHead] : [], + { + long: [rest], + short: [removeL(rest)], + }, + ]; } -function getStem(verb: T.VerbEntryNoFVars, aspect: T.Aspect): RootStemOutput { +function getStem(verb: T.VerbEntryNoFVars, aspect: T.Aspect): T.RootStemOutput { if (aspect === "imperfective") { - const base = (verb.entry.psp && verb.entry.psf) - // with irregular imperfective stem - ? makePsString(verb.entry.psp, verb.entry.psf) - // with regular infinitive based imperfective stem - : removeL(makePsString(verb.entry.p, verb.entry.f)); + if (verb.entry.psp && verb.entry.psf) { + return [[makePsString(verb.entry.psp, verb.entry.psf)]]; + } + const rawBase = removeL(makePsString(verb.entry.p, verb.entry.f)); + if (verb.entry.c?.includes("intrans.") && rawBase.p.endsWith("ېد")) { + const long: T.PsString[] = [{ + p: rawBase.p.slice(0, -1) + "ږ", + f: rawBase.f.slice(0, -2) + "éG", + }]; + const short: T.PsString[] | undefined = (verb.entry.shortIntrans) + ? [{ + p: rawBase.p.slice(0, -2), + f: rawBase.f.slice(0, -2), + }] + : undefined; + return short ? [{ long, short }] : [long] + } return [ - [base], + [rawBase], ]; } if (aspect === "perfective") { @@ -101,6 +108,20 @@ function getPerfectiveHead(base: T.PsString, { entry }: T.VerbEntry): [T.PH, T.P // if ((verb.entry.ssp && verb.entry.ssf) || verb.entry.separationAtP) { // // handle split // } + if (entry.separationAtP && entry.separationAtF) { + const ph: T.PH = { + type: "PH", + ps: accentOnNFromEnd({ + p: base.p.slice(0, entry.separationAtP), + f: base.f.slice(0, entry.separationAtF), + }, 0), + }; + const rest = { + p: base.p.slice(entry.separationAtP), + f: base.f.slice(entry.separationAtF), + }; + return [ph, rest]; + } const [ph, rest]: [T.PH | undefined, T.PsString] = entry.noOo ? [undefined, base] : entry.sepOo diff --git a/src/lib/src/new-verb-engine/rs-helpers.ts b/src/lib/src/new-verb-engine/rs-helpers.ts new file mode 100644 index 0000000..4d9a240 --- /dev/null +++ b/src/lib/src/new-verb-engine/rs-helpers.ts @@ -0,0 +1,33 @@ +import * as T from "../../../types"; +import { getRootStem } from "./roots-and-stems"; + +export function vEntry(e: any, c?: any): T.VerbEntry { + return { + entry: e, + ...c ? { + c, + } : {}, + } as T.VerbEntry; +} + +export function getAllRs(verb: T.VerbEntry): { + stem: { + perfective: T.RootStemOutput, + imperfective: T.RootStemOutput, + }, + root: { + perfective: T.RootStemOutput, + imperfective: T.RootStemOutput, + }, +} { + return { + stem: { + perfective: getRootStem({ verb, type: "basic", part: { rs: "stem", aspect: "perfective" }, person: undefined }), + imperfective: getRootStem({ verb, type: "basic", part: { rs: "stem", aspect: "imperfective" }, person: undefined }), + }, + root: { + perfective: getRootStem({ verb, type: "basic", part: { rs: "root", aspect: "perfective" }, person: undefined }), + imperfective: getRootStem({ verb, type: "basic", part: { rs: "root", aspect: "imperfective" }, person: undefined }), + }, + }; +} \ No newline at end of file diff --git a/src/types.ts b/src/types.ts index c842595..eaaef6f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1140,3 +1140,4 @@ export type Welded = { right: VA | PT | VI, }; +export type RootStemOutput = (PH | SingleOrLengthOpts)[];