@lionweb/class-core 0.7.0-beta.9 → 0.7.1

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 (117) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/README.md +6 -6
  3. package/dist/LionCore_builtins.g.d.ts +2 -2
  4. package/dist/LionCore_builtins.g.d.ts.map +1 -1
  5. package/dist/LionCore_builtins.g.js +1 -1
  6. package/dist/LionCore_builtins.g.js.map +1 -1
  7. package/dist/base-types.d.ts +7 -11
  8. package/dist/base-types.d.ts.map +1 -1
  9. package/dist/base-types.js +3 -28
  10. package/dist/base-types.js.map +1 -1
  11. package/dist/convenience.d.ts +10 -9
  12. package/dist/convenience.d.ts.map +1 -1
  13. package/dist/convenience.js +12 -11
  14. package/dist/convenience.js.map +1 -1
  15. package/dist/deltas/appliers.d.ts +5 -4
  16. package/dist/deltas/appliers.d.ts.map +1 -1
  17. package/dist/deltas/appliers.js +369 -163
  18. package/dist/deltas/appliers.js.map +1 -1
  19. package/dist/deltas/compositor.d.ts +51 -0
  20. package/dist/deltas/compositor.d.ts.map +1 -0
  21. package/dist/deltas/compositor.js +95 -0
  22. package/dist/deltas/compositor.js.map +1 -0
  23. package/dist/deltas/index.d.ts +2 -1
  24. package/dist/deltas/index.d.ts.map +1 -1
  25. package/dist/deltas/index.js +2 -1
  26. package/dist/deltas/index.js.map +1 -1
  27. package/dist/deltas/inverters.d.ts.map +1 -1
  28. package/dist/deltas/inverters.js +91 -28
  29. package/dist/deltas/inverters.js.map +1 -1
  30. package/dist/deltas/receivers.d.ts +39 -0
  31. package/dist/deltas/receivers.d.ts.map +1 -0
  32. package/dist/deltas/receivers.js +60 -0
  33. package/dist/deltas/receivers.js.map +1 -0
  34. package/dist/deltas/serialization/deserializer.g.d.ts.map +1 -1
  35. package/dist/deltas/serialization/deserializer.g.js +167 -59
  36. package/dist/deltas/serialization/deserializer.g.js.map +1 -1
  37. package/dist/deltas/serialization/serializer-helpers.d.ts +1 -1
  38. package/dist/deltas/serialization/serializer-helpers.d.ts.map +1 -1
  39. package/dist/deltas/serialization/serializer-helpers.js +3 -4
  40. package/dist/deltas/serialization/serializer-helpers.js.map +1 -1
  41. package/dist/deltas/serialization/serializer.g.d.ts +2 -2
  42. package/dist/deltas/serialization/serializer.g.d.ts.map +1 -1
  43. package/dist/deltas/serialization/serializer.g.js +186 -47
  44. package/dist/deltas/serialization/serializer.g.js.map +1 -1
  45. package/dist/deltas/serialization/types.g.d.ts +156 -43
  46. package/dist/deltas/serialization/types.g.d.ts.map +1 -1
  47. package/dist/deltas/types.g.d.ts +155 -55
  48. package/dist/deltas/types.g.d.ts.map +1 -1
  49. package/dist/deltas/types.g.js +170 -57
  50. package/dist/deltas/types.g.js.map +1 -1
  51. package/dist/deserializer.d.ts +6 -6
  52. package/dist/deserializer.d.ts.map +1 -1
  53. package/dist/deserializer.js +16 -27
  54. package/dist/deserializer.js.map +1 -1
  55. package/dist/duplicator.d.ts.map +1 -1
  56. package/dist/duplicator.js.map +1 -1
  57. package/dist/factory.d.ts +10 -2
  58. package/dist/factory.d.ts.map +1 -1
  59. package/dist/factory.js +25 -16
  60. package/dist/factory.js.map +1 -1
  61. package/dist/id-mapping.d.ts +31 -3
  62. package/dist/id-mapping.d.ts.map +1 -1
  63. package/dist/id-mapping.js +46 -14
  64. package/dist/id-mapping.js.map +1 -1
  65. package/dist/serializer.d.ts.map +1 -1
  66. package/dist/textualizer.d.ts +1 -1
  67. package/dist/textualizer.d.ts.map +1 -1
  68. package/dist/textualizer.js +1 -1
  69. package/dist/textualizer.js.map +1 -1
  70. package/dist/value-managers/annotations.d.ts +5 -0
  71. package/dist/value-managers/annotations.d.ts.map +1 -1
  72. package/dist/value-managers/annotations.js +31 -3
  73. package/dist/value-managers/annotations.js.map +1 -1
  74. package/dist/value-managers/base.d.ts +2 -2
  75. package/dist/value-managers/base.d.ts.map +1 -1
  76. package/dist/value-managers/base.js +4 -4
  77. package/dist/value-managers/base.js.map +1 -1
  78. package/dist/value-managers/containments.d.ts +4 -1
  79. package/dist/value-managers/containments.d.ts.map +1 -1
  80. package/dist/value-managers/containments.js +151 -20
  81. package/dist/value-managers/containments.js.map +1 -1
  82. package/dist/value-managers/properties.d.ts.map +1 -1
  83. package/dist/value-managers/properties.js +1 -0
  84. package/dist/value-managers/properties.js.map +1 -1
  85. package/dist/value-managers/references.d.ts +3 -0
  86. package/dist/value-managers/references.d.ts.map +1 -1
  87. package/dist/value-managers/references.js +26 -8
  88. package/dist/value-managers/references.js.map +1 -1
  89. package/package.json +34 -37
  90. package/src/LionCore_builtins.g.ts +2 -2
  91. package/src/base-types.ts +6 -32
  92. package/src/convenience.ts +15 -14
  93. package/src/deltas/appliers.ts +377 -177
  94. package/src/deltas/compositor.ts +107 -0
  95. package/src/deltas/index.ts +3 -1
  96. package/src/deltas/inverters.ts +108 -36
  97. package/src/deltas/receivers.ts +92 -0
  98. package/src/deltas/serialization/deserializer.g.ts +185 -64
  99. package/src/deltas/serialization/serializer-helpers.ts +3 -10
  100. package/src/deltas/serialization/serializer.g.ts +242 -63
  101. package/src/deltas/serialization/types.g.ts +190 -51
  102. package/src/deltas/types.g.ts +190 -51
  103. package/src/deserializer.ts +32 -43
  104. package/src/duplicator.ts +1 -1
  105. package/src/factory.ts +31 -17
  106. package/src/id-mapping.ts +43 -5
  107. package/src/textualizer.ts +1 -1
  108. package/src/value-managers/annotations.ts +28 -2
  109. package/src/value-managers/base.ts +4 -4
  110. package/src/value-managers/containments.ts +144 -20
  111. package/src/value-managers/properties.ts +1 -0
  112. package/src/value-managers/references.ts +28 -8
  113. package/dist/deltas/handlers.d.ts +0 -17
  114. package/dist/deltas/handlers.d.ts.map +0 -1
  115. package/dist/deltas/handlers.js +0 -43
  116. package/dist/deltas/handlers.js.map +0 -1
  117. package/src/deltas/handlers.ts +0 -64
@@ -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,
@@ -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 with and without lookup in
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
- 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
- }
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
- if (delta instanceof AnnotationAddedDelta) {
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, handleDelta);
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, handleDelta);
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