@fluidframework/sequence 2.0.0-internal.5.1.0 → 2.0.0-internal.5.2.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 +16 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +9 -19
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +11 -102
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +8 -0
- package/dist/intervalIndex/index.d.ts.map +1 -0
- package/dist/intervalIndex/index.js +12 -0
- package/dist/intervalIndex/index.js.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.js +103 -0
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +33 -0
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.js +7 -0
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/intervalCollection.d.ts +9 -19
- package/lib/intervalCollection.d.ts.map +1 -1
- package/lib/intervalCollection.js +10 -102
- package/lib/intervalCollection.js.map +1 -1
- package/lib/intervalIndex/index.d.ts +8 -0
- package/lib/intervalIndex/index.d.ts.map +1 -0
- package/lib/intervalIndex/index.js +7 -0
- package/lib/intervalIndex/index.js.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.js +98 -0
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +29 -0
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.js +6 -0
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/package.json +16 -16
- package/src/index.ts +6 -0
- package/src/intervalCollection.ts +16 -139
- package/src/intervalIndex/index.ts +11 -0
- package/src/intervalIndex/overlappingIntervalsIndex.ts +166 -0
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +71 -0
- package/src/intervalIndex/sequenceIntervalIndexes.ts +32 -0
- package/src/packageVersion.ts +1 -1
|
@@ -19,7 +19,7 @@ import { UsageError } from "@fluidframework/container-utils";
|
|
|
19
19
|
import { addProperties, compareReferencePositions, createMap, MergeTreeDeltaType, minReferencePosition, PropertiesManager, RedBlackTree, ReferenceType, refTypeIncludesFlag, reservedRangeLabelsKey, UnassignedSequenceNumber, maxReferencePosition, createDetachedLocalReferencePosition, DetachedReferencePosition, SlidingPreference, } from "@fluidframework/merge-tree";
|
|
20
20
|
import { LoggingError } from "@fluidframework/telemetry-utils";
|
|
21
21
|
import { v4 as uuid } from "uuid";
|
|
22
|
-
import {
|
|
22
|
+
import { createOverlappingIntervalsIndex } from "./intervalIndex";
|
|
23
23
|
const reservedIntervalIdKey = "intervalId";
|
|
24
24
|
/**
|
|
25
25
|
* Values are used in persisted formats (ops) and revertibles.
|
|
@@ -498,7 +498,7 @@ export class SequenceInterval {
|
|
|
498
498
|
}
|
|
499
499
|
}
|
|
500
500
|
}
|
|
501
|
-
function createPositionReferenceFromSegoff(client, segoff, refType, op, localSeq, fromSnapshot, slidingPreference) {
|
|
501
|
+
export function createPositionReferenceFromSegoff(client, segoff, refType, op, localSeq, fromSnapshot, slidingPreference) {
|
|
502
502
|
if (segoff.segment) {
|
|
503
503
|
const ref = client.createLocalReferencePosition(segoff.segment, segoff.offset, refType, undefined, slidingPreference);
|
|
504
504
|
return ref;
|
|
@@ -574,98 +574,6 @@ export function createIntervalIndex() {
|
|
|
574
574
|
const lc = new LocalIntervalCollection(undefined, "", helpers);
|
|
575
575
|
return lc;
|
|
576
576
|
}
|
|
577
|
-
class OverlappingIntervalsIndex {
|
|
578
|
-
constructor(client, helpers) {
|
|
579
|
-
this.client = client;
|
|
580
|
-
this.helpers = helpers;
|
|
581
|
-
this.intervalTree = new IntervalTree();
|
|
582
|
-
}
|
|
583
|
-
map(fn) {
|
|
584
|
-
this.intervalTree.map(fn);
|
|
585
|
-
}
|
|
586
|
-
mapUntil(fn) {
|
|
587
|
-
this.intervalTree.mapUntil(fn);
|
|
588
|
-
}
|
|
589
|
-
gatherIterationResults(results, iteratesForward, start, end) {
|
|
590
|
-
if (this.intervalTree.intervals.isEmpty()) {
|
|
591
|
-
return;
|
|
592
|
-
}
|
|
593
|
-
if (start === undefined && end === undefined) {
|
|
594
|
-
// No start/end provided. Gather the whole tree in the specified order.
|
|
595
|
-
if (iteratesForward) {
|
|
596
|
-
this.intervalTree.map((interval) => {
|
|
597
|
-
results.push(interval);
|
|
598
|
-
});
|
|
599
|
-
}
|
|
600
|
-
else {
|
|
601
|
-
this.intervalTree.mapBackward((interval) => {
|
|
602
|
-
results.push(interval);
|
|
603
|
-
});
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
else {
|
|
607
|
-
const transientInterval = this.helpers.create("transient", start, end, this.client, IntervalType.Transient);
|
|
608
|
-
if (start === undefined) {
|
|
609
|
-
// Only end position provided. Since the tree is not sorted by end position,
|
|
610
|
-
// walk the whole tree in the specified order, gathering intervals that match the end.
|
|
611
|
-
if (iteratesForward) {
|
|
612
|
-
this.intervalTree.map((interval) => {
|
|
613
|
-
if (transientInterval.compareEnd(interval) === 0) {
|
|
614
|
-
results.push(interval);
|
|
615
|
-
}
|
|
616
|
-
});
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
this.intervalTree.mapBackward((interval) => {
|
|
620
|
-
if (transientInterval.compareEnd(interval) === 0) {
|
|
621
|
-
results.push(interval);
|
|
622
|
-
}
|
|
623
|
-
});
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
// Start and (possibly) end provided. Walk the subtrees that may contain
|
|
628
|
-
// this start position.
|
|
629
|
-
const compareFn = end === undefined
|
|
630
|
-
? (node) => {
|
|
631
|
-
return transientInterval.compareStart(node.key);
|
|
632
|
-
}
|
|
633
|
-
: (node) => {
|
|
634
|
-
return transientInterval.compare(node.key);
|
|
635
|
-
};
|
|
636
|
-
const continueLeftFn = (cmpResult) => cmpResult <= 0;
|
|
637
|
-
const continueRightFn = (cmpResult) => cmpResult >= 0;
|
|
638
|
-
const actionFn = (node) => {
|
|
639
|
-
results.push(node.key);
|
|
640
|
-
};
|
|
641
|
-
if (iteratesForward) {
|
|
642
|
-
this.intervalTree.intervals.walkExactMatchesForward(compareFn, actionFn, continueLeftFn, continueRightFn);
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
645
|
-
this.intervalTree.intervals.walkExactMatchesBackward(compareFn, actionFn, continueLeftFn, continueRightFn);
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
/**
|
|
651
|
-
* @returns an array of all intervals contained in this collection that overlap the range
|
|
652
|
-
* `[startPosition, endPosition)`.
|
|
653
|
-
*/
|
|
654
|
-
findOverlappingIntervals(startPosition, endPosition) {
|
|
655
|
-
if (endPosition < startPosition || this.intervalTree.intervals.isEmpty()) {
|
|
656
|
-
return [];
|
|
657
|
-
}
|
|
658
|
-
const transientInterval = this.helpers.create("transient", startPosition, endPosition, this.client, IntervalType.Transient);
|
|
659
|
-
const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
|
|
660
|
-
return overlappingIntervalNodes.map((node) => node.key);
|
|
661
|
-
}
|
|
662
|
-
remove(interval) {
|
|
663
|
-
this.intervalTree.removeExisting(interval);
|
|
664
|
-
}
|
|
665
|
-
add(interval) {
|
|
666
|
-
this.intervalTree.put(interval);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
577
|
class IdIntervalIndex {
|
|
670
578
|
constructor() {
|
|
671
579
|
this.intervalIdMap = new Map();
|
|
@@ -840,7 +748,7 @@ export class LocalIntervalCollection {
|
|
|
840
748
|
this.label = label;
|
|
841
749
|
this.helpers = helpers;
|
|
842
750
|
this.onPositionChange = onPositionChange;
|
|
843
|
-
this.overlappingIntervalsIndex =
|
|
751
|
+
this.overlappingIntervalsIndex = createOverlappingIntervalsIndex(client, helpers);
|
|
844
752
|
this.idIntervalIndex = new IdIntervalIndex();
|
|
845
753
|
this.endIntervalIndex = new EndpointIndex(client, helpers);
|
|
846
754
|
this.indexes = new Set([
|
|
@@ -1234,7 +1142,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1234
1142
|
}
|
|
1235
1143
|
});
|
|
1236
1144
|
}
|
|
1237
|
-
this.localCollection = new LocalIntervalCollection(client, label, this.helpers, (interval, previousInterval) => this.emitChange(interval, previousInterval, true));
|
|
1145
|
+
this.localCollection = new LocalIntervalCollection(client, label, this.helpers, (interval, previousInterval) => this.emitChange(interval, previousInterval, true, true));
|
|
1238
1146
|
if (this.savedSerializedIntervals) {
|
|
1239
1147
|
for (const serializedInterval of this.savedSerializedIntervals) {
|
|
1240
1148
|
this.localCollection.ensureSerializedId(serializedInterval);
|
|
@@ -1257,7 +1165,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1257
1165
|
}
|
|
1258
1166
|
return 0;
|
|
1259
1167
|
}
|
|
1260
|
-
emitChange(interval, previousInterval, local, op) {
|
|
1168
|
+
emitChange(interval, previousInterval, local, slide, op) {
|
|
1261
1169
|
// Temporarily make references transient so that positional queries work (non-transient refs
|
|
1262
1170
|
// on resolve to DetachedPosition on any segments that don't contain them). The original refType
|
|
1263
1171
|
// is restored as single-endpoint changes re-use previous references.
|
|
@@ -1268,12 +1176,12 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1268
1176
|
endRefType = previousInterval.end.refType;
|
|
1269
1177
|
previousInterval.start.refType = ReferenceType.Transient;
|
|
1270
1178
|
previousInterval.end.refType = ReferenceType.Transient;
|
|
1271
|
-
this.emit("changeInterval", interval, previousInterval, local, op);
|
|
1179
|
+
this.emit("changeInterval", interval, previousInterval, local, op, slide);
|
|
1272
1180
|
previousInterval.start.refType = startRefType;
|
|
1273
1181
|
previousInterval.end.refType = endRefType;
|
|
1274
1182
|
}
|
|
1275
1183
|
else {
|
|
1276
|
-
this.emit("changeInterval", interval, previousInterval, local, op);
|
|
1184
|
+
this.emit("changeInterval", interval, previousInterval, local, op, slide);
|
|
1277
1185
|
}
|
|
1278
1186
|
}
|
|
1279
1187
|
/**
|
|
@@ -1409,7 +1317,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1409
1317
|
this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
|
|
1410
1318
|
this.emitter.emit("change", undefined, serializedInterval, { localSeq });
|
|
1411
1319
|
this.addPendingChange(id, serializedInterval);
|
|
1412
|
-
this.emitChange(newInterval, interval, true);
|
|
1320
|
+
this.emitChange(newInterval, interval, true, false);
|
|
1413
1321
|
return newInterval;
|
|
1414
1322
|
}
|
|
1415
1323
|
// No interval to change
|
|
@@ -1517,7 +1425,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1517
1425
|
this.onDeserialize(newInterval);
|
|
1518
1426
|
}
|
|
1519
1427
|
if (newInterval !== interval) {
|
|
1520
|
-
this.emitChange(newInterval, interval, local, op);
|
|
1428
|
+
this.emitChange(newInterval, interval, local, false, op);
|
|
1521
1429
|
}
|
|
1522
1430
|
const changedProperties = Object.keys(newProps).length > 0;
|
|
1523
1431
|
if (changedProperties) {
|
|
@@ -1683,7 +1591,7 @@ export class IntervalCollection extends TypedEventEmitter {
|
|
|
1683
1591
|
(_b = oldSeg === null || oldSeg === void 0 ? void 0 : oldSeg.localRefs) === null || _b === void 0 ? void 0 : _b.addLocalRef(oldInterval.end, oldInterval.end.getOffset());
|
|
1684
1592
|
}
|
|
1685
1593
|
this.localCollection.add(interval);
|
|
1686
|
-
this.emitChange(interval, oldInterval, true, op);
|
|
1594
|
+
this.emitChange(interval, oldInterval, true, true, op);
|
|
1687
1595
|
}
|
|
1688
1596
|
}
|
|
1689
1597
|
/** @internal */
|