@fluidframework/merge-tree 2.12.0 → 2.20.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 +46 -0
- package/api-report/merge-tree.legacy.alpha.api.md +0 -108
- package/dist/MergeTreeTextHelper.d.ts.map +1 -1
- package/dist/MergeTreeTextHelper.js +0 -2
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +6 -16
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +3 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -28
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +2 -1
- package/dist/endOfTreeSegment.d.ts.map +1 -1
- package/dist/endOfTreeSegment.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +0 -4
- package/dist/localReference.d.ts +5 -7
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +1 -3
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +8 -7
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +187 -228
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js +3 -2
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +65 -325
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +96 -130
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +0 -2
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/opBuilder.d.ts +0 -5
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +0 -5
- package/dist/opBuilder.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +29 -31
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +3 -2
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +5 -2
- package/dist/perspective.js.map +1 -1
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +4 -1
- package/dist/referencePositions.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +10 -14
- package/dist/revertibles.js.map +1 -1
- package/dist/segmentGroupCollection.d.ts +4 -4
- package/dist/segmentGroupCollection.d.ts.map +1 -1
- package/dist/segmentGroupCollection.js +0 -6
- package/dist/segmentGroupCollection.js.map +1 -1
- package/dist/segmentInfos.d.ts +251 -0
- package/dist/segmentInfos.d.ts.map +1 -0
- package/dist/segmentInfos.js +166 -0
- package/dist/segmentInfos.js.map +1 -0
- package/dist/snapshotLoader.d.ts.map +1 -1
- package/dist/snapshotLoader.js +36 -44
- package/dist/snapshotLoader.js.map +1 -1
- package/dist/snapshotV1.d.ts.map +1 -1
- package/dist/snapshotV1.js +9 -12
- package/dist/snapshotV1.js.map +1 -1
- package/dist/snapshotlegacy.d.ts +2 -2
- package/dist/snapshotlegacy.d.ts.map +1 -1
- package/dist/snapshotlegacy.js +5 -3
- package/dist/snapshotlegacy.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +5 -8
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts +0 -2
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +1 -5
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.annotateMarker.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js +15 -12
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js +3 -2
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +6 -6
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/dirname.cjs +0 -1
- package/dist/test/dirname.cjs.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +2 -4
- package/dist/test/index.js.map +1 -1
- package/dist/test/mergeTree.annotate.spec.js +3 -0
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js +1 -1
- package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTree.walk.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js +2 -3
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/propertyManager.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +2 -1
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/dist/test/revertibleFarm.spec.js.map +1 -1
- package/dist/test/segmentGroupCollection.spec.js +15 -3
- package/dist/test/segmentGroupCollection.spec.js.map +1 -1
- package/dist/test/snapshot.utils.d.ts +2 -2
- package/dist/test/snapshot.utils.d.ts.map +1 -1
- package/dist/test/snapshot.utils.js.map +1 -1
- package/dist/test/sortedSegmentSet.spec.js +4 -3
- package/dist/test/sortedSegmentSet.spec.js.map +1 -1
- package/dist/test/testClient.d.ts +8 -6
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js +28 -27
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +6 -4
- package/dist/test/testClientLogger.js.map +1 -1
- package/dist/test/testUtils.d.ts +2 -2
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +32 -8
- package/dist/test/testUtils.js.map +1 -1
- package/dist/test/text.d.ts +2 -2
- package/dist/test/text.d.ts.map +1 -1
- package/dist/test/text.js +12 -6
- package/dist/test/text.js.map +1 -1
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.js +1 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/zamboni.d.ts.map +1 -1
- package/dist/zamboni.js +8 -7
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.d.ts.map +1 -1
- package/lib/MergeTreeTextHelper.js +0 -2
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +6 -16
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +3 -4
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +40 -29
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +2 -1
- package/lib/endOfTreeSegment.d.ts.map +1 -1
- package/lib/endOfTreeSegment.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +0 -4
- package/lib/localReference.d.ts +5 -7
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +1 -3
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +8 -7
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +175 -220
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js +3 -2
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +65 -325
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +92 -127
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +0 -2
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/opBuilder.d.ts +0 -5
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +0 -5
- package/lib/opBuilder.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +26 -28
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +3 -2
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +5 -2
- package/lib/perspective.js.map +1 -1
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +4 -1
- package/lib/referencePositions.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +8 -12
- package/lib/revertibles.js.map +1 -1
- package/lib/segmentGroupCollection.d.ts +4 -4
- package/lib/segmentGroupCollection.d.ts.map +1 -1
- package/lib/segmentGroupCollection.js +0 -6
- package/lib/segmentGroupCollection.js.map +1 -1
- package/lib/segmentInfos.d.ts +251 -0
- package/lib/segmentInfos.d.ts.map +1 -0
- package/lib/segmentInfos.js +145 -0
- package/lib/segmentInfos.js.map +1 -0
- package/lib/snapshotLoader.d.ts.map +1 -1
- package/lib/snapshotLoader.js +36 -44
- package/lib/snapshotLoader.js.map +1 -1
- package/lib/snapshotV1.d.ts.map +1 -1
- package/lib/snapshotV1.js +9 -12
- package/lib/snapshotV1.js.map +1 -1
- package/lib/snapshotlegacy.d.ts +2 -2
- package/lib/snapshotlegacy.d.ts.map +1 -1
- package/lib/snapshotlegacy.js +5 -3
- package/lib/snapshotlegacy.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +5 -8
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts +0 -2
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +0 -3
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.annotateMarker.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js +15 -12
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js +3 -2
- package/lib/test/client.getPosition.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +1 -1
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.localReferenceFarm.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +1 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/dirname.cjs +0 -1
- package/lib/test/dirname.cjs.map +1 -1
- package/lib/test/index.d.ts +1 -1
- package/lib/test/index.d.ts.map +1 -1
- package/lib/test/index.js +1 -1
- package/lib/test/index.js.map +1 -1
- package/lib/test/mergeTree.annotate.spec.js +3 -0
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.insertingWalk.spec.js +2 -2
- package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.spec.js +2 -0
- package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTree.walk.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js +1 -2
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/propertyManager.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +2 -1
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
- package/lib/test/revertibleFarm.spec.js.map +1 -1
- package/lib/test/segmentGroupCollection.spec.js +15 -3
- package/lib/test/segmentGroupCollection.spec.js.map +1 -1
- package/lib/test/snapshot.utils.d.ts +2 -2
- package/lib/test/snapshot.utils.d.ts.map +1 -1
- package/lib/test/snapshot.utils.js.map +1 -1
- package/lib/test/sortedSegmentSet.spec.js +4 -3
- package/lib/test/sortedSegmentSet.spec.js.map +1 -1
- package/lib/test/testClient.d.ts +8 -6
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +29 -28
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +5 -3
- package/lib/test/testClientLogger.js.map +1 -1
- package/lib/test/testUtils.d.ts +2 -2
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +9 -8
- package/lib/test/testUtils.js.map +1 -1
- package/lib/test/text.d.ts +2 -2
- package/lib/test/text.d.ts.map +1 -1
- package/lib/test/text.js +12 -6
- package/lib/test/text.js.map +1 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.js +1 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/zamboni.d.ts.map +1 -1
- package/lib/zamboni.js +7 -6
- package/lib/zamboni.js.map +1 -1
- package/package.json +77 -19
- package/src/MergeTreeTextHelper.ts +2 -4
- package/src/attributionPolicy.ts +5 -13
- package/src/client.ts +55 -44
- package/src/endOfTreeSegment.ts +3 -5
- package/src/index.ts +0 -7
- package/src/localReference.ts +6 -8
- package/src/mergeTree.ts +233 -290
- package/src/mergeTreeNodeWalk.ts +3 -2
- package/src/mergeTreeNodes.ts +160 -490
- package/src/mergeTreeTracking.ts +0 -3
- package/src/opBuilder.ts +0 -5
- package/src/partialLengths.ts +40 -29
- package/src/perspective.ts +23 -4
- package/src/referencePositions.ts +4 -1
- package/src/revertibles.ts +19 -16
- package/src/segmentGroupCollection.ts +7 -18
- package/src/segmentInfos.ts +371 -0
- package/src/snapshotLoader.ts +56 -57
- package/src/snapshotV1.ts +14 -16
- package/src/snapshotlegacy.ts +12 -17
- package/src/sortedSegmentSet.ts +6 -8
- package/src/zamboni.ts +10 -12
package/src/mergeTreeTracking.ts
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
import { LocalReferencePosition } from "./localReference.js";
|
|
7
7
|
import { ISegment } from "./mergeTreeNodes.js";
|
|
8
|
-
// eslint-disable-next-line import/no-deprecated
|
|
9
8
|
import { SortedSegmentSet } from "./sortedSegmentSet.js";
|
|
10
9
|
|
|
11
10
|
/**
|
|
@@ -31,11 +30,9 @@ export interface ITrackingGroup {
|
|
|
31
30
|
* @alpha
|
|
32
31
|
*/
|
|
33
32
|
export class TrackingGroup implements ITrackingGroup {
|
|
34
|
-
// eslint-disable-next-line import/no-deprecated
|
|
35
33
|
private readonly trackedSet: SortedSegmentSet<Trackable>;
|
|
36
34
|
|
|
37
35
|
constructor() {
|
|
38
|
-
// eslint-disable-next-line import/no-deprecated
|
|
39
36
|
this.trackedSet = new SortedSegmentSet<Trackable>();
|
|
40
37
|
}
|
|
41
38
|
|
package/src/opBuilder.ts
CHANGED
|
@@ -184,11 +184,6 @@ export function createInsertOp(pos: number, segSpec: unknown): IMergeTreeInsertM
|
|
|
184
184
|
*
|
|
185
185
|
* @param ops - The ops to group
|
|
186
186
|
*
|
|
187
|
-
* @deprecated The ability to create group ops will be removed in an upcoming
|
|
188
|
-
* release, as group ops are redundant with he native batching capabilities of
|
|
189
|
-
* the runtime
|
|
190
|
-
*
|
|
191
|
-
* @deprecated The ability to create group ops will be removed in an upcoming release, as group ops are redundant with he native batching capabilities of the runtime
|
|
192
187
|
* @internal
|
|
193
188
|
*/
|
|
194
189
|
// eslint-disable-next-line import/no-deprecated
|
package/src/partialLengths.ts
CHANGED
|
@@ -9,24 +9,23 @@ import { Property, RedBlackTree } from "./collections/index.js";
|
|
|
9
9
|
import { UnassignedSequenceNumber } from "./constants.js";
|
|
10
10
|
import { MergeTree } from "./mergeTree.js";
|
|
11
11
|
import {
|
|
12
|
-
// eslint-disable-next-line import/no-deprecated
|
|
13
12
|
CollaborationWindow,
|
|
14
13
|
IMergeNode,
|
|
15
|
-
|
|
16
|
-
IMoveInfo,
|
|
17
|
-
// eslint-disable-next-line import/no-deprecated
|
|
18
|
-
IRemovalInfo,
|
|
19
|
-
ISegmentLeaf,
|
|
14
|
+
ISegmentPrivate,
|
|
20
15
|
compareNumbers,
|
|
21
16
|
seqLTE,
|
|
22
|
-
toMoveInfo,
|
|
23
|
-
toRemovalInfo,
|
|
24
17
|
type MergeBlock,
|
|
25
18
|
} from "./mergeTreeNodes.js";
|
|
26
|
-
|
|
19
|
+
import {
|
|
20
|
+
toRemovalInfo,
|
|
21
|
+
toMoveInfo,
|
|
22
|
+
IRemovalInfo,
|
|
23
|
+
IMoveInfo,
|
|
24
|
+
assertInserted,
|
|
25
|
+
isRemoved,
|
|
26
|
+
} from "./segmentInfos.js";
|
|
27
27
|
import { SortedSet } from "./sortedSet.js";
|
|
28
28
|
|
|
29
|
-
// eslint-disable-next-line import/no-deprecated
|
|
30
29
|
class PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number> {
|
|
31
30
|
protected getKey(item: PartialSequenceLength): number {
|
|
32
31
|
return item.seq;
|
|
@@ -289,7 +288,7 @@ export class PartialSequenceLengths {
|
|
|
289
288
|
*/
|
|
290
289
|
public static combine(
|
|
291
290
|
block: MergeBlock,
|
|
292
|
-
|
|
291
|
+
|
|
293
292
|
collabWindow: CollaborationWindow,
|
|
294
293
|
recur = false,
|
|
295
294
|
computeLocalPartials = false,
|
|
@@ -378,7 +377,7 @@ export class PartialSequenceLengths {
|
|
|
378
377
|
*/
|
|
379
378
|
private static fromLeaves(
|
|
380
379
|
block: MergeBlock,
|
|
381
|
-
|
|
380
|
+
|
|
382
381
|
collabWindow: CollaborationWindow,
|
|
383
382
|
computeLocalPartials: boolean,
|
|
384
383
|
): PartialSequenceLengths {
|
|
@@ -506,10 +505,11 @@ export class PartialSequenceLengths {
|
|
|
506
505
|
*/
|
|
507
506
|
static accumulateMoveOverlapForExisting(
|
|
508
507
|
segmentLen: number,
|
|
509
|
-
segment:
|
|
508
|
+
segment: ISegmentPrivate,
|
|
510
509
|
firstGte: PartialSequenceLength,
|
|
511
510
|
clientIds: number[],
|
|
512
511
|
): void {
|
|
512
|
+
assertInserted(segment);
|
|
513
513
|
const nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);
|
|
514
514
|
|
|
515
515
|
PartialSequenceLengths.accumulateMoveClientOverlap(
|
|
@@ -526,7 +526,7 @@ export class PartialSequenceLengths {
|
|
|
526
526
|
PartialSequenceLengths.accumulateMoveClientOverlap(
|
|
527
527
|
firstGte,
|
|
528
528
|
[segment.clientId],
|
|
529
|
-
segment
|
|
529
|
+
toMoveInfo(segment)?.wasMovedOnInsert ? -segment.cachedLength : segmentLen,
|
|
530
530
|
);
|
|
531
531
|
}
|
|
532
532
|
}
|
|
@@ -539,10 +539,11 @@ export class PartialSequenceLengths {
|
|
|
539
539
|
* segment
|
|
540
540
|
*/
|
|
541
541
|
private static getMoveOverlapForExisting(
|
|
542
|
-
segment:
|
|
542
|
+
segment: ISegmentPrivate,
|
|
543
543
|
obliterateOverlapLen: number,
|
|
544
544
|
clientIds: number[],
|
|
545
545
|
): RedBlackTree<number, IOverlapClient> {
|
|
546
|
+
assertInserted(segment);
|
|
546
547
|
const nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);
|
|
547
548
|
const overlapObliterateClients = PartialSequenceLengths.getOverlapClients(
|
|
548
549
|
nonInsertingClientIds,
|
|
@@ -552,7 +553,9 @@ export class PartialSequenceLengths {
|
|
|
552
553
|
if (clientIds.length !== nonInsertingClientIds.length) {
|
|
553
554
|
overlapObliterateClients.put(segment.clientId, {
|
|
554
555
|
clientId: segment.clientId,
|
|
555
|
-
seglen: segment
|
|
556
|
+
seglen: toMoveInfo(segment)?.wasMovedOnInsert
|
|
557
|
+
? -segment.cachedLength
|
|
558
|
+
: obliterateOverlapLen,
|
|
556
559
|
});
|
|
557
560
|
}
|
|
558
561
|
|
|
@@ -560,7 +563,7 @@ export class PartialSequenceLengths {
|
|
|
560
563
|
}
|
|
561
564
|
|
|
562
565
|
private static updatePartialsAfterInsertion(
|
|
563
|
-
segment:
|
|
566
|
+
segment: ISegmentPrivate,
|
|
564
567
|
segmentLen: number,
|
|
565
568
|
remoteObliteratedLen: number | undefined,
|
|
566
569
|
obliterateOverlapLen: number = segmentLen,
|
|
@@ -640,12 +643,12 @@ export class PartialSequenceLengths {
|
|
|
640
643
|
*/
|
|
641
644
|
private static insertSegment(
|
|
642
645
|
combinedPartialLengths: PartialSequenceLengths,
|
|
643
|
-
segment:
|
|
644
|
-
// eslint-disable-next-line import/no-deprecated
|
|
646
|
+
segment: ISegmentPrivate,
|
|
645
647
|
removalInfo?: IRemovalInfo,
|
|
646
|
-
// eslint-disable-next-line import/no-deprecated
|
|
647
648
|
moveInfo?: IMoveInfo,
|
|
648
649
|
): void {
|
|
650
|
+
assertInserted(segment);
|
|
651
|
+
|
|
649
652
|
const removalIsLocal =
|
|
650
653
|
!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;
|
|
651
654
|
const moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;
|
|
@@ -654,7 +657,7 @@ export class PartialSequenceLengths {
|
|
|
654
657
|
(!!removalInfo && removalIsLocal && (!moveInfo || moveIsLocal)) ||
|
|
655
658
|
(!!moveInfo && moveIsLocal && (!removalInfo || removalIsLocal));
|
|
656
659
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
657
|
-
let seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq
|
|
660
|
+
let seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq;
|
|
658
661
|
let segmentLen = segment.cachedLength;
|
|
659
662
|
let clientId = segment.clientId;
|
|
660
663
|
let removeClientOverlap: number[] | undefined;
|
|
@@ -690,7 +693,7 @@ export class PartialSequenceLengths {
|
|
|
690
693
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
691
694
|
seqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;
|
|
692
695
|
|
|
693
|
-
if (
|
|
696
|
+
if (moveInfo.wasMovedOnInsert) {
|
|
694
697
|
assert(
|
|
695
698
|
moveInfo.movedSeq !== -1,
|
|
696
699
|
0x871 /* wasMovedOnInsert should only be set on acked obliterates */,
|
|
@@ -702,7 +705,10 @@ export class PartialSequenceLengths {
|
|
|
702
705
|
|
|
703
706
|
const hasOverlap = moveInfo.movedClientIds.length > 1;
|
|
704
707
|
moveClientOverlap = hasOverlap ? moveInfo.movedClientIds : undefined;
|
|
705
|
-
}
|
|
708
|
+
} // BUG BUG: something fishy here around how/when move info is passed or not
|
|
709
|
+
// this condition only hits if it is not passed, so we can't rely on the passed move info
|
|
710
|
+
// and need to inspect the segment directly. maybe related to AB#15630.
|
|
711
|
+
else if (toMoveInfo(segment)?.wasMovedOnInsert) {
|
|
706
712
|
// if this segment was obliterated on insert, its length is only
|
|
707
713
|
// visible to the client that inserted it
|
|
708
714
|
segmentLen = 0;
|
|
@@ -775,7 +781,12 @@ export class PartialSequenceLengths {
|
|
|
775
781
|
// todo: the below block needs to be changed to handle obliterate, which
|
|
776
782
|
// doesn't have great support for reconnect at the moment. see ADO #3714
|
|
777
783
|
const { unsequencedRecords } = combinedPartialLengths;
|
|
778
|
-
if (
|
|
784
|
+
if (
|
|
785
|
+
unsequencedRecords &&
|
|
786
|
+
removeClientOverlap &&
|
|
787
|
+
isRemoved(segment) &&
|
|
788
|
+
segment.localRemovedSeq !== undefined
|
|
789
|
+
) {
|
|
779
790
|
const localSeq = segment.localRemovedSeq;
|
|
780
791
|
const localPartialLengthEntry: LocalPartialSequenceLength = {
|
|
781
792
|
seq: seqOrLocalSeq,
|
|
@@ -910,7 +921,7 @@ export class PartialSequenceLengths {
|
|
|
910
921
|
node: MergeBlock,
|
|
911
922
|
seq: number,
|
|
912
923
|
clientId: number,
|
|
913
|
-
|
|
924
|
+
|
|
914
925
|
collabWindow: CollaborationWindow,
|
|
915
926
|
): void {
|
|
916
927
|
let seqSeglen = 0;
|
|
@@ -938,10 +949,10 @@ export class PartialSequenceLengths {
|
|
|
938
949
|
// if this segment was moved on insert, its length should
|
|
939
950
|
// only be visible to the inserting client
|
|
940
951
|
if (
|
|
941
|
-
segment.wasMovedOnInsert &&
|
|
942
952
|
segment.seq !== undefined &&
|
|
943
953
|
moveInfo &&
|
|
944
|
-
moveInfo.movedSeq < segment.seq
|
|
954
|
+
moveInfo.movedSeq < segment.seq &&
|
|
955
|
+
moveInfo.wasMovedOnInsert
|
|
945
956
|
) {
|
|
946
957
|
remoteObliteratedLen += segment.cachedLength;
|
|
947
958
|
} else {
|
|
@@ -964,7 +975,7 @@ export class PartialSequenceLengths {
|
|
|
964
975
|
if (removeHappenedFirst) {
|
|
965
976
|
remoteObliteratedLen -= segment.cachedLength;
|
|
966
977
|
} else if (
|
|
967
|
-
|
|
978
|
+
moveInfo.wasMovedOnInsert &&
|
|
968
979
|
segment.seq !== UnassignedSequenceNumber &&
|
|
969
980
|
segment.seq !== undefined &&
|
|
970
981
|
moveInfo.movedSeq > segment.seq
|
|
@@ -1135,7 +1146,7 @@ export class PartialSequenceLengths {
|
|
|
1135
1146
|
}
|
|
1136
1147
|
|
|
1137
1148
|
// Clear away partial sums for sequence numbers earlier than the current window
|
|
1138
|
-
|
|
1149
|
+
|
|
1139
1150
|
private zamboni(segmentWindow: CollaborationWindow): void {
|
|
1140
1151
|
this.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);
|
|
1141
1152
|
this.minSeq = segmentWindow.minSeq;
|
package/src/perspective.ts
CHANGED
|
@@ -7,6 +7,15 @@ import { UnassignedSequenceNumber } from "./constants.js";
|
|
|
7
7
|
import { type MergeTree } from "./mergeTree.js";
|
|
8
8
|
import { LeafAction, backwardExcursion, forwardExcursion } from "./mergeTreeNodeWalk.js";
|
|
9
9
|
import { seqLTE, type ISegmentLeaf } from "./mergeTreeNodes.js";
|
|
10
|
+
import {
|
|
11
|
+
isInserted,
|
|
12
|
+
isMoved,
|
|
13
|
+
isRemoved,
|
|
14
|
+
type IInsertionInfo,
|
|
15
|
+
type IMoveInfo,
|
|
16
|
+
type IRemovalInfo,
|
|
17
|
+
type SegmentWithInfo,
|
|
18
|
+
} from "./segmentInfos.js";
|
|
10
19
|
|
|
11
20
|
/**
|
|
12
21
|
* Provides a view of a MergeTree from the perspective of a specific client at a specific sequence number.
|
|
@@ -77,7 +86,10 @@ export class PerspectiveImpl implements Perspective {
|
|
|
77
86
|
* @param localSeq - The latest local sequence number to consider.
|
|
78
87
|
* @returns true iff this segment was removed in the given perspective.
|
|
79
88
|
*/
|
|
80
|
-
export function wasRemovedBefore(
|
|
89
|
+
export function wasRemovedBefore(
|
|
90
|
+
seg: SegmentWithInfo<IInsertionInfo & IRemovalInfo>,
|
|
91
|
+
{ refSeq, localSeq }: SeqTime,
|
|
92
|
+
): boolean {
|
|
81
93
|
if (
|
|
82
94
|
seg.removedSeq === UnassignedSequenceNumber &&
|
|
83
95
|
localSeq !== undefined &&
|
|
@@ -95,7 +107,10 @@ export function wasRemovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTim
|
|
|
95
107
|
* @param localSeq - The latest local sequence number to consider.
|
|
96
108
|
* @returns true iff this segment was moved (aka obliterated) in the given perspective.
|
|
97
109
|
*/
|
|
98
|
-
export function wasMovedBefore(
|
|
110
|
+
export function wasMovedBefore(
|
|
111
|
+
seg: SegmentWithInfo<IInsertionInfo & IMoveInfo>,
|
|
112
|
+
{ refSeq, localSeq }: SeqTime,
|
|
113
|
+
): boolean {
|
|
99
114
|
if (
|
|
100
115
|
seg.movedSeq === UnassignedSequenceNumber &&
|
|
101
116
|
localSeq !== undefined &&
|
|
@@ -110,7 +125,11 @@ export function wasMovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime)
|
|
|
110
125
|
* See {@link wasRemovedBefore} and {@link wasMovedBefore}.
|
|
111
126
|
*/
|
|
112
127
|
export function wasRemovedOrMovedBefore(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
|
|
113
|
-
return
|
|
128
|
+
return (
|
|
129
|
+
isInserted(seg) &&
|
|
130
|
+
((isRemoved(seg) && wasRemovedBefore(seg, seqTime)) ||
|
|
131
|
+
(isMoved(seg) && wasMovedBefore(seg, seqTime)))
|
|
132
|
+
);
|
|
114
133
|
}
|
|
115
134
|
|
|
116
135
|
/**
|
|
@@ -124,7 +143,7 @@ export function isSegmentPresent(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
|
|
|
124
143
|
const { refSeq, localSeq } = seqTime;
|
|
125
144
|
// If seg.seq is undefined, then this segment has existed since minSeq.
|
|
126
145
|
// It may have been moved or removed since.
|
|
127
|
-
if (seg
|
|
146
|
+
if (isInserted(seg)) {
|
|
128
147
|
if (seg.seq !== UnassignedSequenceNumber) {
|
|
129
148
|
if (!seqLTE(seg.seq, refSeq)) {
|
|
130
149
|
return false;
|
|
@@ -7,6 +7,7 @@ import { SlidingPreference } from "./localReference.js";
|
|
|
7
7
|
import { ISegment } from "./mergeTreeNodes.js";
|
|
8
8
|
import { ReferenceType } from "./ops.js";
|
|
9
9
|
import { PropertySet } from "./properties.js";
|
|
10
|
+
import { isMergeNodeInfo } from "./segmentInfos.js";
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* @internal
|
|
@@ -131,6 +132,8 @@ export function compareReferencePositions(a: ReferencePosition, b: ReferencePosi
|
|
|
131
132
|
if (aSeg === bSeg) {
|
|
132
133
|
return a.getOffset() - b.getOffset();
|
|
133
134
|
} else {
|
|
134
|
-
return aSeg
|
|
135
|
+
return !isMergeNodeInfo(aSeg) || (isMergeNodeInfo(bSeg) && aSeg.ordinal < bSeg.ordinal)
|
|
136
|
+
? -1
|
|
137
|
+
: 1;
|
|
135
138
|
}
|
|
136
139
|
}
|
package/src/revertibles.ts
CHANGED
|
@@ -8,16 +8,22 @@ import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
|
8
8
|
|
|
9
9
|
import { DoublyLinkedList } from "./collections/index.js";
|
|
10
10
|
import { EndOfTreeSegment } from "./endOfTreeSegment.js";
|
|
11
|
-
// eslint-disable-next-line import/no-deprecated
|
|
12
11
|
import { LocalReferenceCollection, LocalReferencePosition } from "./localReference.js";
|
|
13
12
|
import { MergeTree, findRootMergeBlock } from "./mergeTree.js";
|
|
14
13
|
import { IMergeTreeDeltaCallbackArgs } from "./mergeTreeDeltaCallback.js";
|
|
15
14
|
import { depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
|
|
16
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
assertSegmentLeaf,
|
|
17
|
+
isSegmentLeaf,
|
|
18
|
+
toSegmentLeaf,
|
|
19
|
+
type ISegmentLeaf,
|
|
20
|
+
type ISegmentPrivate,
|
|
21
|
+
} from "./mergeTreeNodes.js";
|
|
17
22
|
import { ITrackingGroup, Trackable, UnorderedTrackingGroup } from "./mergeTreeTracking.js";
|
|
18
23
|
import { IJSONSegment, MergeTreeDeltaType, ReferenceType } from "./ops.js";
|
|
19
24
|
import { PropertySet, matchProperties } from "./properties.js";
|
|
20
25
|
import { DetachedReferencePosition } from "./referencePositions.js";
|
|
26
|
+
import { toRemovalInfo } from "./segmentInfos.js";
|
|
21
27
|
|
|
22
28
|
/**
|
|
23
29
|
* @legacy
|
|
@@ -86,7 +92,7 @@ export interface MergeTreeWithRevert extends MergeTree {
|
|
|
86
92
|
export type PickPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
87
93
|
function findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {
|
|
88
94
|
const segmentOrNode = trackable.isLeaf() ? trackable : trackable.getSegment();
|
|
89
|
-
const maybeRoot = findRootMergeBlock(segmentOrNode);
|
|
95
|
+
const maybeRoot = findRootMergeBlock(toSegmentLeaf(segmentOrNode));
|
|
90
96
|
assert(
|
|
91
97
|
maybeRoot?.mergeTree !== undefined,
|
|
92
98
|
0x5c2 /* trackable is invalid as it is not in a rooted merge tree. */,
|
|
@@ -99,7 +105,6 @@ function findMergeTreeWithRevert(trackable: Trackable): MergeTreeWithRevert {
|
|
|
99
105
|
const refCallbacks: MergeTreeWithRevert["__mergeTreeRevertible"]["refCallbacks"] = {
|
|
100
106
|
afterSlide: (r: LocalReferencePosition) => {
|
|
101
107
|
if (mergeTree.referencePositionToLocalPosition(r) === DetachedReferencePosition) {
|
|
102
|
-
// eslint-disable-next-line import/no-deprecated
|
|
103
108
|
const refs = LocalReferenceCollection.setOrGet(detachedReferences);
|
|
104
109
|
refs.addAfterTombstones([r]);
|
|
105
110
|
}
|
|
@@ -243,7 +248,7 @@ export function discardMergeTreeDeltaRevertible(
|
|
|
243
248
|
t.trackingCollection.unlink(r.trackingGroup);
|
|
244
249
|
// remove untracked local references
|
|
245
250
|
if (t.trackingCollection.empty && !t.isLeaf()) {
|
|
246
|
-
const segment:
|
|
251
|
+
const segment: ISegmentPrivate | undefined = t.getSegment();
|
|
247
252
|
segment?.localRefs?.removeLocalRef(t);
|
|
248
253
|
}
|
|
249
254
|
}
|
|
@@ -261,7 +266,7 @@ function revertLocalInsert(
|
|
|
261
266
|
tracked.trackingCollection.unlink(revertible.trackingGroup),
|
|
262
267
|
0x3f1 /* tracking group removed */,
|
|
263
268
|
);
|
|
264
|
-
assert(tracked
|
|
269
|
+
assert(isSegmentLeaf(tracked), 0x3f2 /* inserts must track segments */);
|
|
265
270
|
if (toRemovalInfo(tracked) === undefined) {
|
|
266
271
|
const start = getPosition(mergeTreeWithRevert, tracked);
|
|
267
272
|
driver.removeRange(start, start + tracked.cachedLength);
|
|
@@ -284,14 +289,14 @@ function revertLocalRemove(
|
|
|
284
289
|
|
|
285
290
|
assert(!tracked.isLeaf(), 0x3f4 /* removes must track local refs */);
|
|
286
291
|
|
|
287
|
-
const refSeg
|
|
292
|
+
const refSeg = tracked.getSegment();
|
|
288
293
|
let realPos = mergeTreeWithRevert.referencePositionToLocalPosition(tracked);
|
|
289
294
|
|
|
290
295
|
// References which are on EndOfStringSegment don't return detached for pos,
|
|
291
296
|
// they will return the length of the merge-tree. this case just catches
|
|
292
297
|
// random references, likely not created in the revertible flow,
|
|
293
298
|
// that are tying to be reverted for some reason.
|
|
294
|
-
if (realPos === DetachedReferencePosition || refSeg
|
|
299
|
+
if (realPos === DetachedReferencePosition || !isSegmentLeaf(refSeg)) {
|
|
295
300
|
throw new UsageError("Cannot insert at detached references position");
|
|
296
301
|
}
|
|
297
302
|
|
|
@@ -301,12 +306,12 @@ function revertLocalRemove(
|
|
|
301
306
|
|
|
302
307
|
const props = tracked.properties as RemoveSegmentRefProperties;
|
|
303
308
|
driver.insertFromSpec(realPos, props.segSpec);
|
|
304
|
-
const insertSegment
|
|
309
|
+
const insertSegment = mergeTreeWithRevert.getContainingSegment(
|
|
305
310
|
realPos,
|
|
306
311
|
mergeTreeWithRevert.collabWindow.currentSeq,
|
|
307
312
|
mergeTreeWithRevert.collabWindow.clientId,
|
|
308
313
|
).segment;
|
|
309
|
-
|
|
314
|
+
assertSegmentLeaf(insertSegment);
|
|
310
315
|
|
|
311
316
|
const localSlideFilter = (lref: LocalReferencePosition): boolean =>
|
|
312
317
|
(lref.properties as Partial<RemoveSegmentRefProperties>)?.referenceSpace ===
|
|
@@ -333,11 +338,10 @@ function revertLocalRemove(
|
|
|
333
338
|
}
|
|
334
339
|
};
|
|
335
340
|
depthFirstNodeWalk(
|
|
336
|
-
|
|
337
|
-
insertSegment.parent!,
|
|
341
|
+
insertSegment.parent,
|
|
338
342
|
insertSegment,
|
|
339
343
|
undefined,
|
|
340
|
-
(seg:
|
|
344
|
+
(seg: ISegmentPrivate) => {
|
|
341
345
|
if (seg.localRefs?.empty === false) {
|
|
342
346
|
return seg.localRefs.walkReferences(refHandler, undefined, forward);
|
|
343
347
|
}
|
|
@@ -356,7 +360,6 @@ function revertLocalRemove(
|
|
|
356
360
|
}
|
|
357
361
|
|
|
358
362
|
if (insertRef !== undefined) {
|
|
359
|
-
// eslint-disable-next-line import/no-deprecated
|
|
360
363
|
const localRefs = LocalReferenceCollection.setOrGet(insertSegment);
|
|
361
364
|
if (insertRef.before?.empty === false) {
|
|
362
365
|
localRefs.addBeforeTombstones(insertRef.before.map((n) => n.data));
|
|
@@ -370,7 +373,7 @@ function revertLocalRemove(
|
|
|
370
373
|
tg.link(insertSegment);
|
|
371
374
|
tg.unlink(tracked);
|
|
372
375
|
}
|
|
373
|
-
const segment:
|
|
376
|
+
const segment: ISegmentPrivate | undefined = tracked.getSegment();
|
|
374
377
|
segment?.localRefs?.removeLocalRef(tracked);
|
|
375
378
|
}
|
|
376
379
|
}
|
|
@@ -383,7 +386,7 @@ function revertLocalAnnotate(
|
|
|
383
386
|
while (revertible.trackingGroup.size > 0) {
|
|
384
387
|
const tracked = revertible.trackingGroup.tracked[0];
|
|
385
388
|
const unlinked = tracked.trackingCollection.unlink(revertible.trackingGroup);
|
|
386
|
-
assert(unlinked && tracked
|
|
389
|
+
assert(unlinked && isSegmentLeaf(tracked), 0x3f7 /* annotates must track segments */);
|
|
387
390
|
if (toRemovalInfo(tracked) === undefined) {
|
|
388
391
|
const start = getPosition(mergeTreeWithRevert, tracked);
|
|
389
392
|
driver.annotateRange(start, start + tracked.cachedLength, revertible.propertyDeltas);
|
|
@@ -4,16 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { DoublyLinkedList, walkList } from "./collections/index.js";
|
|
7
|
-
// eslint-disable-next-line import/no-deprecated
|
|
8
7
|
import { SegmentGroup, type ISegmentLeaf } from "./mergeTreeNodes.js";
|
|
9
8
|
|
|
10
9
|
export class SegmentGroupCollection {
|
|
11
|
-
|
|
12
|
-
private readonly segmentGroups: DoublyLinkedList<SegmentGroup<ISegmentLeaf>>;
|
|
10
|
+
private readonly segmentGroups: DoublyLinkedList<SegmentGroup>;
|
|
13
11
|
|
|
14
12
|
constructor(private readonly segment: ISegmentLeaf) {
|
|
15
|
-
|
|
16
|
-
this.segmentGroups = new DoublyLinkedList<SegmentGroup<ISegmentLeaf>>();
|
|
13
|
+
this.segmentGroups = new DoublyLinkedList<SegmentGroup>();
|
|
17
14
|
}
|
|
18
15
|
|
|
19
16
|
public get size(): number {
|
|
@@ -24,19 +21,16 @@ export class SegmentGroupCollection {
|
|
|
24
21
|
return this.segmentGroups.empty;
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
public enqueue(segmentGroup: SegmentGroup<ISegmentLeaf>): void {
|
|
24
|
+
public enqueue(segmentGroup: SegmentGroup): void {
|
|
29
25
|
this.segmentGroups.push(segmentGroup);
|
|
30
26
|
segmentGroup.segments.push(this.segment);
|
|
31
27
|
}
|
|
32
28
|
|
|
33
|
-
|
|
34
|
-
public dequeue(): SegmentGroup<ISegmentLeaf> | undefined {
|
|
29
|
+
public dequeue(): SegmentGroup | undefined {
|
|
35
30
|
return this.segmentGroups.shift()?.data;
|
|
36
31
|
}
|
|
37
32
|
|
|
38
|
-
|
|
39
|
-
public remove?(segmentGroup: SegmentGroup<ISegmentLeaf>): boolean {
|
|
33
|
+
public remove(segmentGroup: SegmentGroup): boolean {
|
|
40
34
|
const found = this.segmentGroups.find((v) => v.data === segmentGroup);
|
|
41
35
|
if (found === undefined) {
|
|
42
36
|
return false;
|
|
@@ -45,8 +39,7 @@ export class SegmentGroupCollection {
|
|
|
45
39
|
return true;
|
|
46
40
|
}
|
|
47
41
|
|
|
48
|
-
|
|
49
|
-
public pop?(): SegmentGroup<ISegmentLeaf> | undefined {
|
|
42
|
+
public pop(): SegmentGroup | undefined {
|
|
50
43
|
return this.segmentGroups.pop ? this.segmentGroups.pop()?.data : undefined;
|
|
51
44
|
}
|
|
52
45
|
|
|
@@ -54,11 +47,7 @@ export class SegmentGroupCollection {
|
|
|
54
47
|
walkList(this.segmentGroups, (sg) => segmentGroups.enqueueOnCopy(sg.data, this.segment));
|
|
55
48
|
}
|
|
56
49
|
|
|
57
|
-
|
|
58
|
-
private enqueueOnCopy(
|
|
59
|
-
segmentGroup: SegmentGroup<ISegmentLeaf>,
|
|
60
|
-
sourceSegment: ISegmentLeaf,
|
|
61
|
-
): void {
|
|
50
|
+
private enqueueOnCopy(segmentGroup: SegmentGroup, sourceSegment: ISegmentLeaf): void {
|
|
62
51
|
this.enqueue(segmentGroup);
|
|
63
52
|
if (segmentGroup.previousProps) {
|
|
64
53
|
// duplicate the previousProps for this segment
|