@@ -23,11 +23,13 @@ export type VerbObjects = Readonly<{
23
23
objectComplement : null | English . Complement ;
24
24
prepositions : ReadonlyArray < English . Preposition > ;
25
25
} > ;
26
+ export type FirstVerb =
27
+ | ( Readonly < { type : "modal" } > & English . AdverbVerb )
28
+ | ( Readonly < { type : "conjugated" } > & VerbForms ) ;
26
29
export type PartialVerb =
27
30
& VerbObjects
28
31
& Readonly < {
29
- modal : null | English . AdverbVerb ;
30
- first : null | VerbForms ;
32
+ first : FirstVerb ;
31
33
rest : ReadonlyArray < English . AdverbVerb > ;
32
34
subjectComplement : null | English . Complement ;
33
35
forObject : boolean | string ;
@@ -55,40 +57,40 @@ function addModal(
55
57
verb : PartialVerb ;
56
58
takeNegative : boolean ;
57
59
} > ,
58
- ) {
60
+ ) : PartialVerb {
59
61
const { modal, verb, takeNegative } = options ;
60
- if ( verb . modal == null ) {
61
- const newRest = nullableAsArray ( verb . first )
62
- . map ( ( first ) : English . AdverbVerb => {
63
- const { adverbs , presentPlural , negated } = first ;
64
- const useVerb = presentPlural === "are" ? "be" : presentPlural ;
65
- const preAdverbs = takeNegative ? adverbs : [
66
- ... ( negated ? [ NOT ] : [ ] ) ,
67
- ... adverbs ,
68
- ] ;
69
- return {
70
- preAdverbs ,
71
- verb : word ( { ...first , word : useVerb } ) ,
72
- postAdverb : null ,
73
- } ;
74
- } ) ;
75
- const postAdverb = takeNegative && ( verb . first ?. negated ?? false )
76
- ? NOT
77
- : null ;
78
- return {
79
- ... verb ,
80
- modal : {
81
- preAdverbs : [ ] ,
82
- verb : noEmphasis ( modal ) ,
83
- postAdverb ,
84
- } ,
85
- first : null ,
86
- rest : [ ... newRest , ... verb . rest ] ,
87
- reduplicationCount : 1 ,
88
- emphasis : false ,
89
- } ;
90
- } else {
91
- throw new FilteredError ( "nested modal verb" ) ;
62
+ const { first } = verb ;
63
+ switch ( first . type ) {
64
+ case "modal" :
65
+ throw new FilteredError ( "nested modal verb" ) ;
66
+ case "conjugated" : {
67
+ const newRest = nullableAsArray ( first )
68
+ . map ( ( first ) : English . AdverbVerb => {
69
+ const { adverbs, presentPlural , negated } = first ;
70
+ const useVerb = presentPlural === "are" ? "be" : presentPlural ;
71
+ const preAdverbs = takeNegative ? adverbs : [
72
+ ... ( negated ? [ NOT ] : [ ] ) ,
73
+ ...adverbs ,
74
+ ] ;
75
+ return {
76
+ preAdverbs ,
77
+ verb : word ( { ... first , word : useVerb } ) ,
78
+ postAdverb : null ,
79
+ } ;
80
+ } ) ;
81
+ const postAdverb = takeNegative && ( first . negated ?? false ) ? NOT : null ;
82
+ return {
83
+ ... verb ,
84
+ first : {
85
+ type : "modal" ,
86
+ preAdverbs : [ ] ,
87
+ verb : noEmphasis ( modal ) ,
88
+ postAdverb ,
89
+ } ,
90
+ rest : [ ... newRest , ... verb . rest ] ,
91
+ emphasis : false ,
92
+ } ;
93
+ }
92
94
}
93
95
}
94
96
export function addModalToAll (
@@ -145,9 +147,9 @@ export function partialVerb(
145
147
return IterableResult . combine ( object , prepositions )
146
148
. map ( ( [ object , prepositions ] ) : PartialVerb => ( {
147
149
...definition ,
148
- modal : null ,
149
150
first : {
150
151
...definition ,
152
+ type : "conjugated" ,
151
153
adverbs : [ ] ,
152
154
negated : false ,
153
155
reduplicationCount,
@@ -360,30 +362,6 @@ export function verb(
360
362
quantity : English . Quantity ,
361
363
) : IterableResult < English . VerbPhrase > {
362
364
switch ( partialVerb . type ) {
363
- case "simple" : {
364
- const verbForms = partialVerb . first ;
365
- if ( verbForms != null ) {
366
- return fromVerbForms ( verbForms , perspective , quantity )
367
- . map ( ( verb ) : English . VerbPhrase => ( {
368
- ...partialVerb ,
369
- type : "simple" ,
370
- verb : {
371
- modal : verb . modal ,
372
- verbs : [ ...verb . verbs , ...partialVerb . rest ] ,
373
- } ,
374
- contentClause : null ,
375
- hideVerb : false ,
376
- } ) ) ;
377
- } else {
378
- return IterableResult . single ( {
379
- ...partialVerb ,
380
- type : "simple" ,
381
- verb : { modal : partialVerb . modal , verbs : partialVerb . rest } ,
382
- contentClause : null ,
383
- hideVerb : false ,
384
- } ) ;
385
- }
386
- }
387
365
case "compound" :
388
366
return IterableResult . combine (
389
367
...partialVerb . verbs . map ( ( partialVerb ) =>
@@ -395,6 +373,31 @@ export function verb(
395
373
type : "compound" ,
396
374
verbs,
397
375
} ) ) ;
376
+ case "simple" : {
377
+ const { first } = partialVerb ;
378
+ switch ( first . type ) {
379
+ case "modal" :
380
+ return IterableResult . single ( {
381
+ ...partialVerb ,
382
+ type : "simple" ,
383
+ verb : { modal : first , verbs : partialVerb . rest } ,
384
+ contentClause : null ,
385
+ hideVerb : false ,
386
+ } ) ;
387
+ case "conjugated" :
388
+ return fromVerbForms ( first , perspective , quantity )
389
+ . map ( ( verb ) : English . VerbPhrase => ( {
390
+ ...partialVerb ,
391
+ type : "simple" ,
392
+ verb : {
393
+ modal : verb . modal ,
394
+ verbs : [ ...verb . verbs , ...partialVerb . rest ] ,
395
+ } ,
396
+ contentClause : null ,
397
+ hideVerb : false ,
398
+ } ) ) ;
399
+ }
400
+ }
398
401
}
399
402
}
400
403
export function noAdverbs ( verb : English . Word ) : English . AdverbVerb {
0 commit comments