-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
deleteRight.ts
59 lines (57 loc) · 2.84 KB
/
deleteRight.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { firstAfterOrNull } from '../../../helpers/arrayhelpers/firstAfterOrNull';
import { firstBeforeOrNull } from '../../../helpers/arrayhelpers/firstBeforeOrNull';
import { remove } from '../../../helpers/arrayhelpers/remove';
import { BranchingNode } from '../../../SyntaxTreeComponents/Nodes/Base/BranchingNode';
import { TreeNode } from '../../../SyntaxTreeComponents/Nodes/Base/TreeNode';
import { Placeholder } from '../../../SyntaxTreeComponents/Placeholder/Placeholder';
import { KeyboardMemory } from '../../KeyboardMemory';
import { deleteOuterBranchingNodeButNotItsContents } from './helpers/deleteOuterBranchingNodeButNotItsContents';
export function deleteRight(k: KeyboardMemory): void {
if (k.current instanceof Placeholder) {
if (k.current.parentNode != null && k.current.parentNode.placeholders.every((ph) => ph.nodes.length == 0)) {
const previousNode = firstBeforeOrNull(k.current.parentNode.parentPlaceholder.nodes, k.current.parentNode);
remove(k.current.parentNode.parentPlaceholder.nodes, k.current.parentNode);
k.current = previousNode ?? k.current.parentNode.parentPlaceholder;
} else {
const nodes = k.current.nodes;
if (nodes.length > 0) {
handleDeletion(k, nodes[0]);
} else if (k.current.parentNode != null) {
const parentNode = k.current.parentNode;
const siblingPlaceholders = parentNode.placeholders;
if (siblingPlaceholders[0] == k.current && siblingPlaceholders.length == 2) {
const nonEmptyPlaceholder = siblingPlaceholders[1];
k.current = firstBeforeOrNull(parentNode.parentPlaceholder.nodes, parentNode) ?? parentNode.parentPlaceholder;
deleteOuterBranchingNodeButNotItsContents(nonEmptyPlaceholder);
} else {
for (let i = siblingPlaceholders.indexOf(k.current) + 1; i < siblingPlaceholders.length; i++) {
if (siblingPlaceholders[i].nodes.length > 0) {
k.current = siblingPlaceholders[i];
deleteRight(k);
return;
}
}
}
}
}
} else {
const nextNode = firstAfterOrNull(k.current.parentPlaceholder.nodes, k.current);
if (nextNode != null) {
handleDeletion(k, nextNode);
}
}
}
function handleDeletion(k: KeyboardMemory, nextNode: TreeNode): void {
if (nextNode instanceof BranchingNode) {
if (nextNode.placeholders.length == 1 && nextNode.placeholders[0].nodes.length > 0) {
deleteOuterBranchingNodeButNotItsContents(nextNode.placeholders[0]);
} else if (nextNode.placeholders.length == 2 && nextNode.placeholders[0].nodes.length == 0 && nextNode.placeholders[1].nodes.length > 0) {
deleteOuterBranchingNodeButNotItsContents(nextNode.placeholders[1]);
} else {
k.current = nextNode.placeholders[0];
deleteRight(k);
}
} else {
remove(nextNode.parentPlaceholder.nodes, nextNode);
}
}