Skip to content

Commit 4da33c4

Browse files
committed
improve partial verb structure
1 parent 4d705ce commit 4da33c4

File tree

4 files changed

+98
-91
lines changed

4 files changed

+98
-91
lines changed

src/translator/phrase.ts

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -171,30 +171,34 @@ function verbPhrase(
171171
}
172172
const negated = extracted != null;
173173
const useAdverbs = extracted ?? adverbs;
174-
if (verb.first != null) {
175-
return {
176-
...verb,
177-
first: { ...verb.first, negated, adverbs: useAdverbs },
178-
emphasis: emphasis,
179-
prepositions,
180-
};
181-
} else if (verb.modal != null) {
182-
const postAdverb = negated ? NOT : null;
183-
return {
184-
...verb,
185-
modal: {
186-
preAdverbs: useAdverbs,
187-
verb: verb.modal.verb,
188-
postAdverb,
189-
},
190-
emphasis: emphasis,
191-
prepositions,
192-
};
193-
} else {
194-
// This should be unreachable
195-
throw new FilteredError(
196-
"verb phrase without modal verb nor conjugated verb",
197-
);
174+
const { first } = verb;
175+
switch (first.type) {
176+
case "modal": {
177+
const postAdverb = negated ? NOT : null;
178+
return {
179+
...verb,
180+
first: {
181+
type: "modal",
182+
preAdverbs: useAdverbs,
183+
verb: first.verb,
184+
postAdverb,
185+
},
186+
emphasis: emphasis,
187+
prepositions,
188+
};
189+
}
190+
case "conjugated":
191+
return {
192+
...verb,
193+
first: {
194+
...first,
195+
type: "conjugated",
196+
negated,
197+
adverbs: useAdverbs,
198+
},
199+
emphasis: emphasis,
200+
prepositions,
201+
};
198202
}
199203
}
200204
function defaultPhrase(
@@ -247,8 +251,8 @@ function defaultPhrase(
247251
function prepositionAsVerb(preposition: English.Preposition): PartialVerb {
248252
const extracted = extractNegativeFromPreposition(preposition);
249253
return {
250-
modal: null,
251254
first: {
255+
type: "conjugated",
252256
adverbs: [],
253257
presentPlural: "are",
254258
presentSingular: "is",
@@ -368,8 +372,8 @@ export function phraseAsVerb(
368372
}
369373
return {
370374
type: "simple",
371-
modal: null,
372375
first: {
376+
type: "conjugated",
373377
adverbs: [],
374378
presentPlural: "are",
375379
presentSingular: "is",

src/translator/predicate.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ function applyToAndTurnInto(
4545
IterableResult.fromArray<PartialCompoundVerb>([
4646
{
4747
type: "simple",
48-
modal: null,
4948
first: {
49+
type: "conjugated",
5050
adverbs: [],
5151
presentPlural: "apply",
5252
presentSingular: "applies",
@@ -66,8 +66,8 @@ function applyToAndTurnInto(
6666
},
6767
{
6868
type: "simple",
69-
modal: null,
7069
first: {
70+
type: "conjugated",
7171
adverbs: [],
7272
presentPlural: "turn",
7373
presentSingular: "turns",
@@ -96,8 +96,8 @@ function make(predicate: AdjectiveWithInWay, object: English.NounPhrase) {
9696
])
9797
.map(([negated, adjective]): PartialCompoundVerb => ({
9898
type: "simple",
99-
modal: null,
10099
first: {
100+
type: "conjugated",
101101
adverbs: [],
102102
presentPlural: "make",
103103
presentSingular: "makes",

src/translator/verb.ts

Lines changed: 63 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ export type VerbObjects = Readonly<{
2323
objectComplement: null | English.Complement;
2424
prepositions: ReadonlyArray<English.Preposition>;
2525
}>;
26+
export type FirstVerb =
27+
| (Readonly<{ type: "modal" }> & English.AdverbVerb)
28+
| (Readonly<{ type: "conjugated" }> & VerbForms);
2629
export type PartialVerb =
2730
& VerbObjects
2831
& Readonly<{
29-
modal: null | English.AdverbVerb;
30-
first: null | VerbForms;
32+
first: FirstVerb;
3133
rest: ReadonlyArray<English.AdverbVerb>;
3234
subjectComplement: null | English.Complement;
3335
forObject: boolean | string;
@@ -55,40 +57,40 @@ function addModal(
5557
verb: PartialVerb;
5658
takeNegative: boolean;
5759
}>,
58-
) {
60+
): PartialVerb {
5961
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+
}
9294
}
9395
}
9496
export function addModalToAll(
@@ -145,9 +147,9 @@ export function partialVerb(
145147
return IterableResult.combine(object, prepositions)
146148
.map(([object, prepositions]): PartialVerb => ({
147149
...definition,
148-
modal: null,
149150
first: {
150151
...definition,
152+
type: "conjugated",
151153
adverbs: [],
152154
negated: false,
153155
reduplicationCount,
@@ -360,30 +362,6 @@ export function verb(
360362
quantity: English.Quantity,
361363
): IterableResult<English.VerbPhrase> {
362364
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-
}
387365
case "compound":
388366
return IterableResult.combine(
389367
...partialVerb.verbs.map((partialVerb) =>
@@ -395,6 +373,31 @@ export function verb(
395373
type: "compound",
396374
verbs,
397375
}));
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+
}
398401
}
399402
}
400403
export function noAdverbs(verb: English.Word): English.AdverbVerb {

src/translator/word_unit.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ function defaultWordUnit(
7979
case "modal verb":
8080
return IterableResult.single<WordUnitTranslation>({
8181
type: "verb",
82-
modal: {
82+
first: {
83+
type: "modal",
8384
preAdverbs: [],
8485
verb: word({
8586
word: definition.verb,
@@ -88,7 +89,6 @@ function defaultWordUnit(
8889
}),
8990
postAdverb: null,
9091
},
91-
first: null,
9292
rest: [],
9393
subjectComplement: null,
9494
object: null,

0 commit comments

Comments
 (0)