2021-03-09 12:39:13 +00:00
/ * *
* Copyright ( c ) 2021 lingdocs . com
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree .
*
* /
2021-07-04 09:55:26 +00:00
// FOR ENGLISH FORMS
// GIVEN VERB INFO LIKE THIS
// ["hit", "hits", "hitting", "hit", "hit"]
// ["eat", "eats", "eating", "ate", "eaten"]
// ["see", "sees", "seeing", "saw", "seen"]
// Present Perfect
// Past Perfect
// - subj "had" (N && "not") v.4 obj
// Future Perfect
// - subj "will have" (N && "not") v.4 obj
2021-03-09 12:39:13 +00:00
import {
getPersonInflectionsKey ,
pickPersInf ,
getPersonFromVerbForm ,
2021-10-05 03:27:26 +00:00
getVerbBlockPosFromPerson ,
2021-03-09 12:39:13 +00:00
} from "./misc-helpers" ;
import addPronouns from "./add-pronouns" ;
import * as T from "../types" ;
2021-07-04 09:55:26 +00:00
import { englishEquative } from "./grammar-units" ;
2021-03-09 12:39:13 +00:00
type FilterFunc = ( form : any ) = > boolean ;
type MapFunc = ( opts : {
subject : T.Person ,
object : T . Person ,
displayForm : T.DisplayFormForSentence ,
info : T.NonComboVerbInfo ,
negative : boolean ,
2021-07-04 09:55:26 +00:00
englishConjugation? : T.EnglishVerbConjugation ,
2021-07-09 10:36:56 +00:00
sentenceLevel ? : "easy" | "medium" | "hard" ,
2021-03-09 12:39:13 +00:00
} ) = > T . DisplayFormItem ;
/ * *
* Used to apply a filter function on both the levels of forms and subgroups
*
* @param input
* @param func
* /
const formFilter = (
input : T.DisplayFormItem [ ] ,
func : FilterFunc | FilterFunc [ ]
) : T . DisplayFormItem [ ] = > {
// TODO: Better filtering that lets us filter things only in sub categories
// recursive madness to apply an array of filters 🤪
// i'm doing this because I couldn't get a compose function to work 🤷♂️
if ( Array . isArray ( func ) ) {
if ( func . length === 0 ) return input ;
return formFilter (
formFilter ( input , func [ 0 ] ) ,
func . slice ( 1 ) ,
) ;
}
return (
input . filter ( func )
. map ( ( f ) = > (
"content" in f
? { . . . f , content : f.content.filter ( func ) }
: f
) )
) ;
} ;
/ * *
* Used to apply a filter function on both the levels of forms and subgroups
*
* @param input
* @param func
* /
const formMap = (
input : T.DisplayFormItem [ ] ,
func : MapFunc ,
info : T.NonComboVerbInfo ,
subject : T.Person ,
object : T . Person ,
negative : boolean ,
2021-07-04 09:55:26 +00:00
englishConjugation? : T.EnglishVerbConjugation ,
2021-07-09 10:36:56 +00:00
sentenceLevel ? : "easy" | "medium" | "hard" ,
2021-03-09 12:39:13 +00:00
) : T . DisplayFormItem [ ] = > {
2021-07-04 09:55:26 +00:00
return input . map ( ( f ) = > (
"content" in f
2021-07-09 10:36:56 +00:00
? { . . . f , content : formMap ( f . content , func , info , subject , object , negative , englishConjugation , sentenceLevel ) }
: func ( { displayForm : f as T . DisplayFormForSentence , info , subject , object , negative , englishConjugation , sentenceLevel } )
2021-07-04 09:55:26 +00:00
) ) ;
2021-03-09 12:39:13 +00:00
} ;
2021-07-09 10:36:56 +00:00
const makeSentence = ( { subject , object , info , displayForm , englishConjugation , negative , sentenceLevel } : {
2021-03-09 12:39:13 +00:00
subject : T.Person ,
object : T . Person ,
info : T.NonComboVerbInfo ,
displayForm : T.DisplayFormForSentence ,
negative : boolean ,
2021-07-09 10:36:56 +00:00
sentenceLevel ? : "easy" | "medium" | "hard" ,
2021-07-04 09:55:26 +00:00
englishConjugation? : T.EnglishVerbConjugation ,
2021-03-09 12:39:13 +00:00
} ) : T . DisplayForm = > {
const intransitive = info . transitivity === "intransitive" || ! ! displayForm . passive ;
const ergative = ! intransitive && ! ! displayForm . past ;
function chooseConjugation ( g : T.SingleOrLengthOpts < T.VerbBlock > ) : T . SentenceForm {
const person = ergative
? object
: subject ;
return getPersonFromVerbForm ( g , person ) ;
}
const f = displayForm . form ;
// IMPORTANT TODO!!! -- IS THIS ALWAYS THE OBJECT HERE?
const matrixKey = getPersonInflectionsKey ( object ) ;
const matrixChosen = pickPersInf ( f , matrixKey ) ;
const conjugationChosen = chooseConjugation ( matrixChosen ) ;
const form = addPronouns ( {
s : conjugationChosen ,
subject ,
object ,
info ,
displayForm ,
intransitive ,
ergative ,
matrixKey ,
negative ,
2021-07-04 09:55:26 +00:00
englishConjugation ,
2021-07-09 10:36:56 +00:00
sentenceLevel ,
2021-03-09 12:39:13 +00:00
} ) ;
return {
. . . displayForm ,
form ,
} ;
}
2021-07-08 13:32:05 +00:00
function isToBe ( v : T.EnglishVerbConjugationEc ) : boolean {
return ( v [ 2 ] === "being" ) ;
}
const futureEngBuilder : T.EnglishBuilder = ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } will ${ n ? " not" : "" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
] ) ;
2021-07-04 09:55:26 +00:00
const formsOfConjugation = ( conj : T.VerbConjugation ) : T . DisplayFormItem [ ] = > [
{
label : "Present" ,
aspect : "imperfective" ,
form : conj.imperfective.nonImperative ,
formula : "Imperfective Stem + Present Ending" ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } ${ isToBe ( v )
? ` ${ engEquative ( "present" , s ) } ${ n ? " not" : "" } `
: ` ${ n ? engPresC ( s , [ "don't" , "doesn't" ] ) : "" } ${ n ? v [ 0 ] : engPresC ( s , v ) } ` } ` ,
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "present" , s ) } ${ n ? " not" : "" } ${ v [ 2 ] } ` ,
] ) ,
explanation : "Something that is happening, happens generally, or is definitely about to happen. ('I am ____ing', 'I _____')" ,
} ,
{
label : "Subjunctive" ,
aspect : "perfective" ,
form : conj.perfective.nonImperative ,
formula : "Perfective Stem + Present Ending" ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` that ${ engSubj ( s , true ) } ${ n ? " won't" : " will" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
` should ${ engSubj ( s , true ) } ${ n ? " not" : "" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
explanation : "Used for hypothetical statements about the desire, necessity, purpose, or possibility of something happening. Or for saying something should or shouldn't happen. ('Should I ____?', 'so that'll I'll _____')"
} ,
{
label : "Imperfective Future" ,
aspect : "imperfective" ,
form : conj.imperfective.future ,
advanced : true ,
formula : "به - ba + Present" ,
sentence : true ,
2021-07-08 13:32:05 +00:00
englishBuilder : futureEngBuilder ,
2021-07-04 09:55:26 +00:00
explanation : "Saying something will happen, repeatedly or as an ongoing action" ,
} ,
{
label : "Perfective Future" ,
aspect : "perfective" ,
form : conj.perfective.future ,
advanced : true ,
formula : "به - ba + Subjunctive" ,
sentence : true ,
2021-07-08 13:32:05 +00:00
englishBuilder : futureEngBuilder ,
2021-07-04 09:55:26 +00:00
explanation : "Saying something will happen as a one-time event - May also used when there is some doubt" ,
} ,
2021-07-24 11:43:35 +00:00
. . . conj . imperfective . imperative ?
[ {
label : "Imperfective Imperative" ,
aspect : "imperfective" ,
form : conj.imperfective.imperative ,
formula : "Imperfective Stem + Imperative Ending" ,
explanation : "Commanding someone/people to do something repeatedly, or in general" ,
} as T . DisplayForm ] : [ ] ,
. . . conj . perfective . imperative ?
[ {
label : "Perfective Imperative" ,
aspect : "perfective" ,
form : conj.perfective.imperative ,
formula : "Perfective Stem + Imperative Ending" ,
explanation : "Commanding someone/people to do something one time" ,
} as T . DisplayForm ] : [ ] ,
2021-07-04 09:55:26 +00:00
{
label : "Continuous Past" ,
aspect : "imperfective" ,
form : conj.imperfective.past ,
formula : "Imperfective Root + Past Ending" ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-10-07 18:39:29 +00:00
// - subj pastEquative (N && "not") v.2 obj
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } ${ v [ 2 ] } ` ,
// - subj "would" (N && "not") v.0 obj
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } would ${ n ? " not" : "" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-10-07 18:39:29 +00:00
// - subj pastEquative (N && "not") going to" v.0 obj
` ${ engSubj ( s ) } ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } going to ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
explanation : "Saying something was happening, or would happen ('I was ____ing', 'I would ____')" ,
past : true ,
} ,
{
label : "Simple Past" ,
aspect : "perfective" ,
form : conj.perfective.past ,
formula : "Perfective Root + Past Ending" ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } ${ isToBe ( v )
? ` ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } `
: ` ${ n ? " did not" : "" } ${ v [ 3 ] } ` } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
explanation : "Saying something happened ('I ____ed')" ,
past : true ,
} ,
2021-07-24 11:43:35 +00:00
{
label : "Perfect" ,
subgroup : "perfect" ,
sentence : true ,
content : [
{
label : "Half Perfect" ,
form : conj.perfect.halfPerfect ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } ${ engHave ( s ) } ${ n ? " not" : "" } ${ v [ 4 ] } ` ,
] ) ,
formula : "Past participle inflected" ,
secondPronounNeeded : true ,
2022-02-17 07:27:00 +00:00
explanation : "The base of all perfect forms. Used on it's own as a sort of abreviated form of the present perfect." ,
2021-07-24 11:43:35 +00:00
} ,
{
label : "Past Perfect" ,
form : conj.perfect.past ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } had ${ n ? " not" : "" } ${ v [ 4 ] } ` ,
] ) ,
formula : "Past participle inflected + Past Equative" ,
explanation : "Talking about events that had happened in the past, or had affected a past situation ('I had ____ed')" ,
reorderWithNegative : true ,
} ,
{
label : "Present Perfect" ,
form : conj.perfect.present ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } ${ engHave ( s ) } ${ n ? " not" : "" } ${ v [ 4 ] } ` ,
] ) ,
formula : "Past participle inflected + Present Equative" ,
explanation : "Talking about that something happened in the past and it affects the present ('I have _____ed')" ,
reorderWithNegative : true ,
} ,
{
2022-02-17 07:27:00 +00:00
label : "Habitual Perfect" ,
form : conj.perfect.habitual ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } ${ engHave ( s ) } ${ n ? " not" : "" } ${ v [ 4 ] } ` ,
] ) ,
formula : "Past participle inflected + Habitual Equative" ,
explanation : "Talking about something that will have happened habitually" ,
reorderWithNegative : true ,
} ,
{
label : "Subjunctive Perfect" ,
2021-07-24 11:43:35 +00:00
form : conj.perfect.subjunctive ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` that ${ engSubj ( s , true ) } will have ${ n ? " not" : "" } ${ v [ 4 ] } ` ,
] ) ,
2022-02-17 07:27:00 +00:00
formula : "Past participle inflected + Subjunctive Equative" ,
explanation : "expressing hope, desire, or judgement about an action having happened" ,
2021-07-24 11:43:35 +00:00
reorderWithNegative : true ,
} ,
{
label : "Future/Presumptive Perfect" ,
form : conj.perfect.future ,
advanced : true ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } will ${ n ? " not" : "" } have ${ v [ 4 ] } ` ,
] ) ,
formula : "به - ba + Past participle Inflected + Future Equative" ,
explanation : "Talking about something that will have happened in the future, or guessing that the event will have occured presently ('I will have ____ed')" ,
reorderWithNegative : true ,
} ,
{
label : "Affirmational Perfect" ,
form : conj.perfect.affirmational ,
advanced : true ,
past : true ,
sentence : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } will ${ n ? " not" : "" } have ${ v [ 4 ] } ` ,
] ) ,
explanation : "Affirming that an event will have taken place ('I will have ____ed')" ,
formula : "به - ba + Past Participle Inflected + Past Equative" ,
reorderWithNegative : true ,
} ,
{
label : "Conterfactual/Past Subjunctive Perfect" ,
form : conj.perfect.pastSubjunctiveHypothetical ,
advanced : true ,
past : true ,
sentence : true ,
secondPronounNeeded : true ,
explanation : "Talking about an event that would have hypothetically taken place (but didn't), or that should have taken place but didn't" ,
formula : "به - ba + Past Participle Inflected + Past Subjunctive / Hypothetical Equative" ,
reorderWithNegative : true ,
} ,
] ,
} ,
2021-07-04 09:55:26 +00:00
{
label : "Modal (ability/possibility)" ,
subgroup : "modal" ,
sentence : true ,
content : [
{
label : "Present Modal" ,
aspect : "imperfective" ,
form : conj.imperfective.modal.nonImperative ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } can ${ n ? "'t" : "" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
formula : "Imperfective Root + Non-Inflectinig Ey-Tail + Subjunctive کېدل - to become" ,
explanation : "saying that something is possible currently or in general ('I can ____')" ,
reorderWithNegative : true ,
} ,
{
label : "Subjunctive Modal" ,
aspect : "perfective" ,
form : conj.perfective.modal.nonImperative ,
advanced : true ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` that ${ engSubj ( s , true ) } can ${ n ? "'t" : "" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
formula : "Perfective Root + Non-Inflectinig Ey-Tail + Subjunctive کېدل - to become" ,
explanation : "talking about the possibility of something in a subjunctive way ('so that I can ____')" ,
reorderWithNegative : true ,
} ,
{
label : "Imperfective Future Modal" ,
aspect : "imperfective" ,
form : conj.imperfective.modal.future ,
advanced : true ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } will ${ n ? " not" : "" } be able to ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
formula : "به - ba + Present Modal" ,
explanation : "saying that something will be possible in general or in an ongoing sense in the future ('I'll be able to ____')" ,
reorderWithNegative : true ,
} ,
{
label : "Perfective Future Modal" ,
aspect : "perfective" ,
form : conj.perfective.modal.future ,
advanced : true ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } will ${ n ? " not" : "" } be able to ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
formula : "به - ba + Subjunctive Modal" ,
explanation : "saying that something will be possible at a certain point in the future ('I'll be able to ____')" ,
reorderWithNegative : true ,
} ,
{
label : "Continous Past Modal" ,
aspect : "imperfective" ,
form : conj.imperfective.modal.past ,
advanced : true ,
past : true ,
sentence : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } able to ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } could ${ n ? " not" : "" } ${ v [ 0 ] } ` ,
] ) ,
formula : "Imperfective Root + Non-Inflectinig Ey-Tail + Simple Past کېدل - to become" ,
explanation : "saying that something was possible in general, in an ongoing sense ('I was able to ____', ie. 'I could do ____ any time')" ,
reorderWithNegative : true ,
} ,
{
label : "Simple Past Modal" ,
aspect : "perfective" ,
form : conj.perfective.modal.past ,
formula : "Perfective Root + Non-Inflectinig Ey-Tail + Simple Past کېدل - to become" ,
explanation : "saying that something was possible at a certain point in time ('I was able to ____, at one particular point in time')" ,
past : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-08 13:32:05 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } able to ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
` ${ engSubj ( s ) } could ${ n ? " not" : "" } ${ isToBe ( v ) ? "be" : v [ 0 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
sentence : true ,
advanced : true ,
reorderWithNegative : true ,
} ,
{
label : "Imperfective hypothetical/wildcard Past Modal" ,
aspect : "imperfective" ,
form : conj.imperfective.modal.hypotheticalPast ,
formula : "Imperfective Root + Non-Inflectinig Ey-Tail + ش - sh + Non-Inflectinig Ey-Tail" ,
explanation : "saying that something was possible in general, in an ongoing sense ('I was able to ____', ie. 'I could do ____ any time'). This 'wildcard' form can be used either to talk about hypothetical things, or to avoid worrying about verb agreement" ,
past : true ,
sentence : true ,
advanced : true ,
reorderWithNegative : true ,
} ,
{
label : "Perfective hypothetical/wildcard Past Modal" ,
aspect : "perfective" ,
form : conj.perfective.modal.hypotheticalPast ,
formula : "Perfective Root + Non-Inflectinig Ey-Tail + ش - sh + Non-Inflectinig Ey-Tail" ,
explanation : "saying that something was possible at a certain point in time ('I was able to ____, at one particular point in time'). This 'wildcard' form can be used either to talk about hypothetical things, or to avoid worrying about verb agreement" ,
past : true ,
sentence : true ,
advanced : true ,
reorderWithNegative : true ,
} ,
] ,
} ,
{
label : "Hypothetical/Wish" ,
advanced : true ,
form : conj.hypothetical ,
formula : "Imperfective Root + Non-Inflecting Ey-Tail" ,
explanation : "Talking about a hypothetical, unreal situation, or something that is wished for ('If I ____')" ,
past : true ,
} ,
{
label : "Participle" ,
subgroup : "participle" ,
advanced : true ,
content : [
{
label : "Present Participle" ,
form : conj.participle.present ,
formula : "Short form of Ininitive Root + ونکی - oonkey" ,
explanation : "Making a verb into a noun or adjective, talking about a person or thing that does or experiences something. Also used to say something is about to happen. ('____ing', '____er')" ,
} ,
{
label : "Past Participle" ,
form : conj.participle.past ,
past : true ,
formula : "Infinitive Root or Special Form + Inflecting Ey-Tail" ,
explanation : "Making a verb into a noun or adjective, talking about how a person or thing did or experienced something. ('____ed')" ,
} ,
] ,
} ,
. . . conj . passive ?
[ {
label : "Passive" ,
subgroup : "passive" ,
2021-03-09 12:39:13 +00:00
advanced : true ,
sentence : true ,
content : [
{
2021-07-04 09:55:26 +00:00
label : "Passive Present" ,
2021-03-09 12:39:13 +00:00
aspect : "imperfective" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.imperfective.nonImperative ,
2021-03-09 12:39:13 +00:00
sentence : true ,
2021-07-04 09:55:26 +00:00
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "present" , s ) } ${ n ? " not" : "" } being ${ v [ 4 ] } ` ,
] ) ,
formula : "Long Imperfective Root + Present کېدل - to become" ,
explanation : "Saying that something is being done or is done in general, without mentioning the subject/agent. ('I am being ____en')" ,
2021-03-09 12:39:13 +00:00
} ,
{
2021-07-04 09:55:26 +00:00
label : "Passive Subjunctive" ,
2021-03-09 12:39:13 +00:00
aspect : "perfective" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.perfective.nonImperative ,
2021-03-09 12:39:13 +00:00
sentence : true ,
2021-07-04 09:55:26 +00:00
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` that ${ engSubj ( s , true ) } will ${ n ? " not" : "" } be ${ v [ 4 ] } ` ,
] ) ,
formula : "Long Perfective Root + Subjunctive کېدل - to become" ,
explanation : "Saying that something should be done, or giving a purpose for something being done etc., without mentioning the subject/agent. ('Should I be ____en?', 'So that I'll be ____en')"
2021-03-09 12:39:13 +00:00
} ,
{
2021-07-04 09:55:26 +00:00
label : "Passive Imperfective Future" ,
2021-03-09 12:39:13 +00:00
aspect : "imperfective" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.imperfective.future ,
2021-03-09 12:39:13 +00:00
sentence : true ,
2021-07-04 09:55:26 +00:00
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } will ${ n ? " not" : "" } be ${ v [ 4 ] } ` ,
] ) ,
formula : "به - ba + Passive Present" ,
explanation : "Saying something will be done as a one-time event, without mentioning the subject/agent." ,
2021-03-09 12:39:13 +00:00
} ,
{
2021-07-04 09:55:26 +00:00
label : "Passive Perfective Future" ,
2021-03-09 12:39:13 +00:00
aspect : "perfective" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.perfective.future ,
2021-03-09 12:39:13 +00:00
sentence : true ,
2021-07-04 09:55:26 +00:00
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } will ${ n ? " not" : "" } be ${ v [ 4 ] } ` ,
] ) ,
formula : "به - ba + Passive Subjunctive" ,
explanation : "Saying something will be done in an ongoing or repeated sense, without mentioning the subject/agent."
2021-03-09 12:39:13 +00:00
} ,
{
2021-07-04 09:55:26 +00:00
label : "Passive Continuous Past" ,
2021-03-09 12:39:13 +00:00
aspect : "imperfective" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.imperfective.past ,
2021-03-09 12:39:13 +00:00
past : true ,
sentence : true ,
2021-07-04 09:55:26 +00:00
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } being ${ v [ 4 ] } ` ,
] ) ,
formula : "Long Imperfective Root + Continuous Past کېدل - to become" ,
explanation : "Saying that something was being done, or would be done, without mentioning the subject/agent. ('I was being ____en', 'I would be ____en')" ,
2021-03-09 12:39:13 +00:00
} ,
{
2021-07-04 09:55:26 +00:00
label : "Passive Simple Past" ,
2021-03-09 12:39:13 +00:00
aspect : "perfective" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.perfective.past ,
2021-03-09 12:39:13 +00:00
past : true ,
sentence : true ,
2021-07-04 09:55:26 +00:00
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engEquative ( "past" , s ) } ${ n ? " not" : "" } ${ v [ 4 ] } ` ,
] ) ,
formula : "Long Perfective Root + Simple Past کېدل - to become" ,
explanation : "Saying that was done as a one-time event, without mentioning the subject/agent. ('I was ____en')"
2021-03-09 12:39:13 +00:00
} ,
{
2021-07-04 09:55:26 +00:00
label : "Passive Perfect" ,
subgroup : "passive perfect" ,
passive : true ,
2021-03-09 12:39:13 +00:00
sentence : true ,
2021-07-04 09:55:26 +00:00
content : [
{
label : "Passive Half Perfect" ,
form : conj.passive.perfect.halfPerfect ,
past : true ,
sentence : true ,
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engHave ( s ) } ${ n ? " not" : "" } been ${ v [ 4 ] } ` ,
] ) ,
2022-02-17 07:27:00 +00:00
formula : "Infinitive + کېدل past participle inflected" ,
explanation : "The base of all perfect forms. Used on it's own as a sort of abbreviated form of the present perfect. (Passive voice)" ,
2021-07-04 09:55:26 +00:00
} ,
{
label : "Passive Past Perfect" ,
form : conj.passive.perfect.past ,
past : true ,
sentence : true ,
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } had ${ n ? " not" : "" } been ${ v [ 4 ] } ` ,
] ) ,
2022-02-17 07:27:00 +00:00
formula : "Infinitive + کېدل past participle inflected + Past Equative" ,
2021-07-04 09:55:26 +00:00
explanation : "Talking about events that had happened in the past, or had affected a past situation (Passive voice) ('I had been ____ed')" ,
} ,
{
label : "Passive Present Perfect" ,
form : conj.passive.perfect.present ,
past : true ,
sentence : true ,
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-04 09:55:26 +00:00
` ${ engSubj ( s ) } ${ engHave ( s ) } ${ n ? " not" : "" } been ${ v [ 4 ] } ` ,
] ) ,
2022-02-17 07:27:00 +00:00
formula : "Infinitive + کېدل past participle inflected + Present Equative" ,
2021-07-04 09:55:26 +00:00
explanation : "Talking about that something happened in the past and it affects the present (Passive voice) ('I have been _____ed')" ,
} ,
{
2022-02-17 07:27:00 +00:00
label : "Passive Habitual Perfect" ,
form : conj.passive.perfect.subjunctive ,
past : true ,
sentence : true ,
passive : true ,
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
` ${ engSubj ( s ) } ${ engHave ( s ) } ${ n ? " not" : "" } been ${ v [ 4 ] } ` ,
] ) ,
formula : "Infinitive + کېدل past participle inflected + Habitual Equative" ,
} ,
{
label : "Passive Subjunctive Perfect" ,
2021-07-04 09:55:26 +00:00
form : conj.passive.perfect.subjunctive ,
past : true ,
sentence : true ,
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-05 11:39:52 +00:00
` that ${ engSubj ( s , true ) } will ${ n ? " not" : "" } have been ${ v [ 4 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
2022-02-17 07:27:00 +00:00
formula : "Infinitive + کېدل past participle inflected + Subjunctive Equative" ,
2021-07-04 09:55:26 +00:00
} ,
{
label : "Passive Future/Presumptive Perfect" ,
form : conj.passive.perfect.future ,
advanced : true ,
past : true ,
sentence : true ,
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-05 11:39:52 +00:00
` ${ engSubj ( s ) } will ${ n ? " not" : "" } have been ${ v [ 4 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
2022-02-17 07:27:00 +00:00
formula : "به - ba + Infinitive + کېدل past participle inflected + Future Equative" ,
2021-07-04 09:55:26 +00:00
explanation : "Talking about something that will have happened in the future, or guessing that the event will have occured presently (Passive voice) ('I will have been ____ed')" ,
} ,
{
label : "Passive Affirmational Perfect" ,
form : conj.passive.perfect.affirmational ,
advanced : true ,
past : true ,
sentence : true ,
passive : true ,
2021-07-05 08:21:57 +00:00
englishBuilder : ( s : T.Person , v : T.EnglishVerbConjugationEc , n : boolean ) = > ( [
2021-07-05 11:39:52 +00:00
` ${ engSubj ( s ) } will ${ n ? " not" : "" } have been ${ v [ 4 ] } ` ,
2021-07-04 09:55:26 +00:00
] ) ,
explanation : "Affirming that an event will have taken place (Passive voice) ('I will have been ____ed')" ,
2022-02-17 07:27:00 +00:00
formula : "به - ba + Infinitive + کېدل past participle inflected + Past Equative"
2021-07-04 09:55:26 +00:00
} ,
{
label : "Passive Past Subjunctive / Hypothetical Perfect" ,
form : conj.passive.perfect.pastSubjunctiveHypothetical ,
advanced : true ,
past : true ,
sentence : true ,
passive : true ,
explanation : "Talking about an event that would have hypothetically taken place, or that should have taken place (Passive voice) ('I would have been ____ed')" ,
2022-02-17 07:27:00 +00:00
formula : "به - ba + Infinitive + کېدل past participle inflected + Past Subjunctive / Hypothetical Equative"
2021-07-04 09:55:26 +00:00
} ,
] ,
2021-03-09 12:39:13 +00:00
} ,
2021-07-04 09:55:26 +00:00
]
} as T . DisplayFormSubgroup ]
: [ ] ,
] ;
2021-10-05 03:27:26 +00:00
export const getForms = ( { conj , filterFunc , mode , subject , object , sentenceLevel , englishConjugation , negative } : {
2021-07-04 09:55:26 +00:00
conj : T.VerbConjugation ,
englishConjugation? : T.EnglishVerbConjugation
filterFunc? : FilterFunc | FilterFunc [ ] ,
mode : "chart" | "sentence" ,
subject : T.Person ,
object : T . Person ,
2021-07-09 10:36:56 +00:00
sentenceLevel ? : "easy" | "medium" | "hard" ,
2021-07-04 09:55:26 +00:00
negative : boolean ,
} ) : T . DisplayFormItem [ ] = > {
const forms = formsOfConjugation ( conj ) ;
const formsToUse = filterFunc
2021-03-09 12:39:13 +00:00
? formFilter ( forms , filterFunc )
: forms ;
return mode === "chart"
2021-07-04 09:55:26 +00:00
? formsToUse
2021-03-09 12:39:13 +00:00
: formMap (
2021-07-04 09:55:26 +00:00
formFilter ( formsToUse , ( f ) = > f . sentence ) ,
2021-03-09 12:39:13 +00:00
makeSentence ,
conj . info ,
subject ,
object ,
negative ,
2021-07-04 09:55:26 +00:00
englishConjugation ,
2021-07-09 10:36:56 +00:00
sentenceLevel ,
2021-03-09 12:39:13 +00:00
) ;
}
2021-07-04 09:55:26 +00:00
2021-07-20 12:41:55 +00:00
function isThirdPersonSing ( p : T.Person ) : boolean {
return (
p === T . Person . ThirdSingMale ||
p === T . Person . ThirdSingFemale
) ;
}
2021-07-05 08:21:57 +00:00
function engPresC ( s : T.Person , ec : T.EnglishVerbConjugationEc | [ string , string ] ) : string {
2021-07-20 12:41:55 +00:00
return isThirdPersonSing ( s ) ? ec [ 1 ] : ec [ 0 ] ;
2021-07-04 09:55:26 +00:00
}
function engEquative ( tense : "past" | "present" , s : T.Person ) : string {
2021-10-05 03:27:26 +00:00
const [ row , col ] = getVerbBlockPosFromPerson ( s ) ;
2021-07-04 09:55:26 +00:00
return englishEquative [ tense ] [ row ] [ col ] ;
}
function engHave ( s : T.Person ) : string {
2021-07-20 12:44:30 +00:00
return isThirdPersonSing ( s ) ? "has" : "have" ;
2021-07-04 09:55:26 +00:00
}
function engSubj ( s : T.Person , lowerCase? : boolean ) : string {
const pronoun = ( s === T . Person . FirstSingMale || s === T . Person . FirstSingFemale )
? "I"
: ( s === T . Person . FirstPlurMale || s === T . Person . FirstPlurFemale )
? "We"
: ( s === T . Person . SecondSingMale || s === T . Person . SecondSingFemale )
? "You"
: ( s === T . Person . SecondPlurMale || s === T . Person . SecondPlurFemale )
? "You (pl.)"
: ( s === T . Person . ThirdSingMale )
? "He/it"
: ( s === T . Person . ThirdSingFemale )
? "She/it"
: ( s === T . Person . ThirdPlurMale )
? "They"
: "They (f.)" ;
return ( lowerCase && pronoun !== "I" )
? pronoun . toLowerCase ( )
: pronoun ;
}