@fluidframework/merge-tree 2.11.0 → 2.12.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 +41 -0
- package/api-report/merge-tree.legacy.alpha.api.md +50 -19
- package/dist/MergeTreeTextHelper.js.map +1 -1
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +2 -1
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/endOfTreeSegment.d.ts +3 -3
- 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 +3 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +2 -1
- package/dist/localReference.d.ts +1 -0
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +1 -0
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +19 -2
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodeWalk.d.ts +5 -5
- package/dist/mergeTreeNodeWalk.d.ts.map +1 -1
- package/dist/mergeTreeNodeWalk.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +115 -7
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +25 -1
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/partialLengths.d.ts +2 -2
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js +5 -1
- package/dist/partialLengths.js.map +1 -1
- package/dist/perspective.d.ts +9 -9
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js.map +1 -1
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +3 -0
- package/dist/revertibles.js.map +1 -1
- package/dist/snapshotLoader.js.map +1 -1
- 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.map +1 -1
- package/dist/sortedSegmentSet.d.ts +4 -4
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.applyMsg.spec.js.map +1 -1
- package/dist/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/dist/test/client.attributionFarm.spec.js.map +1 -1
- package/dist/test/client.getPosition.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.localReferenceFarm.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/dist/test/mergeTreeOperationRunner.js.map +1 -1
- package/dist/test/resetPendingSegmentsToOp.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.map +1 -1
- package/dist/test/testClient.d.ts +6 -6
- package/dist/test/testClient.d.ts.map +1 -1
- package/dist/test/testClient.js.map +1 -1
- 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.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.map +1 -1
- package/dist/test/tracking.spec.js.map +1 -1
- package/dist/test/wordUnitTests.spec.d.ts.map +1 -1
- package/dist/test/wordUnitTests.spec.js +3 -1
- package/dist/test/wordUnitTests.spec.js.map +1 -1
- package/dist/zamboni.js.map +1 -1
- package/lib/MergeTreeTextHelper.js.map +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +2 -1
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.js.map +1 -1
- package/lib/endOfTreeSegment.d.ts +3 -3
- 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 +2 -1
- package/lib/localReference.d.ts +1 -0
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +1 -0
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +22 -3
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodeWalk.d.ts +5 -5
- package/lib/mergeTreeNodeWalk.d.ts.map +1 -1
- package/lib/mergeTreeNodeWalk.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +115 -7
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +23 -0
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/partialLengths.d.ts +2 -2
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js +5 -1
- package/lib/partialLengths.js.map +1 -1
- package/lib/perspective.d.ts +9 -9
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js.map +1 -1
- package/lib/revertibles.d.ts.map +1 -1
- package/lib/revertibles.js +4 -1
- package/lib/revertibles.js.map +1 -1
- package/lib/snapshotLoader.js.map +1 -1
- 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.map +1 -1
- package/lib/sortedSegmentSet.d.ts +4 -4
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.applyMsg.spec.js.map +1 -1
- package/lib/test/client.attributionFarm.spec.d.ts.map +1 -1
- package/lib/test/client.attributionFarm.spec.js.map +1 -1
- package/lib/test/client.getPosition.spec.js.map +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/mergeTree.markRangeRemoved.spec.js.map +1 -1
- package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
- package/lib/test/mergeTreeOperationRunner.js.map +1 -1
- package/lib/test/resetPendingSegmentsToOp.spec.js +1 -1
- package/lib/test/resetPendingSegmentsToOp.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.map +1 -1
- package/lib/test/testClient.d.ts +6 -6
- package/lib/test/testClient.d.ts.map +1 -1
- package/lib/test/testClient.js +1 -1
- package/lib/test/testClient.js.map +1 -1
- 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.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.map +1 -1
- package/lib/test/tracking.spec.js.map +1 -1
- package/lib/test/wordUnitTests.spec.d.ts.map +1 -1
- package/lib/test/wordUnitTests.spec.js +3 -1
- package/lib/test/wordUnitTests.spec.js.map +1 -1
- package/lib/zamboni.js.map +1 -1
- package/package.json +17 -17
- package/src/MergeTreeTextHelper.ts +2 -2
- package/src/attributionPolicy.ts +3 -1
- package/src/client.ts +1 -1
- package/src/endOfTreeSegment.ts +6 -3
- package/src/index.ts +1 -0
- package/src/localReference.ts +1 -0
- package/src/mergeTree.ts +19 -0
- package/src/mergeTreeNodeWalk.ts +6 -6
- package/src/mergeTreeNodes.ts +136 -9
- package/src/partialLengths.ts +9 -5
- package/src/perspective.ts +11 -11
- package/src/revertibles.ts +9 -11
- package/src/snapshotLoader.ts +7 -7
- package/src/snapshotV1.ts +4 -4
- package/src/snapshotlegacy.ts +6 -6
- package/src/sortedSegmentSet.ts +8 -9
- package/src/zamboni.ts +2 -2
package/src/attributionPolicy.ts
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
IMergeTreeSegmentDelta,
|
|
20
20
|
MergeTreeMaintenanceType,
|
|
21
21
|
} from "./mergeTreeDeltaCallback.js";
|
|
22
|
+
import type { ISegmentLeaf } from "./mergeTreeNodes.js";
|
|
22
23
|
import { MergeTreeDeltaType } from "./ops.js";
|
|
23
24
|
|
|
24
25
|
// Note: these thinly wrap MergeTreeDeltaCallback and MergeTreeMaintenanceCallback to provide the client.
|
|
@@ -102,7 +103,8 @@ const attributeInsertionOnSegments = (
|
|
|
102
103
|
key: AttributionKey,
|
|
103
104
|
): void => {
|
|
104
105
|
for (const { segment } of deltaSegments) {
|
|
105
|
-
|
|
106
|
+
const seg: ISegmentLeaf = segment;
|
|
107
|
+
if (seg.seq !== undefined) {
|
|
106
108
|
segment.attribution?.update(
|
|
107
109
|
undefined,
|
|
108
110
|
new AttributionCollection(segment.cachedLength, key),
|
package/src/client.ts
CHANGED
|
@@ -396,7 +396,7 @@ export class Client extends TypedEventEmitter<IClientEvents> {
|
|
|
396
396
|
): void {
|
|
397
397
|
let localInserts = 0;
|
|
398
398
|
let localRemoves = 0;
|
|
399
|
-
walkAllChildSegments(this._mergeTree.root, (seg) => {
|
|
399
|
+
walkAllChildSegments(this._mergeTree.root, (seg: ISegmentLeaf) => {
|
|
400
400
|
if (seg.seq === UnassignedSequenceNumber) {
|
|
401
401
|
localInserts++;
|
|
402
402
|
}
|
package/src/endOfTreeSegment.ts
CHANGED
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
|
|
8
8
|
import { LocalClientId } from "./constants.js";
|
|
9
|
+
// eslint-disable-next-line import/no-deprecated
|
|
9
10
|
import { LocalReferenceCollection } from "./localReference.js";
|
|
10
11
|
import { MergeTree } from "./mergeTree.js";
|
|
11
12
|
import { NodeAction, depthFirstNodeWalk } from "./mergeTreeNodeWalk.js";
|
|
12
|
-
|
|
13
|
+
// eslint-disable-next-line import/no-deprecated
|
|
14
|
+
import { ISegment, ISegmentLeaf, type MergeBlock } from "./mergeTreeNodes.js";
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
17
|
* This is a special segment that is not bound or known by the merge tree itself,
|
|
@@ -71,6 +73,7 @@ abstract class BaseEndpointSegment {
|
|
|
71
73
|
|
|
72
74
|
abstract get ordinal(): string;
|
|
73
75
|
|
|
76
|
+
// eslint-disable-next-line import/no-deprecated
|
|
74
77
|
localRefs?: LocalReferenceCollection;
|
|
75
78
|
|
|
76
79
|
/*
|
|
@@ -99,7 +102,7 @@ const notSupported = (): never => {
|
|
|
99
102
|
/**
|
|
100
103
|
* The position immediately prior to the start of the tree
|
|
101
104
|
*/
|
|
102
|
-
export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment
|
|
105
|
+
export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment {
|
|
103
106
|
type: string = "StartOfTreeSegment";
|
|
104
107
|
readonly endpointType = "start";
|
|
105
108
|
|
|
@@ -149,7 +152,7 @@ export class StartOfTreeSegment extends BaseEndpointSegment implements ISegment,
|
|
|
149
152
|
/**
|
|
150
153
|
* The position immediately after the end of the tree
|
|
151
154
|
*/
|
|
152
|
-
export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment
|
|
155
|
+
export class EndOfTreeSegment extends BaseEndpointSegment implements ISegment {
|
|
153
156
|
type: string = "EndOfTreeSegment";
|
|
154
157
|
readonly endpointType = "end";
|
|
155
158
|
|
package/src/index.ts
CHANGED
package/src/localReference.ts
CHANGED
|
@@ -228,6 +228,7 @@ export function setValidateRefCount(
|
|
|
228
228
|
*
|
|
229
229
|
* @legacy
|
|
230
230
|
* @alpha
|
|
231
|
+
* @deprecated - This class will be removed in 2.20 with no replacement.
|
|
231
232
|
*/
|
|
232
233
|
export class LocalReferenceCollection {
|
|
233
234
|
public static append(seg1: ISegment, seg2: ISegment): void {
|
package/src/mergeTree.ts
CHANGED
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from "./constants.js";
|
|
21
21
|
import { EndOfTreeSegment, StartOfTreeSegment } from "./endOfTreeSegment.js";
|
|
22
22
|
import {
|
|
23
|
+
// eslint-disable-next-line import/no-deprecated
|
|
23
24
|
LocalReferenceCollection,
|
|
24
25
|
LocalReferencePosition,
|
|
25
26
|
SlidingPreference,
|
|
@@ -46,7 +47,9 @@ import {
|
|
|
46
47
|
// eslint-disable-next-line import/no-deprecated
|
|
47
48
|
CollaborationWindow,
|
|
48
49
|
IMergeNode,
|
|
50
|
+
// eslint-disable-next-line import/no-deprecated
|
|
49
51
|
IMoveInfo,
|
|
52
|
+
// eslint-disable-next-line import/no-deprecated
|
|
50
53
|
IRemovalInfo,
|
|
51
54
|
ISegmentAction,
|
|
52
55
|
ISegmentChanges,
|
|
@@ -100,6 +103,7 @@ import { Side, type InteriorSequencePlace } from "./sequencePlace.js";
|
|
|
100
103
|
import { SortedSegmentSet } from "./sortedSegmentSet.js";
|
|
101
104
|
import { zamboniSegments } from "./zamboni.js";
|
|
102
105
|
|
|
106
|
+
// eslint-disable-next-line import/no-deprecated
|
|
103
107
|
function markSegmentMoved(seg: ISegmentLeaf, moveInfo: IMoveInfo): void {
|
|
104
108
|
seg.moveDst = moveInfo.moveDst;
|
|
105
109
|
seg.movedClientIds = [...moveInfo.movedClientIds];
|
|
@@ -109,19 +113,23 @@ function markSegmentMoved(seg: ISegmentLeaf, moveInfo: IMoveInfo): void {
|
|
|
109
113
|
seg.wasMovedOnInsert = moveInfo.wasMovedOnInsert;
|
|
110
114
|
}
|
|
111
115
|
|
|
116
|
+
// eslint-disable-next-line import/no-deprecated
|
|
112
117
|
function isMoved(segment: ISegmentLeaf): segment is ISegmentLeaf & IMoveInfo {
|
|
113
118
|
return toMoveInfo(segment) !== undefined;
|
|
114
119
|
}
|
|
115
120
|
|
|
121
|
+
// eslint-disable-next-line import/no-deprecated
|
|
116
122
|
function isRemoved(segment: ISegmentLeaf): segment is ISegmentLeaf & IRemovalInfo {
|
|
117
123
|
return toRemovalInfo(segment) !== undefined;
|
|
118
124
|
}
|
|
119
125
|
|
|
126
|
+
// eslint-disable-next-line import/no-deprecated
|
|
120
127
|
function isRemovedAndAcked(segment: ISegmentLeaf): segment is ISegmentLeaf & IRemovalInfo {
|
|
121
128
|
const removalInfo = toRemovalInfo(segment);
|
|
122
129
|
return removalInfo !== undefined && removalInfo.removedSeq !== UnassignedSequenceNumber;
|
|
123
130
|
}
|
|
124
131
|
|
|
132
|
+
// eslint-disable-next-line import/no-deprecated
|
|
125
133
|
function isMovedAndAcked(segment: ISegmentLeaf): segment is ISegmentLeaf & IMoveInfo {
|
|
126
134
|
const moveInfo = toMoveInfo(segment);
|
|
127
135
|
return moveInfo !== undefined && moveInfo.movedSeq !== UnassignedSequenceNumber;
|
|
@@ -180,6 +188,7 @@ function ackSegment(
|
|
|
180
188
|
}
|
|
181
189
|
|
|
182
190
|
case MergeTreeDeltaType.REMOVE: {
|
|
191
|
+
// eslint-disable-next-line import/no-deprecated
|
|
183
192
|
const removalInfo: IRemovalInfo | undefined = toRemovalInfo(segment);
|
|
184
193
|
assert(removalInfo !== undefined, 0x046 /* "On remove ack, missing removal info!" */);
|
|
185
194
|
segment.localRemovedSeq = undefined;
|
|
@@ -192,6 +201,7 @@ function ackSegment(
|
|
|
192
201
|
|
|
193
202
|
case MergeTreeDeltaType.OBLITERATE:
|
|
194
203
|
case MergeTreeDeltaType.OBLITERATE_SIDED: {
|
|
204
|
+
// eslint-disable-next-line import/no-deprecated
|
|
195
205
|
const moveInfo: IMoveInfo | undefined = toMoveInfo(segment);
|
|
196
206
|
assert(moveInfo !== undefined, 0x86e /* On obliterate ack, missing move info! */);
|
|
197
207
|
const obliterateInfo = segmentGroup.obliterateInfo;
|
|
@@ -877,7 +887,9 @@ export class MergeTree {
|
|
|
877
887
|
*/
|
|
878
888
|
private slideAckedRemovedSegmentReferences(segments: ISegmentLeaf[]): void {
|
|
879
889
|
// References are slid in groups to preserve their order.
|
|
890
|
+
// eslint-disable-next-line import/no-deprecated
|
|
880
891
|
let currentForwardSlideGroup: LocalReferenceCollection[] = [];
|
|
892
|
+
// eslint-disable-next-line import/no-deprecated
|
|
881
893
|
let currentBackwardSlideGroup: LocalReferenceCollection[] = [];
|
|
882
894
|
|
|
883
895
|
let currentForwardMaybeEndpoint: "start" | "end" | undefined;
|
|
@@ -891,6 +903,7 @@ export class MergeTree {
|
|
|
891
903
|
const slideGroup = (
|
|
892
904
|
currentSlideDestination: ISegmentLeaf | undefined,
|
|
893
905
|
currentSlideIsForward: boolean | undefined,
|
|
906
|
+
// eslint-disable-next-line import/no-deprecated
|
|
894
907
|
currentSlideGroup: LocalReferenceCollection[],
|
|
895
908
|
pred: (ref: LocalReferencePosition) => boolean,
|
|
896
909
|
maybeEndpoint: "start" | "end" | undefined,
|
|
@@ -915,6 +928,7 @@ export class MergeTree {
|
|
|
915
928
|
|
|
916
929
|
if (maybeEndpoint) {
|
|
917
930
|
const endpoint = maybeEndpoint === "start" ? this.startOfTree : this.endOfTree;
|
|
931
|
+
// eslint-disable-next-line import/no-deprecated
|
|
918
932
|
const localRefs = LocalReferenceCollection.setOrGet(endpoint);
|
|
919
933
|
if (currentSlideIsForward) {
|
|
920
934
|
localRefs.addBeforeTombstones(...endpointRefsToAdd);
|
|
@@ -934,6 +948,7 @@ export class MergeTree {
|
|
|
934
948
|
}
|
|
935
949
|
}
|
|
936
950
|
} else {
|
|
951
|
+
// eslint-disable-next-line import/no-deprecated
|
|
937
952
|
const localRefs = LocalReferenceCollection.setOrGet(currentSlideDestination);
|
|
938
953
|
if (currentSlideIsForward) {
|
|
939
954
|
localRefs.addBeforeTombstones(...nonEndpointRefsToAdd);
|
|
@@ -947,11 +962,13 @@ export class MergeTree {
|
|
|
947
962
|
segment: ISegmentLeaf,
|
|
948
963
|
currentSlideDestination: ISegmentLeaf | undefined,
|
|
949
964
|
currentSlideIsForward: boolean | undefined,
|
|
965
|
+
// eslint-disable-next-line import/no-deprecated
|
|
950
966
|
currentSlideGroup: LocalReferenceCollection[],
|
|
951
967
|
pred: (ref: LocalReferencePosition) => boolean,
|
|
952
968
|
slidingPreference: SlidingPreference,
|
|
953
969
|
currentMaybeEndpoint: "start" | "end" | undefined,
|
|
954
970
|
reassign: (
|
|
971
|
+
// eslint-disable-next-line import/no-deprecated
|
|
955
972
|
localRefs: LocalReferenceCollection,
|
|
956
973
|
slideToSegment: ISegmentLeaf | undefined,
|
|
957
974
|
slideIsForward: boolean,
|
|
@@ -1649,6 +1666,7 @@ export class MergeTree {
|
|
|
1649
1666
|
}
|
|
1650
1667
|
|
|
1651
1668
|
if (oldest && newest?.clientId !== clientId) {
|
|
1669
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1652
1670
|
const moveInfo: IMoveInfo = {
|
|
1653
1671
|
movedClientIds,
|
|
1654
1672
|
movedSeq: oldest.seq,
|
|
@@ -2510,6 +2528,7 @@ export class MergeTree {
|
|
|
2510
2528
|
segment = _segment;
|
|
2511
2529
|
}
|
|
2512
2530
|
|
|
2531
|
+
// eslint-disable-next-line import/no-deprecated
|
|
2513
2532
|
const localRefs = LocalReferenceCollection.setOrGet(segment);
|
|
2514
2533
|
|
|
2515
2534
|
const segRef = localRefs.createLocalRef(
|
package/src/mergeTreeNodeWalk.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { type MergeBlock, IMergeNode
|
|
6
|
+
import { type ISegmentLeaf, type MergeBlock, IMergeNode } from "./mergeTreeNodes.js";
|
|
7
7
|
|
|
8
8
|
export const LeafAction = {
|
|
9
9
|
Exit: false,
|
|
@@ -38,7 +38,7 @@ export function depthFirstNodeWalk(
|
|
|
38
38
|
startBlock: MergeBlock,
|
|
39
39
|
startChild: IMergeNode | undefined,
|
|
40
40
|
downAction?: (node: IMergeNode) => NodeAction,
|
|
41
|
-
leafActionOverride?: (seg:
|
|
41
|
+
leafActionOverride?: (seg: ISegmentLeaf) => LeafAction,
|
|
42
42
|
upAction?: (block: MergeBlock) => void,
|
|
43
43
|
forward: boolean = true,
|
|
44
44
|
): boolean {
|
|
@@ -77,7 +77,7 @@ export function depthFirstNodeWalk(
|
|
|
77
77
|
for (let i = start.index; i !== -1 && i !== childCount; i += increment) {
|
|
78
78
|
// the above loop ensures start is a leaf or undefined, so all children
|
|
79
79
|
// will be leaves if start exits, so the cast is safe
|
|
80
|
-
if (leafAction(block.children[i] as
|
|
80
|
+
if (leafAction(block.children[i] as ISegmentLeaf) === LeafAction.Exit) {
|
|
81
81
|
exit = true;
|
|
82
82
|
break;
|
|
83
83
|
}
|
|
@@ -122,7 +122,7 @@ export function depthFirstNodeWalk(
|
|
|
122
122
|
*/
|
|
123
123
|
export function forwardExcursion(
|
|
124
124
|
startNode: IMergeNode,
|
|
125
|
-
leafAction: (seg:
|
|
125
|
+
leafAction: (seg: ISegmentLeaf) => boolean | undefined,
|
|
126
126
|
): boolean {
|
|
127
127
|
if (startNode.parent === undefined) {
|
|
128
128
|
return true;
|
|
@@ -145,7 +145,7 @@ export function forwardExcursion(
|
|
|
145
145
|
*/
|
|
146
146
|
export function backwardExcursion(
|
|
147
147
|
startNode: IMergeNode,
|
|
148
|
-
leafAction: (seg:
|
|
148
|
+
leafAction: (seg: ISegmentLeaf) => boolean | undefined,
|
|
149
149
|
): boolean {
|
|
150
150
|
if (startNode.parent === undefined) {
|
|
151
151
|
return true;
|
|
@@ -171,7 +171,7 @@ export function backwardExcursion(
|
|
|
171
171
|
*/
|
|
172
172
|
export function walkAllChildSegments(
|
|
173
173
|
startBlock: MergeBlock,
|
|
174
|
-
leafAction: (segment:
|
|
174
|
+
leafAction: (segment: ISegmentLeaf) => boolean | undefined | void,
|
|
175
175
|
): boolean {
|
|
176
176
|
if (startBlock.childCount === 0) {
|
|
177
177
|
return true;
|
package/src/mergeTreeNodes.ts
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
UnassignedSequenceNumber,
|
|
15
15
|
UniversalSequenceNumber,
|
|
16
16
|
} from "./constants.js";
|
|
17
|
+
// eslint-disable-next-line import/no-deprecated
|
|
17
18
|
import { LocalReferenceCollection, type LocalReferencePosition } from "./localReference.js";
|
|
18
19
|
import { TrackingGroupCollection } from "./mergeTreeTracking.js";
|
|
19
20
|
import { IJSONSegment, IMarkerDef, ReferenceType } from "./ops.js";
|
|
@@ -34,6 +35,7 @@ import { PropertiesManager } from "./segmentPropertiesManager.js";
|
|
|
34
35
|
* Common properties for a node in a merge tree.
|
|
35
36
|
* @legacy
|
|
36
37
|
* @alpha
|
|
38
|
+
* @deprecated - This interface will be removed in 2.20 with no replacement.
|
|
37
39
|
*/
|
|
38
40
|
export interface IMergeNodeCommon {
|
|
39
41
|
/**
|
|
@@ -58,9 +60,13 @@ export interface IMergeNodeCommon {
|
|
|
58
60
|
*
|
|
59
61
|
* @internal
|
|
60
62
|
*/
|
|
61
|
-
export type ISegmentInternal = ISegment &
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
export type ISegmentInternal = Omit<ISegment, keyof IRemovalInfo | keyof IMoveInfo> &
|
|
64
|
+
Partial<IMergeNodeCommon> &
|
|
65
|
+
Partial<IRemovalInfo> &
|
|
66
|
+
Partial<IMoveInfo> & {
|
|
67
|
+
// eslint-disable-next-line import/no-deprecated
|
|
68
|
+
localRefs?: LocalReferenceCollection;
|
|
69
|
+
};
|
|
64
70
|
|
|
65
71
|
/**
|
|
66
72
|
* We use tiered interface to control visibility of segment properties.
|
|
@@ -89,6 +95,7 @@ export type IMergeNode = MergeBlock | ISegmentLeaf;
|
|
|
89
95
|
* Contains removal information associated to an {@link ISegment}.
|
|
90
96
|
* @legacy
|
|
91
97
|
* @alpha
|
|
98
|
+
* @deprecated - This interface will be removed in 2.20 with no replacement.
|
|
92
99
|
*/
|
|
93
100
|
export interface IRemovalInfo {
|
|
94
101
|
/**
|
|
@@ -133,6 +140,7 @@ export function toRemovalInfo(
|
|
|
133
140
|
* in the future, when moves _are_ supported.
|
|
134
141
|
* @legacy
|
|
135
142
|
* @alpha
|
|
143
|
+
* @deprecated - This interface will be removed in 2.20 with no replacement.
|
|
136
144
|
*/
|
|
137
145
|
export interface IMoveInfo {
|
|
138
146
|
/**
|
|
@@ -211,7 +219,7 @@ export function toMoveInfo(maybe: Partial<IMoveInfo> | undefined): IMoveInfo | u
|
|
|
211
219
|
* @legacy
|
|
212
220
|
* @alpha
|
|
213
221
|
*/
|
|
214
|
-
export interface ISegment
|
|
222
|
+
export interface ISegment {
|
|
215
223
|
readonly type: string;
|
|
216
224
|
|
|
217
225
|
readonly trackingCollection: TrackingGroupCollection;
|
|
@@ -223,6 +231,7 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
|
|
|
223
231
|
* after the tree. These segments cannot be referenced by regular operations
|
|
224
232
|
* and exist primarily as a bucket for local references to slide onto during
|
|
225
233
|
* deletion of regular segments.
|
|
234
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
226
235
|
*/
|
|
227
236
|
readonly endpointType?: "start" | "end";
|
|
228
237
|
|
|
@@ -254,6 +263,7 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
|
|
|
254
263
|
*
|
|
255
264
|
* @privateRemarks
|
|
256
265
|
* See {@link CollaborationWindow.localSeq} for more information on the semantics of localSeq.
|
|
266
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
257
267
|
*/
|
|
258
268
|
localSeq?: number;
|
|
259
269
|
/**
|
|
@@ -265,20 +275,25 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
|
|
|
265
275
|
*
|
|
266
276
|
* @privateRemarks
|
|
267
277
|
* See {@link CollaborationWindow.localSeq} for more information on the semantics of localSeq.
|
|
278
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
268
279
|
*/
|
|
269
280
|
localRemovedSeq?: number;
|
|
270
281
|
/**
|
|
271
282
|
* Seq at which this segment was inserted.
|
|
272
283
|
* If undefined, it is assumed the segment was inserted prior to the collab window's minimum sequence number.
|
|
284
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
273
285
|
*/
|
|
274
286
|
seq?: number;
|
|
275
287
|
/**
|
|
276
288
|
* Short clientId for the client that inserted this segment.
|
|
289
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
277
290
|
*/
|
|
278
291
|
clientId: number;
|
|
279
292
|
/**
|
|
280
293
|
* Local references added to this segment.
|
|
294
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
281
295
|
*/
|
|
296
|
+
// eslint-disable-next-line import/no-deprecated
|
|
282
297
|
localRefs?: LocalReferenceCollection;
|
|
283
298
|
/**
|
|
284
299
|
* Properties that have been added to this segment via annotation.
|
|
@@ -292,6 +307,70 @@ export interface ISegment extends IMergeNodeCommon, Partial<IRemovalInfo>, Parti
|
|
|
292
307
|
// Changing this to something other than any would break consumers.
|
|
293
308
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
294
309
|
toJSONObject(): any;
|
|
310
|
+
isLeaf(): this is ISegment;
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* {@inheritDoc @fluidframework/merge-tree#IMergeNodeCommon.index}
|
|
314
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
315
|
+
*/
|
|
316
|
+
index: number;
|
|
317
|
+
/**
|
|
318
|
+
* {@inheritDoc @fluidframework/merge-tree#IMergeNodeCommon.ordinal}
|
|
319
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
320
|
+
*/
|
|
321
|
+
ordinal: string;
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* {@inheritDoc @fluidframework/merge-tree#IRemovalInfo.removedSeq}
|
|
325
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
326
|
+
*/
|
|
327
|
+
removedSeq?: number;
|
|
328
|
+
/**
|
|
329
|
+
* {@inheritDoc @fluidframework/merge-tree#IRemovalInfo.removedClientIds}
|
|
330
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
331
|
+
*/
|
|
332
|
+
removedClientIds?: number[];
|
|
333
|
+
/**
|
|
334
|
+
* {@inheritDoc @fluidframework/merge-tree#IMoveInfo.localMovedSeq}
|
|
335
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
336
|
+
*/
|
|
337
|
+
localMovedSeq?: number;
|
|
338
|
+
/**
|
|
339
|
+
* {@inheritDoc @fluidframework/merge-tree#IMoveInfo.movedSeq}
|
|
340
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
341
|
+
*/
|
|
342
|
+
movedSeq?: number;
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* {@inheritDoc @fluidframework/merge-tree#IMoveInfo.movedSeqs}
|
|
346
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
347
|
+
*/
|
|
348
|
+
movedSeqs?: number[];
|
|
349
|
+
/**
|
|
350
|
+
* {@inheritDoc @fluidframework/merge-tree#IMoveInfo.moveDst}
|
|
351
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
352
|
+
*/
|
|
353
|
+
moveDst?: ReferencePosition;
|
|
354
|
+
/**
|
|
355
|
+
* {@inheritDoc @fluidframework/merge-tree#IMoveInfo.movedClientIds}
|
|
356
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
357
|
+
*/
|
|
358
|
+
movedClientIds?: number[];
|
|
359
|
+
/**
|
|
360
|
+
* {@inheritDoc @fluidframework/merge-tree#IMoveInfo.wasMovedOnInsert}
|
|
361
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
362
|
+
*/
|
|
363
|
+
wasMovedOnInsert?: boolean;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Determine if a segment has been removed.
|
|
368
|
+
* @legacy
|
|
369
|
+
* @alpha
|
|
370
|
+
*/
|
|
371
|
+
export function segmentIsRemoved(segment: ISegment): boolean {
|
|
372
|
+
const leaf: ISegmentLeaf = segment;
|
|
373
|
+
return leaf.removedSeq !== undefined;
|
|
295
374
|
}
|
|
296
375
|
|
|
297
376
|
/**
|
|
@@ -322,8 +401,8 @@ export interface ISegmentAction<TClientData> {
|
|
|
322
401
|
* @internal
|
|
323
402
|
*/
|
|
324
403
|
export interface ISegmentChanges {
|
|
325
|
-
next?:
|
|
326
|
-
replaceCurrent?:
|
|
404
|
+
next?: ISegmentInternal;
|
|
405
|
+
replaceCurrent?: ISegmentInternal;
|
|
327
406
|
}
|
|
328
407
|
/**
|
|
329
408
|
* @internal
|
|
@@ -361,8 +440,12 @@ export interface NodeAction<TClientData> {
|
|
|
361
440
|
* @internal
|
|
362
441
|
*/
|
|
363
442
|
export interface InsertContext {
|
|
364
|
-
candidateSegment?:
|
|
365
|
-
leaf: (
|
|
443
|
+
candidateSegment?: ISegmentInternal;
|
|
444
|
+
leaf: (
|
|
445
|
+
segment: ISegmentInternal | undefined,
|
|
446
|
+
pos: number,
|
|
447
|
+
ic: InsertContext,
|
|
448
|
+
) => ISegmentChanges;
|
|
366
449
|
continuePredicate?: (continueFromBlock: MergeBlock) => boolean;
|
|
367
450
|
}
|
|
368
451
|
|
|
@@ -433,7 +516,7 @@ export class MergeBlock implements IMergeNodeCommon {
|
|
|
433
516
|
*/
|
|
434
517
|
public leftmostTiles: Readonly<MapLike<Marker>>;
|
|
435
518
|
|
|
436
|
-
isLeaf(): this is
|
|
519
|
+
isLeaf(): this is ISegmentInternal {
|
|
437
520
|
return false;
|
|
438
521
|
}
|
|
439
522
|
|
|
@@ -490,15 +573,45 @@ export function seqLTE(seq: number, minOrRefSeq: number): boolean {
|
|
|
490
573
|
* @alpha
|
|
491
574
|
*/
|
|
492
575
|
export abstract class BaseSegment implements ISegment {
|
|
576
|
+
/**
|
|
577
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
578
|
+
*/
|
|
493
579
|
public clientId: number = LocalClientId;
|
|
580
|
+
/**
|
|
581
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
582
|
+
*/
|
|
494
583
|
public seq: number = UniversalSequenceNumber;
|
|
584
|
+
/**
|
|
585
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
586
|
+
*/
|
|
495
587
|
public removedSeq?: number;
|
|
588
|
+
/**
|
|
589
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
590
|
+
*/
|
|
496
591
|
public removedClientIds?: number[];
|
|
592
|
+
/**
|
|
593
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
594
|
+
*/
|
|
497
595
|
public movedSeq?: number;
|
|
596
|
+
/**
|
|
597
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
598
|
+
*/
|
|
498
599
|
public movedSeqs?: number[];
|
|
600
|
+
/**
|
|
601
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
602
|
+
*/
|
|
499
603
|
public movedClientIds?: number[];
|
|
604
|
+
/**
|
|
605
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
606
|
+
*/
|
|
500
607
|
public wasMovedOnInsert?: boolean | undefined;
|
|
608
|
+
/**
|
|
609
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
610
|
+
*/
|
|
501
611
|
public index: number = 0;
|
|
612
|
+
/**
|
|
613
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
614
|
+
*/
|
|
502
615
|
public ordinal: string = "";
|
|
503
616
|
public cachedLength: number = 0;
|
|
504
617
|
|
|
@@ -509,10 +622,23 @@ export abstract class BaseSegment implements ISegment {
|
|
|
509
622
|
public attribution?: IAttributionCollection<AttributionKey>;
|
|
510
623
|
|
|
511
624
|
public properties?: PropertySet;
|
|
625
|
+
/**
|
|
626
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
627
|
+
*/
|
|
628
|
+
// eslint-disable-next-line import/no-deprecated
|
|
512
629
|
public localRefs?: LocalReferenceCollection;
|
|
513
630
|
public abstract readonly type: string;
|
|
631
|
+
/**
|
|
632
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
633
|
+
*/
|
|
514
634
|
public localSeq?: number;
|
|
635
|
+
/**
|
|
636
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
637
|
+
*/
|
|
515
638
|
public localRemovedSeq?: number;
|
|
639
|
+
/**
|
|
640
|
+
* @deprecated - This property will be removed in 2.20 with no replacement.
|
|
641
|
+
*/
|
|
516
642
|
public localMovedSeq?: number;
|
|
517
643
|
|
|
518
644
|
public constructor(properties?: PropertySet) {
|
|
@@ -606,6 +732,7 @@ export abstract class BaseSegment implements ISegment {
|
|
|
606
732
|
public append(other: ISegment): void {
|
|
607
733
|
// Note: Must call 'appendLocalRefs' before modifying this segment's length as
|
|
608
734
|
// 'this.cachedLength' is used to adjust the offsets of the local refs.
|
|
735
|
+
// eslint-disable-next-line import/no-deprecated
|
|
609
736
|
LocalReferenceCollection.append(this, other);
|
|
610
737
|
if (this.attribution) {
|
|
611
738
|
assert(
|
package/src/partialLengths.ts
CHANGED
|
@@ -12,9 +12,11 @@ import {
|
|
|
12
12
|
// eslint-disable-next-line import/no-deprecated
|
|
13
13
|
CollaborationWindow,
|
|
14
14
|
IMergeNode,
|
|
15
|
+
// eslint-disable-next-line import/no-deprecated
|
|
15
16
|
IMoveInfo,
|
|
17
|
+
// eslint-disable-next-line import/no-deprecated
|
|
16
18
|
IRemovalInfo,
|
|
17
|
-
|
|
19
|
+
ISegmentLeaf,
|
|
18
20
|
compareNumbers,
|
|
19
21
|
seqLTE,
|
|
20
22
|
toMoveInfo,
|
|
@@ -504,7 +506,7 @@ export class PartialSequenceLengths {
|
|
|
504
506
|
*/
|
|
505
507
|
static accumulateMoveOverlapForExisting(
|
|
506
508
|
segmentLen: number,
|
|
507
|
-
segment:
|
|
509
|
+
segment: ISegmentLeaf,
|
|
508
510
|
firstGte: PartialSequenceLength,
|
|
509
511
|
clientIds: number[],
|
|
510
512
|
): void {
|
|
@@ -537,7 +539,7 @@ export class PartialSequenceLengths {
|
|
|
537
539
|
* segment
|
|
538
540
|
*/
|
|
539
541
|
private static getMoveOverlapForExisting(
|
|
540
|
-
segment:
|
|
542
|
+
segment: ISegmentLeaf,
|
|
541
543
|
obliterateOverlapLen: number,
|
|
542
544
|
clientIds: number[],
|
|
543
545
|
): RedBlackTree<number, IOverlapClient> {
|
|
@@ -558,7 +560,7 @@ export class PartialSequenceLengths {
|
|
|
558
560
|
}
|
|
559
561
|
|
|
560
562
|
private static updatePartialsAfterInsertion(
|
|
561
|
-
segment:
|
|
563
|
+
segment: ISegmentLeaf,
|
|
562
564
|
segmentLen: number,
|
|
563
565
|
remoteObliteratedLen: number | undefined,
|
|
564
566
|
obliterateOverlapLen: number = segmentLen,
|
|
@@ -638,8 +640,10 @@ export class PartialSequenceLengths {
|
|
|
638
640
|
*/
|
|
639
641
|
private static insertSegment(
|
|
640
642
|
combinedPartialLengths: PartialSequenceLengths,
|
|
641
|
-
segment:
|
|
643
|
+
segment: ISegmentLeaf,
|
|
644
|
+
// eslint-disable-next-line import/no-deprecated
|
|
642
645
|
removalInfo?: IRemovalInfo,
|
|
646
|
+
// eslint-disable-next-line import/no-deprecated
|
|
643
647
|
moveInfo?: IMoveInfo,
|
|
644
648
|
): void {
|
|
645
649
|
const removalIsLocal =
|
package/src/perspective.ts
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
import { UnassignedSequenceNumber } from "./constants.js";
|
|
7
7
|
import { type MergeTree } from "./mergeTree.js";
|
|
8
8
|
import { LeafAction, backwardExcursion, forwardExcursion } from "./mergeTreeNodeWalk.js";
|
|
9
|
-
import { seqLTE, type
|
|
9
|
+
import { seqLTE, type ISegmentLeaf } from "./mergeTreeNodes.js";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Provides a view of a MergeTree from the perspective of a specific client at a specific sequence number.
|
|
13
13
|
*/
|
|
14
14
|
export interface Perspective {
|
|
15
|
-
nextSegment(segment:
|
|
16
|
-
previousSegment(segment:
|
|
15
|
+
nextSegment(segment: ISegmentLeaf, forward?: boolean): ISegmentLeaf;
|
|
16
|
+
previousSegment(segment: ISegmentLeaf): ISegmentLeaf;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -47,9 +47,9 @@ export class PerspectiveImpl implements Perspective {
|
|
|
47
47
|
* @param forward - The direction to search.
|
|
48
48
|
* @returns the next segment in the specified direction, or the start or end of the tree if there is no next segment.
|
|
49
49
|
*/
|
|
50
|
-
public nextSegment(segment:
|
|
51
|
-
let next:
|
|
52
|
-
const action = (seg:
|
|
50
|
+
public nextSegment(segment: ISegmentLeaf, forward: boolean = true): ISegmentLeaf {
|
|
51
|
+
let next: ISegmentLeaf | undefined;
|
|
52
|
+
const action = (seg: ISegmentLeaf): boolean | undefined => {
|
|
53
53
|
if (isSegmentPresent(seg, this._seqTime)) {
|
|
54
54
|
next = seg;
|
|
55
55
|
return LeafAction.Exit;
|
|
@@ -65,7 +65,7 @@ export class PerspectiveImpl implements Perspective {
|
|
|
65
65
|
* @returns the previous segment, or the start of the tree if there is no previous segment.
|
|
66
66
|
* @remarks This is a convenient equivalent to calling `nextSegment(segment, false)`.
|
|
67
67
|
*/
|
|
68
|
-
public previousSegment(segment:
|
|
68
|
+
public previousSegment(segment: ISegmentLeaf): ISegmentLeaf {
|
|
69
69
|
return this.nextSegment(segment, false);
|
|
70
70
|
}
|
|
71
71
|
}
|
|
@@ -77,7 +77,7 @@ export class PerspectiveImpl implements Perspective {
|
|
|
77
77
|
* @param localSeq - The latest local sequence number to consider.
|
|
78
78
|
* @returns true iff this segment was removed in the given perspective.
|
|
79
79
|
*/
|
|
80
|
-
export function wasRemovedBefore(seg:
|
|
80
|
+
export function wasRemovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime): boolean {
|
|
81
81
|
if (
|
|
82
82
|
seg.removedSeq === UnassignedSequenceNumber &&
|
|
83
83
|
localSeq !== undefined &&
|
|
@@ -95,7 +95,7 @@ export function wasRemovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime):
|
|
|
95
95
|
* @param localSeq - The latest local sequence number to consider.
|
|
96
96
|
* @returns true iff this segment was moved (aka obliterated) in the given perspective.
|
|
97
97
|
*/
|
|
98
|
-
export function wasMovedBefore(seg:
|
|
98
|
+
export function wasMovedBefore(seg: ISegmentLeaf, { refSeq, localSeq }: SeqTime): boolean {
|
|
99
99
|
if (
|
|
100
100
|
seg.movedSeq === UnassignedSequenceNumber &&
|
|
101
101
|
localSeq !== undefined &&
|
|
@@ -109,7 +109,7 @@ export function wasMovedBefore(seg: ISegment, { refSeq, localSeq }: SeqTime): bo
|
|
|
109
109
|
/**
|
|
110
110
|
* See {@link wasRemovedBefore} and {@link wasMovedBefore}.
|
|
111
111
|
*/
|
|
112
|
-
export function wasRemovedOrMovedBefore(seg:
|
|
112
|
+
export function wasRemovedOrMovedBefore(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
|
|
113
113
|
return wasRemovedBefore(seg, seqTime) || wasMovedBefore(seg, seqTime);
|
|
114
114
|
}
|
|
115
115
|
|
|
@@ -120,7 +120,7 @@ export function wasRemovedOrMovedBefore(seg: ISegment, seqTime: SeqTime): boolea
|
|
|
120
120
|
* @returns true iff this segment was inserted before the given perspective,
|
|
121
121
|
* and it was not removed or moved in the given perspective.
|
|
122
122
|
*/
|
|
123
|
-
export function isSegmentPresent(seg:
|
|
123
|
+
export function isSegmentPresent(seg: ISegmentLeaf, seqTime: SeqTime): boolean {
|
|
124
124
|
const { refSeq, localSeq } = seqTime;
|
|
125
125
|
// If seg.seq is undefined, then this segment has existed since minSeq.
|
|
126
126
|
// It may have been moved or removed since.
|