@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.
Files changed (63) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/intervalCollection.d.ts +9 -19
  7. package/dist/intervalCollection.d.ts.map +1 -1
  8. package/dist/intervalCollection.js +11 -102
  9. package/dist/intervalCollection.js.map +1 -1
  10. package/dist/intervalIndex/index.d.ts +8 -0
  11. package/dist/intervalIndex/index.d.ts.map +1 -0
  12. package/dist/intervalIndex/index.js +12 -0
  13. package/dist/intervalIndex/index.js.map +1 -0
  14. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
  15. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  16. package/dist/intervalIndex/overlappingIntervalsIndex.js +103 -0
  17. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  18. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
  19. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  20. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +33 -0
  21. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  22. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
  23. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  24. package/dist/intervalIndex/sequenceIntervalIndexes.js +7 -0
  25. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  26. package/dist/packageVersion.d.ts +1 -1
  27. package/dist/packageVersion.js +1 -1
  28. package/dist/packageVersion.js.map +1 -1
  29. package/lib/index.d.ts +1 -0
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +1 -0
  32. package/lib/index.js.map +1 -1
  33. package/lib/intervalCollection.d.ts +9 -19
  34. package/lib/intervalCollection.d.ts.map +1 -1
  35. package/lib/intervalCollection.js +10 -102
  36. package/lib/intervalCollection.js.map +1 -1
  37. package/lib/intervalIndex/index.d.ts +8 -0
  38. package/lib/intervalIndex/index.d.ts.map +1 -0
  39. package/lib/intervalIndex/index.js +7 -0
  40. package/lib/intervalIndex/index.js.map +1 -0
  41. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
  42. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  43. package/lib/intervalIndex/overlappingIntervalsIndex.js +98 -0
  44. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  45. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
  46. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  47. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +29 -0
  48. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  49. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
  50. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  51. package/lib/intervalIndex/sequenceIntervalIndexes.js +6 -0
  52. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  53. package/lib/packageVersion.d.ts +1 -1
  54. package/lib/packageVersion.js +1 -1
  55. package/lib/packageVersion.js.map +1 -1
  56. package/package.json +16 -16
  57. package/src/index.ts +6 -0
  58. package/src/intervalCollection.ts +16 -139
  59. package/src/intervalIndex/index.ts +11 -0
  60. package/src/intervalIndex/overlappingIntervalsIndex.ts +166 -0
  61. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +71 -0
  62. package/src/intervalIndex/sequenceIntervalIndexes.ts +32 -0
  63. 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 { IntervalTree } from "./intervalTree";
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 = new OverlappingIntervalsIndex(client, helpers);
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 */