@lionweb/class-core 0.7.0-beta.9 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/README.md +6 -6
- package/dist/LionCore_builtins.g.d.ts +2 -2
- package/dist/LionCore_builtins.g.d.ts.map +1 -1
- package/dist/LionCore_builtins.g.js +1 -1
- package/dist/LionCore_builtins.g.js.map +1 -1
- package/dist/base-types.d.ts +7 -11
- package/dist/base-types.d.ts.map +1 -1
- package/dist/base-types.js +3 -28
- package/dist/base-types.js.map +1 -1
- package/dist/convenience.d.ts +10 -9
- package/dist/convenience.d.ts.map +1 -1
- package/dist/convenience.js +12 -11
- package/dist/convenience.js.map +1 -1
- package/dist/deltas/appliers.d.ts +5 -4
- package/dist/deltas/appliers.d.ts.map +1 -1
- package/dist/deltas/appliers.js +369 -163
- package/dist/deltas/appliers.js.map +1 -1
- package/dist/deltas/compositor.d.ts +51 -0
- package/dist/deltas/compositor.d.ts.map +1 -0
- package/dist/deltas/compositor.js +95 -0
- package/dist/deltas/compositor.js.map +1 -0
- package/dist/deltas/index.d.ts +2 -1
- package/dist/deltas/index.d.ts.map +1 -1
- package/dist/deltas/index.js +2 -1
- package/dist/deltas/index.js.map +1 -1
- package/dist/deltas/inverters.d.ts.map +1 -1
- package/dist/deltas/inverters.js +91 -28
- package/dist/deltas/inverters.js.map +1 -1
- package/dist/deltas/receivers.d.ts +39 -0
- package/dist/deltas/receivers.d.ts.map +1 -0
- package/dist/deltas/receivers.js +60 -0
- package/dist/deltas/receivers.js.map +1 -0
- package/dist/deltas/serialization/deserializer.g.d.ts.map +1 -1
- package/dist/deltas/serialization/deserializer.g.js +167 -59
- package/dist/deltas/serialization/deserializer.g.js.map +1 -1
- package/dist/deltas/serialization/serializer-helpers.d.ts +1 -1
- package/dist/deltas/serialization/serializer-helpers.d.ts.map +1 -1
- package/dist/deltas/serialization/serializer-helpers.js +3 -4
- package/dist/deltas/serialization/serializer-helpers.js.map +1 -1
- package/dist/deltas/serialization/serializer.g.d.ts +2 -2
- package/dist/deltas/serialization/serializer.g.d.ts.map +1 -1
- package/dist/deltas/serialization/serializer.g.js +186 -47
- package/dist/deltas/serialization/serializer.g.js.map +1 -1
- package/dist/deltas/serialization/types.g.d.ts +156 -43
- package/dist/deltas/serialization/types.g.d.ts.map +1 -1
- package/dist/deltas/types.g.d.ts +155 -55
- package/dist/deltas/types.g.d.ts.map +1 -1
- package/dist/deltas/types.g.js +170 -57
- package/dist/deltas/types.g.js.map +1 -1
- package/dist/deserializer.d.ts +6 -6
- package/dist/deserializer.d.ts.map +1 -1
- package/dist/deserializer.js +16 -27
- package/dist/deserializer.js.map +1 -1
- package/dist/duplicator.d.ts.map +1 -1
- package/dist/duplicator.js.map +1 -1
- package/dist/factory.d.ts +10 -2
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +25 -16
- package/dist/factory.js.map +1 -1
- package/dist/id-mapping.d.ts +31 -3
- package/dist/id-mapping.d.ts.map +1 -1
- package/dist/id-mapping.js +46 -14
- package/dist/id-mapping.js.map +1 -1
- package/dist/serializer.d.ts.map +1 -1
- package/dist/textualizer.d.ts +1 -1
- package/dist/textualizer.d.ts.map +1 -1
- package/dist/textualizer.js +1 -1
- package/dist/textualizer.js.map +1 -1
- package/dist/value-managers/annotations.d.ts +5 -0
- package/dist/value-managers/annotations.d.ts.map +1 -1
- package/dist/value-managers/annotations.js +31 -3
- package/dist/value-managers/annotations.js.map +1 -1
- package/dist/value-managers/base.d.ts +2 -2
- package/dist/value-managers/base.d.ts.map +1 -1
- package/dist/value-managers/base.js +4 -4
- package/dist/value-managers/base.js.map +1 -1
- package/dist/value-managers/containments.d.ts +4 -1
- package/dist/value-managers/containments.d.ts.map +1 -1
- package/dist/value-managers/containments.js +151 -20
- package/dist/value-managers/containments.js.map +1 -1
- package/dist/value-managers/properties.d.ts.map +1 -1
- package/dist/value-managers/properties.js +1 -0
- package/dist/value-managers/properties.js.map +1 -1
- package/dist/value-managers/references.d.ts +3 -0
- package/dist/value-managers/references.d.ts.map +1 -1
- package/dist/value-managers/references.js +26 -8
- package/dist/value-managers/references.js.map +1 -1
- package/package.json +34 -37
- package/src/LionCore_builtins.g.ts +2 -2
- package/src/base-types.ts +6 -32
- package/src/convenience.ts +15 -14
- package/src/deltas/appliers.ts +377 -177
- package/src/deltas/compositor.ts +107 -0
- package/src/deltas/index.ts +3 -1
- package/src/deltas/inverters.ts +108 -36
- package/src/deltas/receivers.ts +92 -0
- package/src/deltas/serialization/deserializer.g.ts +185 -64
- package/src/deltas/serialization/serializer-helpers.ts +3 -10
- package/src/deltas/serialization/serializer.g.ts +242 -63
- package/src/deltas/serialization/types.g.ts +190 -51
- package/src/deltas/types.g.ts +190 -51
- package/src/deserializer.ts +32 -43
- package/src/duplicator.ts +1 -1
- package/src/factory.ts +31 -17
- package/src/id-mapping.ts +43 -5
- package/src/textualizer.ts +1 -1
- package/src/value-managers/annotations.ts +28 -2
- package/src/value-managers/base.ts +4 -4
- package/src/value-managers/containments.ts +144 -20
- package/src/value-managers/properties.ts +1 -0
- package/src/value-managers/references.ts +28 -8
- package/dist/deltas/handlers.d.ts +0 -17
- package/dist/deltas/handlers.d.ts.map +0 -1
- package/dist/deltas/handlers.js +0 -43
- package/dist/deltas/handlers.js.map +0 -1
- package/src/deltas/handlers.ts +0 -64
package/src/deltas/appliers.ts
CHANGED
|
@@ -18,23 +18,36 @@
|
|
|
18
18
|
import {
|
|
19
19
|
AnnotationAddedDelta,
|
|
20
20
|
AnnotationDeletedDelta,
|
|
21
|
+
AnnotationMovedAndReplacedFromOtherParentDelta,
|
|
22
|
+
AnnotationMovedAndReplacedInSameParentDelta,
|
|
21
23
|
AnnotationMovedFromOtherParentDelta,
|
|
22
24
|
AnnotationMovedInSameParentDelta,
|
|
23
25
|
AnnotationReplacedDelta,
|
|
24
26
|
ChildAddedDelta,
|
|
25
27
|
ChildDeletedDelta,
|
|
26
|
-
|
|
28
|
+
ChildMovedAndReplacedFromOtherContainmentDelta,
|
|
29
|
+
ChildMovedAndReplacedFromOtherContainmentInSameParentDelta,
|
|
30
|
+
ChildMovedAndReplacedInSameContainmentDelta,
|
|
31
|
+
ChildMovedFromOtherContainmentDelta,
|
|
32
|
+
ChildMovedFromOtherContainmentInSameParentDelta,
|
|
27
33
|
ChildMovedInSameContainmentDelta,
|
|
28
34
|
ChildReplacedDelta,
|
|
35
|
+
CompositeDelta,
|
|
36
|
+
EntryMovedAndReplacedFromOtherReferenceDelta,
|
|
37
|
+
EntryMovedAndReplacedFromOtherReferenceInSameParentDelta,
|
|
38
|
+
EntryMovedAndReplacedInSameReferenceDelta,
|
|
39
|
+
EntryMovedFromOtherReferenceDelta,
|
|
40
|
+
EntryMovedFromOtherReferenceInSameParentDelta,
|
|
41
|
+
EntryMovedInSameReferenceDelta,
|
|
29
42
|
NoOpDelta,
|
|
43
|
+
PartitionAddedDelta,
|
|
44
|
+
PartitionDeletedDelta,
|
|
30
45
|
PropertyAddedDelta,
|
|
31
46
|
PropertyChangedDelta,
|
|
32
47
|
PropertyDeletedDelta,
|
|
33
48
|
ReferenceAddedDelta,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
ReferenceMovedInSameReferenceDelta,
|
|
37
|
-
ReferenceReplacedDelta
|
|
49
|
+
ReferenceChangedDelta,
|
|
50
|
+
ReferenceDeletedDelta
|
|
38
51
|
} from "./types.g.js"
|
|
39
52
|
import {
|
|
40
53
|
MultiContainmentValueManager,
|
|
@@ -53,9 +66,10 @@ import { IDelta } from "./base.js"
|
|
|
53
66
|
* If an {@link IdMapping} is provided, the {@link INodeBase nodes} relevant for the delta are looked up from that;
|
|
54
67
|
* otherwise, the delta is applied directly to (object-)referenced nodes.
|
|
55
68
|
*
|
|
56
|
-
* This is an internal function, solely meant to DRY the delta application
|
|
69
|
+
* This is an internal function, solely meant to DRY the delta application
|
|
70
|
+
* with and without lookup in an {@link IdMapping ID mapping object}.
|
|
57
71
|
*/
|
|
58
|
-
const deltaApplier = (idMapping?: IdMapping) =>
|
|
72
|
+
const deltaApplier = (idMapping?: IdMapping, updatablePartitions?: () => INodeBase[]) =>
|
|
59
73
|
(delta: IDelta): void => {
|
|
60
74
|
|
|
61
75
|
const lookupNodeFrom = (node: INodeBase) => {
|
|
@@ -81,173 +95,356 @@ const deltaApplier = (idMapping?: IdMapping) =>
|
|
|
81
95
|
: lookupNodeFrom(nodeRef) as SingleRef<T>
|
|
82
96
|
}
|
|
83
97
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (delta
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
98
|
+
const applyDelta = (delta: IDelta): void => {
|
|
99
|
+
if (delta instanceof PartitionAddedDelta) {
|
|
100
|
+
if (updatablePartitions !== undefined) {
|
|
101
|
+
const partitions = updatablePartitions();
|
|
102
|
+
const { newPartition } = delta
|
|
103
|
+
if (partitions.indexOf(newPartition) === -1) {
|
|
104
|
+
updatablePartitions().push(newPartition);
|
|
105
|
+
}
|
|
106
|
+
idMapping?.updateWith(newPartition);
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (delta instanceof PartitionDeletedDelta) {
|
|
111
|
+
if (updatablePartitions !== undefined) {
|
|
112
|
+
const partitions = updatablePartitions();
|
|
113
|
+
const index = partitions.indexOf(delta.deletedPartition)
|
|
114
|
+
if (index > -1) {
|
|
115
|
+
partitions.splice(index, 1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (delta instanceof PropertyAddedDelta) {
|
|
121
|
+
lookupNodeFrom(delta.node).getPropertyValueManager(delta.property).setDirectly(delta.value);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (delta instanceof PropertyDeletedDelta) {
|
|
125
|
+
lookupNodeFrom(delta.node).getPropertyValueManager(delta.property).setDirectly(undefined);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (delta instanceof PropertyChangedDelta) {
|
|
129
|
+
lookupNodeFrom(delta.node).getPropertyValueManager(delta.property).setDirectly(delta.newValue);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (delta instanceof ChildAddedDelta) {
|
|
133
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
134
|
+
const valueManager = parent.getContainmentValueManager(delta.containment);
|
|
135
|
+
const newChild = lookupNodeFrom(delta.newChild);
|
|
136
|
+
if (delta.containment.multiple) {
|
|
137
|
+
(valueManager as MultiContainmentValueManager<INodeBase>).insertAtIndexDirectly(newChild, delta.index);
|
|
138
|
+
} else {
|
|
139
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(newChild);
|
|
140
|
+
}
|
|
141
|
+
newChild.attachTo(parent, delta.containment);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (delta instanceof ChildDeletedDelta) {
|
|
145
|
+
const valueManager = lookupNodeFrom(delta.parent).getContainmentValueManager(delta.containment);
|
|
146
|
+
if (delta.containment.multiple) {
|
|
147
|
+
(valueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(lookupNodeFrom(delta.deletedChild));
|
|
148
|
+
} else {
|
|
149
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
150
|
+
}
|
|
151
|
+
delta.deletedChild.detach();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (delta instanceof ChildReplacedDelta) {
|
|
155
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
156
|
+
const valueManager = parent.getContainmentValueManager(delta.containment);
|
|
157
|
+
const replacedChild = lookupNodeFrom(delta.replacedChild);
|
|
158
|
+
const newChild = lookupNodeFrom(delta.newChild);
|
|
159
|
+
if (delta.containment.multiple) {
|
|
160
|
+
const multiValueManager = valueManager as MultiContainmentValueManager<INodeBase>;
|
|
161
|
+
multiValueManager.removeDirectly(replacedChild); // should be at index delta.index
|
|
162
|
+
multiValueManager.insertAtIndexDirectly(newChild, delta.index);
|
|
163
|
+
} else {
|
|
164
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(newChild);
|
|
165
|
+
}
|
|
166
|
+
replacedChild.detach();
|
|
167
|
+
newChild.attachTo(parent, delta.containment);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (delta instanceof ChildMovedFromOtherContainmentDelta) {
|
|
171
|
+
const oldValueManager = lookupNodeFrom(delta.oldParent).getContainmentValueManager(delta.oldContainment);
|
|
172
|
+
const movedChild = lookupNodeFrom(delta.movedChild);
|
|
173
|
+
if (delta.oldContainment.multiple) {
|
|
174
|
+
(oldValueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(movedChild); // should be at index delta.oldIndex
|
|
175
|
+
} else {
|
|
176
|
+
(oldValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
177
|
+
}
|
|
178
|
+
const newParent = lookupNodeFrom(delta.newParent);
|
|
179
|
+
const newValueManager = newParent.getContainmentValueManager(delta.newContainment);
|
|
180
|
+
if (delta.newContainment.multiple) {
|
|
181
|
+
(newValueManager as MultiContainmentValueManager<INodeBase>).insertAtIndexDirectly(movedChild, delta.newIndex);
|
|
182
|
+
} else {
|
|
183
|
+
(newValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(movedChild);
|
|
184
|
+
}
|
|
185
|
+
movedChild.detach();
|
|
186
|
+
movedChild.attachTo(newParent, delta.newContainment);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (delta instanceof ChildMovedFromOtherContainmentInSameParentDelta) {
|
|
190
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
191
|
+
const oldValueManager = parent.getContainmentValueManager(delta.oldContainment);
|
|
192
|
+
const movedChild = lookupNodeFrom(delta.movedChild);
|
|
193
|
+
if (delta.oldContainment.multiple) {
|
|
194
|
+
(oldValueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(movedChild); // should be at index delta.oldIndex
|
|
195
|
+
} else {
|
|
196
|
+
(oldValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
197
|
+
}
|
|
198
|
+
const newValueManager = parent.getContainmentValueManager(delta.newContainment);
|
|
199
|
+
if (delta.newContainment.multiple) {
|
|
200
|
+
(newValueManager as MultiContainmentValueManager<INodeBase>).insertAtIndexDirectly(movedChild, delta.newIndex);
|
|
201
|
+
} else {
|
|
202
|
+
(newValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(movedChild);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (delta instanceof ChildMovedInSameContainmentDelta) {
|
|
207
|
+
const valueManager = lookupNodeFrom(delta.parent).getContainmentValueManager(delta.containment) as MultiContainmentValueManager<INodeBase>;
|
|
208
|
+
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (delta instanceof ChildMovedAndReplacedFromOtherContainmentDelta) {
|
|
212
|
+
const oldValueManager = delta.oldParent.getContainmentValueManager(delta.oldContainment);
|
|
213
|
+
const movedChild = lookupNodeFrom(delta.movedChild);
|
|
214
|
+
if (delta.oldContainment.multiple) {
|
|
215
|
+
(oldValueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(movedChild); // should be at index delta.oldIndex
|
|
216
|
+
} else {
|
|
217
|
+
(oldValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
218
|
+
}
|
|
219
|
+
const newParent = lookupNodeFrom(delta.newParent);
|
|
220
|
+
const newValueManager = newParent.getContainmentValueManager(delta.newContainment);
|
|
221
|
+
if (delta.newContainment.multiple) {
|
|
222
|
+
const valueManager = newValueManager as MultiContainmentValueManager<INodeBase>;
|
|
223
|
+
valueManager.removeAtIndexDirectly(delta.newIndex);
|
|
224
|
+
valueManager.insertAtIndexDirectly(movedChild, delta.newIndex);
|
|
225
|
+
// TODO make separate API for this?
|
|
226
|
+
} else {
|
|
227
|
+
(newValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(movedChild);
|
|
228
|
+
}
|
|
229
|
+
movedChild.detach();
|
|
230
|
+
movedChild.attachTo(newParent, delta.newContainment);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (delta instanceof ChildMovedAndReplacedFromOtherContainmentInSameParentDelta) {
|
|
234
|
+
const oldValueManager = delta.parent.getContainmentValueManager(delta.oldContainment);
|
|
235
|
+
const movedChild = lookupNodeFrom(delta.movedChild);
|
|
236
|
+
if (delta.oldContainment.multiple) {
|
|
237
|
+
(oldValueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(movedChild); // should be at index delta.oldIndex
|
|
238
|
+
} else {
|
|
239
|
+
(oldValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
240
|
+
}
|
|
241
|
+
const newValueManager = delta.parent.getContainmentValueManager(delta.newContainment);
|
|
242
|
+
if (delta.newContainment.multiple) {
|
|
243
|
+
const valueManager = newValueManager as MultiContainmentValueManager<INodeBase>;
|
|
244
|
+
valueManager.removeAtIndexDirectly(delta.newIndex); // should be delta.replacedChild
|
|
245
|
+
valueManager.insertAtIndexDirectly(movedChild, delta.newIndex);
|
|
246
|
+
// TODO make separate API for this?
|
|
247
|
+
} else {
|
|
248
|
+
(newValueManager as SingleContainmentValueManager<INodeBase>).setDirectly(movedChild);
|
|
249
|
+
}
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (delta instanceof ChildMovedAndReplacedInSameContainmentDelta) {
|
|
253
|
+
const valueManager = delta.parent.getContainmentValueManager(delta.containment);
|
|
254
|
+
const movedChild = lookupNodeFrom(delta.movedChild);
|
|
255
|
+
const replacedChild = lookupNodeFrom(delta.replacedChild);
|
|
256
|
+
if (delta.containment.multiple) {
|
|
257
|
+
(valueManager as MultiContainmentValueManager<INodeBase>).removeDirectly(replacedChild); // should be at index delta.oldIndex
|
|
258
|
+
} else {
|
|
259
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(undefined);
|
|
260
|
+
}
|
|
261
|
+
if (delta.containment.multiple) {
|
|
262
|
+
(valueManager as MultiContainmentValueManager<INodeBase>).insertAtIndexDirectly(movedChild, delta.newIndex);
|
|
263
|
+
} else {
|
|
264
|
+
(valueManager as SingleContainmentValueManager<INodeBase>).setDirectly(movedChild);
|
|
265
|
+
}
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (delta instanceof AnnotationAddedDelta) {
|
|
269
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
270
|
+
parent.annotationsValueManager.insertAtIndexDirectly(delta.newAnnotation, delta.index);
|
|
271
|
+
delta.newAnnotation.attachTo(parent, null);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (delta instanceof AnnotationDeletedDelta) {
|
|
275
|
+
lookupNodeFrom(delta.parent).annotationsValueManager.removeDirectly(delta.deletedAnnotation); // should be at index delta.index
|
|
276
|
+
delta.deletedAnnotation.detach();
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (delta instanceof AnnotationReplacedDelta) {
|
|
280
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
281
|
+
const valueManager = parent.annotationsValueManager;
|
|
282
|
+
valueManager.removeDirectly(delta.replacedAnnotation); // should be at index delta.index
|
|
283
|
+
delta.replacedAnnotation.detach();
|
|
284
|
+
valueManager.insertAtIndexDirectly(delta.newAnnotation, delta.index);
|
|
285
|
+
delta.newAnnotation.attachTo(parent, null);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (delta instanceof AnnotationMovedFromOtherParentDelta) {
|
|
289
|
+
const movedAnnotation = lookupNodeFrom(delta.movedAnnotation);
|
|
290
|
+
lookupNodeFrom(delta.oldParent).annotationsValueManager.removeDirectly(movedAnnotation); // should be at index delta.index
|
|
291
|
+
movedAnnotation.detach();
|
|
292
|
+
const newParent = lookupNodeFrom(delta.newParent);
|
|
293
|
+
newParent.annotationsValueManager.insertAtIndexDirectly(delta.movedAnnotation, delta.newIndex);
|
|
294
|
+
movedAnnotation.attachTo(newParent, null);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (delta instanceof AnnotationMovedInSameParentDelta) {
|
|
298
|
+
const valueManager = lookupNodeFrom(delta.parent).annotationsValueManager;
|
|
299
|
+
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (delta instanceof AnnotationMovedAndReplacedFromOtherParentDelta) {
|
|
303
|
+
const movedAnnotation = lookupNodeFrom(delta.movedAnnotation);
|
|
304
|
+
lookupNodeFrom(delta.oldParent).annotationsValueManager.removeDirectly(delta.movedAnnotation); // should be at index delta.index
|
|
305
|
+
delta.movedAnnotation.detach();
|
|
306
|
+
const newParent = lookupNodeFrom(delta.newParent);
|
|
307
|
+
const newValueManager = newParent.annotationsValueManager;
|
|
308
|
+
newValueManager.removeDirectly(delta.replacedAnnotation);
|
|
309
|
+
delta.replacedAnnotation.detach();
|
|
310
|
+
newValueManager.insertAtIndexDirectly(movedAnnotation, delta.newIndex);
|
|
311
|
+
movedAnnotation.attachTo(newParent, null);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
if (delta instanceof AnnotationMovedAndReplacedInSameParentDelta) {
|
|
315
|
+
const valueManager = lookupNodeFrom(delta.parent).annotationsValueManager;
|
|
316
|
+
valueManager.moveAndReplaceAtIndexDirectly(delta.oldIndex, delta.newIndex);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (delta instanceof ReferenceAddedDelta) {
|
|
320
|
+
const valueManager = lookupNodeFrom(delta.parent).getReferenceValueManager(delta.reference);
|
|
321
|
+
const newTarget = lookupNodeRefFrom(delta.newTarget);
|
|
322
|
+
if (delta.reference.multiple) {
|
|
323
|
+
(valueManager as MultiReferenceValueManager<INodeBase>).insertAtIndexDirectly(newTarget, delta.index);
|
|
324
|
+
} else {
|
|
325
|
+
(valueManager as SingleReferenceValueManager<INodeBase>).setDirectly(newTarget);
|
|
326
|
+
}
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (delta instanceof ReferenceDeletedDelta) {
|
|
330
|
+
const valueManager = lookupNodeFrom(delta.parent).getReferenceValueManager(delta.reference);
|
|
331
|
+
if (delta.reference.multiple) {
|
|
332
|
+
(valueManager as MultiReferenceValueManager<INodeBase>).removeAtIndexDirectly(delta.index); // should be delta.deletedTarget
|
|
333
|
+
} else {
|
|
334
|
+
(valueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
335
|
+
}
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (delta instanceof ReferenceChangedDelta) {
|
|
339
|
+
const valueManager = lookupNodeFrom(delta.parent).getReferenceValueManager(delta.reference);
|
|
340
|
+
const newTarget = lookupNodeRefFrom(delta.newTarget);
|
|
341
|
+
if (delta.reference.multiple) {
|
|
342
|
+
const multiValueManager = valueManager as MultiReferenceValueManager<INodeBase>;
|
|
343
|
+
multiValueManager.removeAtIndexDirectly(delta.index); // should be delta.oldTarget
|
|
344
|
+
multiValueManager.insertAtIndexDirectly(newTarget, delta.index);
|
|
345
|
+
} else {
|
|
346
|
+
(valueManager as SingleReferenceValueManager<INodeBase>).setDirectly(newTarget);
|
|
347
|
+
}
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (delta instanceof EntryMovedFromOtherReferenceDelta) {
|
|
351
|
+
const oldValueManager = lookupNodeFrom(delta.oldParent).getReferenceValueManager(delta.oldReference);
|
|
352
|
+
const movedTarget = lookupNodeRefFrom(delta.movedTarget);
|
|
353
|
+
if (delta.oldReference.multiple) {
|
|
354
|
+
(oldValueManager as MultiReferenceValueManager<INodeBase>).removeAtIndexDirectly(delta.oldIndex); // should be delta.movedTarget
|
|
355
|
+
} else {
|
|
356
|
+
(oldValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
357
|
+
}
|
|
358
|
+
const newValueManager = lookupNodeFrom(delta.newParent).getReferenceValueManager(delta.newReference);
|
|
359
|
+
if (delta.newReference.multiple) {
|
|
360
|
+
(newValueManager as MultiReferenceValueManager<INodeBase>).insertAtIndexDirectly(movedTarget, delta.newIndex);
|
|
361
|
+
} else {
|
|
362
|
+
(newValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(movedTarget);
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (delta instanceof EntryMovedFromOtherReferenceInSameParentDelta) {
|
|
367
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
368
|
+
const oldValueManager = parent.getReferenceValueManager(delta.oldReference);
|
|
369
|
+
const movedTarget = lookupNodeRefFrom(delta.movedTarget);
|
|
370
|
+
if (delta.oldReference.multiple) {
|
|
371
|
+
(oldValueManager as MultiReferenceValueManager<INodeBase>).removeAtIndexDirectly(delta.oldIndex); // should be delta.movedTarget
|
|
372
|
+
} else {
|
|
373
|
+
(oldValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
374
|
+
}
|
|
375
|
+
const newValueManager = parent.getReferenceValueManager(delta.newReference);
|
|
376
|
+
if (delta.newReference.multiple) {
|
|
377
|
+
(newValueManager as MultiReferenceValueManager<INodeBase>).insertAtIndexDirectly(movedTarget, delta.newIndex);
|
|
378
|
+
} else {
|
|
379
|
+
(newValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(movedTarget);
|
|
380
|
+
}
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (delta instanceof EntryMovedInSameReferenceDelta) {
|
|
384
|
+
const valueManager = lookupNodeFrom(delta.parent).getReferenceValueManager(delta.reference) as MultiReferenceValueManager<INodeBase>;
|
|
385
|
+
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
if (delta instanceof EntryMovedAndReplacedFromOtherReferenceDelta) {
|
|
389
|
+
const oldParent = lookupNodeFrom(delta.oldParent);
|
|
390
|
+
const oldValueManager = oldParent.getReferenceValueManager(delta.oldReference);
|
|
391
|
+
const movedTarget = lookupNodeRefFrom(delta.movedTarget);
|
|
392
|
+
if (delta.oldReference.multiple) {
|
|
393
|
+
(oldValueManager as MultiReferenceValueManager<INodeBase>).removeAtIndexDirectly(delta.oldIndex); // should be delta.movedTarget
|
|
394
|
+
} else {
|
|
395
|
+
(oldValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
396
|
+
}
|
|
397
|
+
const newParent = lookupNodeFrom(delta.newParent);
|
|
398
|
+
const newValueManager = newParent.getReferenceValueManager(delta.newReference);
|
|
399
|
+
if (delta.newReference.multiple) {
|
|
400
|
+
const valueManager = newValueManager as MultiReferenceValueManager<INodeBase>;
|
|
401
|
+
valueManager.removeAtIndexDirectly(delta.oldIndex); // should be delta.replacedTarget
|
|
402
|
+
valueManager.insertAtIndexDirectly(movedTarget, delta.newIndex);
|
|
403
|
+
} else {
|
|
404
|
+
(newValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(movedTarget);
|
|
405
|
+
}
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
if (delta instanceof EntryMovedAndReplacedFromOtherReferenceInSameParentDelta) {
|
|
409
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
410
|
+
const oldValueManager = parent.getReferenceValueManager(delta.oldReference);
|
|
411
|
+
const movedTarget = lookupNodeRefFrom(delta.movedTarget);
|
|
412
|
+
if (delta.oldReference.multiple) {
|
|
413
|
+
(oldValueManager as MultiReferenceValueManager<INodeBase>).removeAtIndexDirectly(delta.oldIndex); // should be delta.movedTarget
|
|
414
|
+
} else {
|
|
415
|
+
(oldValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(undefined);
|
|
416
|
+
}
|
|
417
|
+
const newValueManager = parent.getReferenceValueManager(delta.newReference);
|
|
418
|
+
if (delta.newReference.multiple) {
|
|
419
|
+
const valueManager = newValueManager as MultiReferenceValueManager<INodeBase>;
|
|
420
|
+
valueManager.removeAtIndexDirectly(delta.newIndex); // should be delta.replacedTarget
|
|
421
|
+
valueManager.insertAtIndexDirectly(movedTarget, delta.newIndex);
|
|
422
|
+
} else {
|
|
423
|
+
(newValueManager as SingleReferenceValueManager<INodeBase>).setDirectly(movedTarget);
|
|
424
|
+
}
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (delta instanceof EntryMovedAndReplacedInSameReferenceDelta) {
|
|
428
|
+
const parent = lookupNodeFrom(delta.parent);
|
|
429
|
+
const valueManager = parent.getReferenceValueManager(delta.reference);
|
|
430
|
+
if (delta.reference.multiple) {
|
|
431
|
+
(valueManager as MultiReferenceValueManager<INodeBase>).moveAndReplaceDirectly(delta.oldIndex, delta.newIndex);
|
|
432
|
+
} else {
|
|
433
|
+
// (do nothing)
|
|
434
|
+
}
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
if (delta instanceof CompositeDelta) {
|
|
438
|
+
delta.parts.forEach(applyDelta);
|
|
439
|
+
}
|
|
440
|
+
if (delta instanceof NoOpDelta) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
217
443
|
|
|
218
|
-
|
|
219
|
-
lookupNodeFrom(delta.parent).annotationsValueManager.insertAtIndexDirectly(delta.newAnnotation, delta.index);
|
|
220
|
-
delta.newAnnotation.attachTo(delta.parent, null);
|
|
221
|
-
return;
|
|
444
|
+
throw new Error(`application of delta of class ${delta.constructor.name} not implemented`);
|
|
222
445
|
}
|
|
223
|
-
if (delta instanceof AnnotationDeletedDelta) {
|
|
224
|
-
lookupNodeFrom(delta.parent).annotationsValueManager.removeDirectly(delta.deletedAnnotation); // should be at index delta.index
|
|
225
|
-
delta.deletedAnnotation.detach();
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
if (delta instanceof AnnotationReplacedDelta) {
|
|
229
|
-
const valueManager = lookupNodeFrom(delta.parent).annotationsValueManager;
|
|
230
|
-
valueManager.removeDirectly(delta.replacedAnnotation); // should be at index delta.index
|
|
231
|
-
delta.replacedAnnotation.detach();
|
|
232
|
-
valueManager.insertAtIndexDirectly(delta.newAnnotation, delta.index);
|
|
233
|
-
delta.newAnnotation.attachTo(delta.parent, null);
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
if (delta instanceof AnnotationMovedFromOtherParentDelta) {
|
|
237
|
-
lookupNodeFrom(delta.oldParent).annotationsValueManager.removeDirectly(delta.movedAnnotation); // should be at index delta.index
|
|
238
|
-
delta.movedAnnotation.detach();
|
|
239
|
-
lookupNodeFrom(delta.newParent).annotationsValueManager.insertAtIndexDirectly(delta.movedAnnotation, delta.newIndex);
|
|
240
|
-
delta.movedAnnotation.attachTo(delta.newParent, null);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
if (delta instanceof AnnotationMovedInSameParentDelta) {
|
|
244
|
-
const valueManager = lookupNodeFrom(delta.parent).annotationsValueManager;
|
|
245
|
-
valueManager.moveDirectly(delta.oldIndex, delta.newIndex);
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
throw new Error(`application of delta of class ${delta.constructor.name} not implemented`);
|
|
250
446
|
|
|
447
|
+
return applyDelta(delta)
|
|
251
448
|
};
|
|
252
449
|
|
|
253
450
|
|
|
@@ -273,12 +470,12 @@ export const applyDelta = deltaApplier()
|
|
|
273
470
|
* @usage should look as follows.
|
|
274
471
|
*
|
|
275
472
|
* ```typescript
|
|
276
|
-
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk,
|
|
473
|
+
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk, receiveDelta);
|
|
277
474
|
* applyDeltasWithLookup(idMapping, deltas);
|
|
278
475
|
* ```
|
|
279
476
|
*/
|
|
280
|
-
export const applyDeltasWithLookup = (idMapping: IdMapping, deltas: IDelta[]): void => {
|
|
281
|
-
deltas.forEach((delta) => applyDeltaWithLookup(idMapping, delta));
|
|
477
|
+
export const applyDeltasWithLookup = (idMapping: IdMapping, deltas: IDelta[], updatablePartitions?: () => INodeBase[]): void => {
|
|
478
|
+
deltas.forEach((delta) => applyDeltaWithLookup(idMapping, delta, updatablePartitions));
|
|
282
479
|
};
|
|
283
480
|
|
|
284
481
|
|
|
@@ -289,12 +486,12 @@ export const applyDeltasWithLookup = (idMapping: IdMapping, deltas: IDelta[]): v
|
|
|
289
486
|
* @usage should look as follows.
|
|
290
487
|
*
|
|
291
488
|
* ```typescript
|
|
292
|
-
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk,
|
|
489
|
+
* const {roots, idMapping} = deserializeAsLDMModelWithMapping(serializationChunk, receiveDelta);
|
|
293
490
|
* applyDeltaWithLookup(idMapping, delta);
|
|
294
491
|
* ```
|
|
295
492
|
*/
|
|
296
|
-
export const applyDeltaWithLookup = (idMapping: IdMapping, delta: IDelta): void =>
|
|
297
|
-
deltaApplier(idMapping)(delta)
|
|
493
|
+
export const applyDeltaWithLookup = (idMapping: IdMapping, delta: IDelta, updatablePartitions?: () => INodeBase[]): void =>
|
|
494
|
+
deltaApplier(idMapping, updatablePartitions)(delta)
|
|
298
495
|
|
|
299
496
|
|
|
300
497
|
/**
|
|
@@ -312,6 +509,9 @@ export const updateIdMappingWithDelta = (idMapping: IdMapping, delta: IDelta) =>
|
|
|
312
509
|
if (delta instanceof AnnotationAddedDelta) {
|
|
313
510
|
idMapping.updateWith(delta.newAnnotation);
|
|
314
511
|
}
|
|
512
|
+
if (delta instanceof PartitionAddedDelta) {
|
|
513
|
+
idMapping.updateWith(delta.newPartition);
|
|
514
|
+
}
|
|
315
515
|
// (nothing to be done: no need –yet?- to take deleted child nodes out of the ID mapping)
|
|
316
516
|
};
|
|
317
517
|
|