@lionweb/class-core 0.7.0-beta.10 → 0.7.0-beta.12

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