@fluidframework/sequence 2.0.0-dev.7.4.0.217212 → 2.0.0-dev.7.4.0.221926

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 (121) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/api-extractor.json +0 -3
  3. package/api-report/sequence.api.md +33 -25
  4. package/dist/intervalCollection.d.ts +31 -6
  5. package/dist/intervalCollection.d.ts.map +1 -1
  6. package/dist/intervalCollection.js +45 -43
  7. package/dist/intervalCollection.js.map +1 -1
  8. package/dist/intervalIndex/intervalIndex.d.ts +1 -1
  9. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  10. package/dist/intervals/intervalUtils.d.ts +6 -7
  11. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  12. package/dist/intervals/intervalUtils.js +2 -2
  13. package/dist/intervals/intervalUtils.js.map +1 -1
  14. package/dist/intervals/sequenceInterval.d.ts +1 -1
  15. package/dist/intervals/sequenceInterval.js +1 -1
  16. package/dist/intervals/sequenceInterval.js.map +1 -1
  17. package/dist/packageVersion.d.ts +1 -1
  18. package/dist/packageVersion.js +1 -1
  19. package/dist/packageVersion.js.map +1 -1
  20. package/dist/sequence-alpha.d.ts +1188 -106
  21. package/dist/sequence-beta.d.ts +44 -0
  22. package/dist/sequence-public.d.ts +44 -0
  23. package/dist/sequence-untrimmed.d.ts +40 -26
  24. package/dist/sequence.d.ts +2 -2
  25. package/dist/sequence.js +1 -1
  26. package/dist/sequence.js.map +1 -1
  27. package/dist/sequenceDeltaEvent.d.ts +4 -4
  28. package/dist/sequenceDeltaEvent.js +3 -3
  29. package/dist/sequenceDeltaEvent.js.map +1 -1
  30. package/dist/sequenceFactory.d.ts +1 -1
  31. package/dist/sequenceFactory.js +1 -1
  32. package/dist/sequenceFactory.js.map +1 -1
  33. package/dist/sharedIntervalCollection.d.ts +1 -1
  34. package/dist/sharedIntervalCollection.js.map +1 -1
  35. package/dist/sharedString.d.ts +3 -3
  36. package/dist/sharedString.js +1 -1
  37. package/dist/sharedString.js.map +1 -1
  38. package/lib/defaultMap.js +22 -18
  39. package/lib/defaultMap.js.map +1 -1
  40. package/lib/defaultMapInterfaces.js +2 -1
  41. package/lib/defaultMapInterfaces.js.map +1 -1
  42. package/lib/index.js +45 -10
  43. package/lib/index.js.map +1 -1
  44. package/lib/intervalCollection.d.ts +31 -6
  45. package/lib/intervalCollection.d.ts.map +1 -1
  46. package/lib/intervalCollection.js +169 -154
  47. package/lib/intervalCollection.js.map +1 -1
  48. package/lib/intervalIndex/endpointInRangeIndex.js +17 -12
  49. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  50. package/lib/intervalIndex/endpointIndex.js +13 -8
  51. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  52. package/lib/intervalIndex/idIntervalIndex.js +8 -4
  53. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  54. package/lib/intervalIndex/index.js +19 -6
  55. package/lib/intervalIndex/index.js.map +1 -1
  56. package/lib/intervalIndex/intervalIndex.d.ts +1 -1
  57. package/lib/intervalIndex/intervalIndex.js +2 -1
  58. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  59. package/lib/intervalIndex/intervalIndexUtils.js +8 -4
  60. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -1
  61. package/lib/intervalIndex/overlappingIntervalsIndex.js +15 -10
  62. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  63. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +14 -10
  64. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  65. package/lib/intervalIndex/sequenceIntervalIndexes.js +2 -1
  66. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  67. package/lib/intervalIndex/startpointInRangeIndex.js +17 -12
  68. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  69. package/lib/intervalTree.js +9 -4
  70. package/lib/intervalTree.js.map +1 -1
  71. package/lib/intervals/index.js +18 -3
  72. package/lib/intervals/index.js.map +1 -1
  73. package/lib/intervals/interval.js +18 -13
  74. package/lib/intervals/interval.js.map +1 -1
  75. package/lib/intervals/intervalUtils.d.ts +6 -7
  76. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  77. package/lib/intervals/intervalUtils.js +20 -15
  78. package/lib/intervals/intervalUtils.js.map +1 -1
  79. package/lib/intervals/sequenceInterval.d.ts +1 -1
  80. package/lib/intervals/sequenceInterval.js +66 -60
  81. package/lib/intervals/sequenceInterval.js.map +1 -1
  82. package/lib/localValues.js +9 -4
  83. package/lib/localValues.js.map +1 -1
  84. package/lib/packageVersion.d.ts +1 -1
  85. package/lib/packageVersion.js +5 -2
  86. package/lib/packageVersion.js.map +1 -1
  87. package/lib/revertibles.js +69 -59
  88. package/lib/revertibles.js.map +1 -1
  89. package/lib/sequence-alpha.d.ts +1188 -106
  90. package/lib/sequence-beta.d.ts +44 -0
  91. package/lib/sequence-public.d.ts +44 -0
  92. package/lib/sequence-untrimmed.d.ts +40 -26
  93. package/lib/sequence.d.ts +2 -2
  94. package/lib/sequence.js +45 -40
  95. package/lib/sequence.js.map +1 -1
  96. package/lib/sequenceDeltaEvent.d.ts +4 -4
  97. package/lib/sequenceDeltaEvent.js +16 -10
  98. package/lib/sequenceDeltaEvent.js.map +1 -1
  99. package/lib/sequenceFactory.d.ts +1 -1
  100. package/lib/sequenceFactory.js +14 -10
  101. package/lib/sequenceFactory.js.map +1 -1
  102. package/lib/sharedIntervalCollection.d.ts +1 -1
  103. package/lib/sharedIntervalCollection.js +18 -13
  104. package/lib/sharedIntervalCollection.js.map +1 -1
  105. package/lib/sharedSequence.js +11 -6
  106. package/lib/sharedSequence.js.map +1 -1
  107. package/lib/sharedString.d.ts +3 -3
  108. package/lib/sharedString.js +22 -17
  109. package/lib/sharedString.js.map +1 -1
  110. package/package.json +18 -17
  111. package/sequence.test-files.tar +0 -0
  112. package/src/intervalCollection.ts +88 -55
  113. package/src/intervalIndex/intervalIndex.ts +1 -1
  114. package/src/intervals/intervalUtils.ts +6 -7
  115. package/src/intervals/sequenceInterval.ts +1 -1
  116. package/src/packageVersion.ts +1 -1
  117. package/src/sequence.ts +2 -2
  118. package/src/sequenceDeltaEvent.ts +4 -4
  119. package/src/sequenceFactory.ts +1 -1
  120. package/src/sharedIntervalCollection.ts +1 -1
  121. package/src/sharedString.ts +3 -3
@@ -1,13 +1,16 @@
1
+ "use strict";
1
2
  /*!
2
3
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
4
  * Licensed under the MIT License.
4
5
  */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.revertSharedStringRevertibles = exports.discardSharedStringRevertibles = exports.appendSharedStringDeltaToRevertibles = exports.appendIntervalPropertyChangedToRevertibles = exports.appendChangeIntervalToRevertibles = exports.appendDeleteIntervalToRevertibles = exports.appendAddIntervalToRevertibles = void 0;
5
8
  /* eslint-disable import/no-deprecated */
6
9
  /* eslint-disable no-bitwise */
7
- import { assert, unreachableCase } from "@fluidframework/core-utils";
8
- import { appendToMergeTreeDeltaRevertibles, discardMergeTreeDeltaRevertible, isMergeTreeDeltaRevertible, MergeTreeDeltaType, ReferenceType, refTypeIncludesFlag, revertMergeTreeDeltaRevertibles, SortedSet, getSlideToSegoff, SlidingPreference, } from "@fluidframework/merge-tree";
9
- import { Side } from "./intervalCollection";
10
- import { IntervalOpType, SequenceInterval } from "./intervals";
10
+ const core_utils_1 = require("@fluidframework/core-utils");
11
+ const merge_tree_1 = require("@fluidframework/merge-tree");
12
+ const intervalCollection_1 = require("./intervalCollection");
13
+ const intervals_1 = require("./intervals");
11
14
  const idMap = new Map();
12
15
  function getUpdatedIdFromInterval(interval) {
13
16
  const maybeId = interval.getIntervalId();
@@ -20,30 +23,31 @@ function getUpdatedId(intervalId) {
20
23
  * Create revertibles for adding an interval
21
24
  * @internal
22
25
  */
23
- export function appendAddIntervalToRevertibles(interval, revertibles) {
26
+ function appendAddIntervalToRevertibles(interval, revertibles) {
24
27
  revertibles.push({
25
- event: IntervalOpType.ADD,
28
+ event: intervals_1.IntervalOpType.ADD,
26
29
  interval,
27
30
  });
28
31
  return revertibles;
29
32
  }
33
+ exports.appendAddIntervalToRevertibles = appendAddIntervalToRevertibles;
30
34
  /**
31
35
  * Create revertibles for deleting an interval
32
36
  * @internal
33
37
  */
34
- export function appendDeleteIntervalToRevertibles(string, interval, revertibles) {
38
+ function appendDeleteIntervalToRevertibles(string, interval, revertibles) {
35
39
  const startSeg = interval.start.getSegment();
36
40
  const startType = startSeg.removedSeq !== undefined
37
- ? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin
38
- : ReferenceType.StayOnRemove | ReferenceType.RangeBegin;
41
+ ? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeBegin
42
+ : merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeBegin;
39
43
  const endSeg = interval.end.getSegment();
40
44
  const endType = endSeg.removedSeq !== undefined
41
- ? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd
42
- : ReferenceType.StayOnRemove | ReferenceType.RangeEnd;
45
+ ? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeEnd
46
+ : merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeEnd;
43
47
  const startRef = string.createLocalReferencePosition(startSeg, interval.start.getOffset(), startType, undefined, interval.start.slidingPreference);
44
48
  const endRef = string.createLocalReferencePosition(endSeg, interval.end.getOffset(), endType, undefined, interval.end.slidingPreference);
45
49
  const revertible = {
46
- event: IntervalOpType.DELETE,
50
+ event: intervals_1.IntervalOpType.DELETE,
47
51
  interval,
48
52
  start: startRef,
49
53
  end: endRef,
@@ -53,26 +57,27 @@ export function appendDeleteIntervalToRevertibles(string, interval, revertibles)
53
57
  revertibles.push(revertible);
54
58
  return revertibles;
55
59
  }
60
+ exports.appendDeleteIntervalToRevertibles = appendDeleteIntervalToRevertibles;
56
61
  /**
57
62
  * Create revertibles for moving endpoints of an interval
58
63
  * @internal
59
64
  */
60
- export function appendChangeIntervalToRevertibles(string, newInterval, previousInterval, revertibles) {
65
+ function appendChangeIntervalToRevertibles(string, newInterval, previousInterval, revertibles) {
61
66
  const startSeg = previousInterval.start.getSegment();
62
67
  // This logic is needed because the ReferenceType StayOnRemove cannot be used
63
68
  // on removed segments. This works for revertibles because the old position of the
64
69
  // interval within the removed segment is handled by the remove range revertible.
65
70
  const startType = startSeg.removedSeq !== undefined
66
- ? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin
67
- : ReferenceType.StayOnRemove | ReferenceType.RangeBegin;
71
+ ? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeBegin
72
+ : merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeBegin;
68
73
  const endSeg = previousInterval.end.getSegment();
69
74
  const endType = endSeg.removedSeq !== undefined
70
- ? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd
71
- : ReferenceType.StayOnRemove | ReferenceType.RangeEnd;
75
+ ? merge_tree_1.ReferenceType.SlideOnRemove | merge_tree_1.ReferenceType.RangeEnd
76
+ : merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeEnd;
72
77
  const prevStartRef = string.createLocalReferencePosition(startSeg, previousInterval.start.getOffset(), startType, undefined, previousInterval.start.slidingPreference);
73
78
  const prevEndRef = string.createLocalReferencePosition(endSeg, previousInterval.end.getOffset(), endType, undefined, previousInterval.end.slidingPreference);
74
79
  const revertible = {
75
- event: IntervalOpType.CHANGE,
80
+ event: intervals_1.IntervalOpType.CHANGE,
76
81
  interval: newInterval,
77
82
  start: prevStartRef,
78
83
  end: prevEndRef,
@@ -82,29 +87,31 @@ export function appendChangeIntervalToRevertibles(string, newInterval, previousI
82
87
  revertibles.push(revertible);
83
88
  return revertibles;
84
89
  }
90
+ exports.appendChangeIntervalToRevertibles = appendChangeIntervalToRevertibles;
85
91
  /**
86
92
  * Create revertibles for changing properties of an interval
87
93
  * @internal
88
94
  */
89
- export function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertibles) {
95
+ function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertibles) {
90
96
  revertibles.push({
91
- event: IntervalOpType.PROPERTY_CHANGED,
97
+ event: intervals_1.IntervalOpType.PROPERTY_CHANGED,
92
98
  interval,
93
99
  propertyDeltas: deltas,
94
100
  });
95
101
  return revertibles;
96
102
  }
103
+ exports.appendIntervalPropertyChangedToRevertibles = appendIntervalPropertyChangedToRevertibles;
97
104
  function addIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals) {
98
- if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {
105
+ if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeBegin)) {
99
106
  const interval = ref.properties?.interval;
100
- if (interval && interval instanceof SequenceInterval) {
107
+ if (interval && interval instanceof intervals_1.SequenceInterval) {
101
108
  startIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });
102
109
  return true;
103
110
  }
104
111
  }
105
- else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {
112
+ else if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeEnd)) {
106
113
  const interval = ref.properties?.interval;
107
- if (interval && interval instanceof SequenceInterval) {
114
+ if (interval && interval instanceof intervals_1.SequenceInterval) {
108
115
  endIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });
109
116
  return true;
110
117
  }
@@ -117,7 +124,7 @@ function addIfRevertibleRef(ref, segmentLengths, revertibleRefs) {
117
124
  revertibleRefs.push({
118
125
  revertible,
119
126
  offset: segmentLengths + ref.getOffset(),
120
- isStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),
127
+ isStart: (0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeBegin),
121
128
  });
122
129
  }
123
130
  }
@@ -126,11 +133,11 @@ function addIfRevertibleRef(ref, segmentLengths, revertibleRefs) {
126
133
  * (e.g. reverting remove of a range that contains an interval will move the interval back)
127
134
  * @internal
128
135
  */
129
- export function appendSharedStringDeltaToRevertibles(string, delta, revertibles) {
136
+ function appendSharedStringDeltaToRevertibles(string, delta, revertibles) {
130
137
  if (delta.ranges.length === 0) {
131
138
  return;
132
139
  }
133
- if (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {
140
+ if (delta.deltaOperation === merge_tree_1.MergeTreeDeltaType.REMOVE) {
134
141
  const startIntervals = [];
135
142
  const endIntervals = [];
136
143
  const revertibleRefs = [];
@@ -148,10 +155,10 @@ export function appendSharedStringDeltaToRevertibles(string, delta, revertibles)
148
155
  }
149
156
  if (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {
150
157
  const removeRevertibles = [];
151
- appendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);
152
- assert(removeRevertibles.length === 1, 0x6c4 /* Remove revertible should be a single delta */);
158
+ (0, merge_tree_1.appendToMergeTreeDeltaRevertibles)(delta.deltaArgs, removeRevertibles);
159
+ (0, core_utils_1.assert)(removeRevertibles.length === 1, 0x6c4 /* Remove revertible should be a single delta */);
153
160
  const revertible = {
154
- event: IntervalOpType.POSITION_REMOVE,
161
+ event: intervals_1.IntervalOpType.POSITION_REMOVE,
155
162
  intervals: [],
156
163
  revertibleRefs,
157
164
  mergeTreeRevertible: removeRevertibles[0],
@@ -189,29 +196,31 @@ export function appendSharedStringDeltaToRevertibles(string, delta, revertibles)
189
196
  // Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints
190
197
  const mergeTreeRevertibles = [];
191
198
  // Allow merging MergeTreeDeltaRevertible with previous
192
- if (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {
199
+ if (revertibles.length > 0 && (0, merge_tree_1.isMergeTreeDeltaRevertible)(revertibles[revertibles.length - 1])) {
193
200
  mergeTreeRevertibles.push(revertibles.pop());
194
201
  }
195
- appendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);
202
+ (0, merge_tree_1.appendToMergeTreeDeltaRevertibles)(delta.deltaArgs, mergeTreeRevertibles);
196
203
  revertibles.push(...mergeTreeRevertibles);
197
204
  }
205
+ exports.appendSharedStringDeltaToRevertibles = appendSharedStringDeltaToRevertibles;
198
206
  /**
199
207
  * Clean up resources held by revertibles that are no longer needed.
200
208
  * @internal
201
209
  */
202
- export function discardSharedStringRevertibles(sharedString, revertibles) {
210
+ function discardSharedStringRevertibles(sharedString, revertibles) {
203
211
  revertibles.forEach((r) => {
204
- if (isMergeTreeDeltaRevertible(r)) {
205
- discardMergeTreeDeltaRevertible([r]);
212
+ if ((0, merge_tree_1.isMergeTreeDeltaRevertible)(r)) {
213
+ (0, merge_tree_1.discardMergeTreeDeltaRevertible)([r]);
206
214
  }
207
- else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {
215
+ else if (r.event === intervals_1.IntervalOpType.CHANGE || r.event === intervals_1.IntervalOpType.DELETE) {
208
216
  sharedString.removeLocalReferencePosition(r.start);
209
217
  sharedString.removeLocalReferencePosition(r.end);
210
218
  }
211
219
  });
212
220
  }
221
+ exports.discardSharedStringRevertibles = discardSharedStringRevertibles;
213
222
  function getSlidePosition(string, lref, pos) {
214
- const slide = getSlideToSegoff({ segment: lref.getSegment(), offset: undefined }, lref.slidingPreference);
223
+ const slide = (0, merge_tree_1.getSlideToSegoff)({ segment: lref.getSegment(), offset: undefined }, lref.slidingPreference);
215
224
  return slide?.segment !== undefined &&
216
225
  slide.offset !== undefined &&
217
226
  string.getPosition(slide.segment) !== -1 &&
@@ -226,8 +235,8 @@ function isValidRange(start, startSlide, end, endSlide, string) {
226
235
  end < string.getLength() &&
227
236
  (start < end ||
228
237
  (start === end &&
229
- (startSlide === SlidingPreference.FORWARD ||
230
- endSlide !== SlidingPreference.FORWARD))));
238
+ (startSlide === merge_tree_1.SlidingPreference.FORWARD ||
239
+ endSlide !== merge_tree_1.SlidingPreference.FORWARD))));
231
240
  }
232
241
  function revertLocalAdd(string, revertible) {
233
242
  const id = getUpdatedIdFromInterval(revertible.interval);
@@ -235,17 +244,17 @@ function revertLocalAdd(string, revertible) {
235
244
  string.getIntervalCollection(label).removeIntervalById(id);
236
245
  }
237
246
  function createSequencePlace(pos, newSlidingPreference, oldSlidingPreference = undefined) {
238
- return newSlidingPreference === SlidingPreference.BACKWARD ||
239
- (newSlidingPreference === undefined && oldSlidingPreference === SlidingPreference.BACKWARD)
247
+ return newSlidingPreference === merge_tree_1.SlidingPreference.BACKWARD ||
248
+ (newSlidingPreference === undefined && oldSlidingPreference === merge_tree_1.SlidingPreference.BACKWARD)
240
249
  ? {
241
250
  pos,
242
- side: Side.After,
251
+ side: intervalCollection_1.Side.After,
243
252
  }
244
- : newSlidingPreference === SlidingPreference.FORWARD &&
245
- oldSlidingPreference === SlidingPreference.BACKWARD
253
+ : newSlidingPreference === merge_tree_1.SlidingPreference.FORWARD &&
254
+ oldSlidingPreference === merge_tree_1.SlidingPreference.BACKWARD
246
255
  ? {
247
256
  pos,
248
- side: Side.Before,
257
+ side: intervalCollection_1.Side.Before,
249
258
  }
250
259
  : pos; // Avoid setting side if possible since stickiness may not be enabled
251
260
  }
@@ -319,7 +328,7 @@ function newEndpointPosition(offset, restoredRanges, sharedString) {
319
328
  const pos = newPosition(offset, restoredRanges);
320
329
  return pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;
321
330
  }
322
- class SortedRangeSet extends SortedSet {
331
+ class SortedRangeSet extends merge_tree_1.SortedSet {
323
332
  getKey(item) {
324
333
  return item.ranges[0].segment.ordinal;
325
334
  }
@@ -336,7 +345,7 @@ function revertLocalSequenceRemove(sharedString, revertible) {
336
345
  }
337
346
  };
338
347
  sharedString.on("sequenceDelta", saveSegments);
339
- revertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);
348
+ (0, merge_tree_1.revertMergeTreeDeltaRevertibles)(sharedString, [revertible.mergeTreeRevertible]);
340
349
  sharedString.off("sequenceDelta", saveSegments);
341
350
  revertible.intervals.forEach((intervalInfo) => {
342
351
  const intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);
@@ -354,18 +363,18 @@ function revertLocalSequenceRemove(sharedString, revertible) {
354
363
  });
355
364
  // fix up the local references used by delete and change revertibles
356
365
  revertible.revertibleRefs.forEach((revertibleRef) => {
357
- assert(revertibleRef.revertible.event === IntervalOpType.CHANGE ||
358
- revertibleRef.revertible.event === IntervalOpType.DELETE, 0x6c5 /* revertible is not delete or change */);
366
+ (0, core_utils_1.assert)(revertibleRef.revertible.event === intervals_1.IntervalOpType.CHANGE ||
367
+ revertibleRef.revertible.event === intervals_1.IntervalOpType.DELETE, 0x6c5 /* revertible is not delete or change */);
359
368
  const pos = newPosition(revertibleRef.offset, restoredRanges);
360
369
  if (pos !== undefined) {
361
370
  if (revertibleRef.isStart) {
362
371
  sharedString.removeLocalReferencePosition(revertibleRef.revertible.start);
363
- const newRef = sharedString.createLocalReferencePosition(pos.segment, pos.offset, ReferenceType.StayOnRemove | ReferenceType.RangeBegin, { revertible: revertibleRef.revertible }, revertibleRef.revertible.start.slidingPreference);
372
+ const newRef = sharedString.createLocalReferencePosition(pos.segment, pos.offset, merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeBegin, { revertible: revertibleRef.revertible }, revertibleRef.revertible.start.slidingPreference);
364
373
  revertibleRef.revertible.start = newRef;
365
374
  }
366
375
  else {
367
376
  sharedString.removeLocalReferencePosition(revertibleRef.revertible.end);
368
- const newRef = sharedString.createLocalReferencePosition(pos.segment, pos.offset, ReferenceType.StayOnRemove | ReferenceType.RangeEnd, { revertible: revertibleRef.revertible }, revertibleRef.revertible.end.slidingPreference);
377
+ const newRef = sharedString.createLocalReferencePosition(pos.segment, pos.offset, merge_tree_1.ReferenceType.StayOnRemove | merge_tree_1.ReferenceType.RangeEnd, { revertible: revertibleRef.revertible }, revertibleRef.revertible.end.slidingPreference);
369
378
  revertibleRef.revertible.end = newRef;
370
379
  }
371
380
  }
@@ -375,35 +384,36 @@ function revertLocalSequenceRemove(sharedString, revertible) {
375
384
  * Invoke revertibles to reverse prior edits
376
385
  * @internal
377
386
  */
378
- export function revertSharedStringRevertibles(sharedString, revertibles) {
387
+ function revertSharedStringRevertibles(sharedString, revertibles) {
379
388
  while (revertibles.length > 0) {
380
389
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
381
390
  const r = revertibles.pop();
382
391
  if ("event" in r) {
383
392
  const event = r.event;
384
393
  switch (event) {
385
- case IntervalOpType.ADD:
394
+ case intervals_1.IntervalOpType.ADD:
386
395
  revertLocalAdd(sharedString, r);
387
396
  break;
388
- case IntervalOpType.DELETE:
397
+ case intervals_1.IntervalOpType.DELETE:
389
398
  revertLocalDelete(sharedString, r);
390
399
  break;
391
- case IntervalOpType.CHANGE:
400
+ case intervals_1.IntervalOpType.CHANGE:
392
401
  revertLocalChange(sharedString, r);
393
402
  break;
394
- case IntervalOpType.PROPERTY_CHANGED:
403
+ case intervals_1.IntervalOpType.PROPERTY_CHANGED:
395
404
  revertLocalPropertyChanged(sharedString, r);
396
405
  break;
397
- case IntervalOpType.POSITION_REMOVE:
406
+ case intervals_1.IntervalOpType.POSITION_REMOVE:
398
407
  revertLocalSequenceRemove(sharedString, r);
399
408
  break;
400
409
  default:
401
- unreachableCase(event);
410
+ (0, core_utils_1.unreachableCase)(event);
402
411
  }
403
412
  }
404
413
  else {
405
- revertMergeTreeDeltaRevertibles(sharedString, [r]);
414
+ (0, merge_tree_1.revertMergeTreeDeltaRevertibles)(sharedString, [r]);
406
415
  }
407
416
  }
408
417
  }
418
+ exports.revertSharedStringRevertibles = revertSharedStringRevertibles;
409
419
  //# sourceMappingURL=revertibles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-deprecated */\n/* eslint-disable no-bitwise */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\tLocalReferencePosition,\n\tMergeTreeDeltaOperationType,\n\tMergeTreeDeltaRevertible,\n\tMergeTreeDeltaType,\n\tPropertySet,\n\tReferenceType,\n\trefTypeIncludesFlag,\n\trevertMergeTreeDeltaRevertibles,\n\tSortedSet,\n\tgetSlideToSegoff,\n\tSlidingPreference,\n} from \"@fluidframework/merge-tree\";\nimport { InteriorSequencePlace, Side } from \"./intervalCollection\";\nimport { IntervalOpType, SequenceInterval } from \"./intervals\";\nimport { SharedString, SharedStringSegment } from \"./sharedString\";\nimport { ISequenceDeltaRange, SequenceDeltaEvent } from \"./sequenceDeltaEvent\";\n\n/**\n * Data for undoing edits on SharedStrings and Intervals.\n * @internal\n */\nexport type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;\n\nconst idMap = new Map<string, string>();\n\n/**\n * Data for undoing edits affecting Intervals.\n * @internal\n */\nexport type IntervalRevertible =\n\t| {\n\t\t\tevent: typeof IntervalOpType.CHANGE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.ADD;\n\t\t\tinterval: SequenceInterval;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.DELETE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.PROPERTY_CHANGED;\n\t\t\tinterval: SequenceInterval;\n\t\t\tpropertyDeltas: PropertySet;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.POSITION_REMOVE;\n\t\t\tintervals: {\n\t\t\t\tintervalId: string;\n\t\t\t\tlabel: string;\n\t\t\t\tstartOffset?: number; // interval start index within a removed range\n\t\t\t\tendOffset?: number; // interval end index within a removed range\n\t\t\t}[];\n\t\t\t// local refs used by IntervalOpType.CHANGE and DELETE revertibles\n\t\t\trevertibleRefs: {\n\t\t\t\trevertible: IntervalRevertible;\n\t\t\t\toffset: number;\n\t\t\t\tisStart: boolean;\n\t\t\t}[];\n\t\t\tmergeTreeRevertible: MergeTreeDeltaRevertible;\n\t };\n\ntype TypedRevertible<T extends IntervalRevertible[\"event\"]> = IntervalRevertible & { event: T };\n\nfunction getUpdatedIdFromInterval(interval: SequenceInterval): string {\n\tconst maybeId = interval.getIntervalId();\n\treturn getUpdatedId(maybeId);\n}\n\nfunction getUpdatedId(intervalId: string): string {\n\treturn idMap.get(intervalId) ?? intervalId;\n}\n\n/**\n * Create revertibles for adding an interval\n * @internal\n */\nexport function appendAddIntervalToRevertibles(\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.ADD,\n\t\tinterval,\n\t});\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for deleting an interval\n * @internal\n */\nexport function appendDeleteIntervalToRevertibles(\n\tstring: SharedString,\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = interval.start.getSegment() as SharedStringSegment;\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = interval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst startRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tinterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tinterval.start.slidingPreference,\n\t);\n\tconst endRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tinterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tinterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.DELETE,\n\t\tinterval,\n\t\tstart: startRef,\n\t\tend: endRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for moving endpoints of an interval\n * @internal\n */\nexport function appendChangeIntervalToRevertibles(\n\tstring: SharedString,\n\tnewInterval: SequenceInterval,\n\tpreviousInterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = previousInterval.start.getSegment() as SharedStringSegment;\n\t// This logic is needed because the ReferenceType StayOnRemove cannot be used\n\t// on removed segments. This works for revertibles because the old position of the\n\t// interval within the removed segment is handled by the remove range revertible.\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = previousInterval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst prevStartRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tpreviousInterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tpreviousInterval.start.slidingPreference,\n\t);\n\tconst prevEndRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tpreviousInterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tpreviousInterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.CHANGE,\n\t\tinterval: newInterval,\n\t\tstart: prevStartRef,\n\t\tend: prevEndRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for changing properties of an interval\n * @internal\n */\nexport function appendIntervalPropertyChangedToRevertibles(\n\tinterval: SequenceInterval,\n\tdeltas: PropertySet,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.PROPERTY_CHANGED,\n\t\tinterval,\n\t\tpropertyDeltas: deltas,\n\t});\n\n\treturn revertibles;\n}\n\nfunction addIfIntervalEndpoint(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\tstartIntervals: { offset: number; interval: SequenceInterval }[],\n\tendIntervals: { offset: number; interval: SequenceInterval }[],\n) {\n\tif (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tstartIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t} else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tendIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addIfRevertibleRef(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\trevertibleRefs: {\n\t\trevertible: IntervalRevertible;\n\t\toffset: number;\n\t\tisStart: boolean;\n\t}[],\n) {\n\tconst revertible = ref.properties?.revertible;\n\tif (revertible) {\n\t\trevertibleRefs.push({\n\t\t\trevertible,\n\t\t\toffset: segmentLengths + ref.getOffset(),\n\t\t\tisStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),\n\t\t});\n\t}\n}\n\n/**\n * Create revertibles for SharedStringDeltas, handling indirectly modified intervals\n * (e.g. reverting remove of a range that contains an interval will move the interval back)\n * @internal\n */\nexport function appendSharedStringDeltaToRevertibles(\n\tstring: SharedString,\n\tdelta: SequenceDeltaEvent,\n\trevertibles: SharedStringRevertible[],\n) {\n\tif (delta.ranges.length === 0) {\n\t\treturn;\n\t}\n\tif (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {\n\t\tconst startIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst endIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst revertibleRefs: {\n\t\t\trevertible: IntervalRevertible;\n\t\t\toffset: number;\n\t\t\tisStart: boolean;\n\t\t}[] = [];\n\t\tlet segmentLengths = 0;\n\n\t\t// find interval endpoints in each segment\n\t\tfor (const deltaRange of delta.ranges) {\n\t\t\tconst refs = deltaRange.segment.localRefs;\n\t\t\tif (refs !== undefined && deltaRange.position !== -1) {\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\taddIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals);\n\t\t\t\t\taddIfRevertibleRef(ref, segmentLengths, revertibleRefs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegmentLengths += deltaRange.segment.cachedLength;\n\t\t}\n\n\t\tif (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {\n\t\t\tconst removeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);\n\t\t\tassert(\n\t\t\t\tremoveRevertibles.length === 1,\n\t\t\t\t0x6c4 /* Remove revertible should be a single delta */,\n\t\t\t);\n\n\t\t\tconst revertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE> = {\n\t\t\t\tevent: IntervalOpType.POSITION_REMOVE,\n\t\t\t\tintervals: [],\n\t\t\t\trevertibleRefs,\n\t\t\t\tmergeTreeRevertible: removeRevertibles[0],\n\t\t\t};\n\n\t\t\t// add an interval for each startInterval, accounting for any corresponding endIntervals\n\t\t\tstartIntervals.forEach(({ interval, offset }) => {\n\t\t\t\t// find any corresponding end for this interval\n\t\t\t\tconst endIntervalIndex = endIntervals.findIndex((end) => {\n\t\t\t\t\treturn end.interval === interval;\n\t\t\t\t});\n\t\t\t\tlet endOffset: number | undefined;\n\t\t\t\tif (endIntervalIndex !== -1) {\n\t\t\t\t\tendOffset = endIntervals[endIntervalIndex].offset;\n\t\t\t\t\tendIntervals.splice(endIntervalIndex, 1);\n\t\t\t\t}\n\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tstartOffset: offset,\n\t\t\t\t\tendOffset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// add any remaining endIntervals that aren't matched with a startInterval\n\t\t\tendIntervals.forEach(({ interval, offset }) => {\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tendOffset: offset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trevertibles.push(revertible);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints\n\tconst mergeTreeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t// Allow merging MergeTreeDeltaRevertible with previous\n\tif (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {\n\t\tmergeTreeRevertibles.push(revertibles.pop() as MergeTreeDeltaRevertible);\n\t}\n\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);\n\trevertibles.push(...mergeTreeRevertibles);\n}\n\n/**\n * Clean up resources held by revertibles that are no longer needed.\n * @internal\n */\nexport function discardSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.forEach((r) => {\n\t\tif (isMergeTreeDeltaRevertible(r)) {\n\t\t\tdiscardMergeTreeDeltaRevertible([r]);\n\t\t} else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {\n\t\t\tsharedString.removeLocalReferencePosition(r.start);\n\t\t\tsharedString.removeLocalReferencePosition(r.end);\n\t\t}\n\t});\n}\n\nfunction getSlidePosition(string: SharedString, lref: LocalReferencePosition, pos: number): number {\n\tconst slide = getSlideToSegoff(\n\t\t{ segment: lref.getSegment(), offset: undefined },\n\t\tlref.slidingPreference,\n\t);\n\treturn slide?.segment !== undefined &&\n\t\tslide.offset !== undefined &&\n\t\tstring.getPosition(slide.segment) !== -1 &&\n\t\t(pos < 0 || pos >= string.getLength())\n\t\t? string.getPosition(slide.segment) + slide.offset\n\t\t: pos;\n}\n\nfunction isValidRange(\n\tstart: number,\n\tstartSlide: SlidingPreference | undefined,\n\tend: number,\n\tendSlide: SlidingPreference | undefined,\n\tstring: SharedString,\n) {\n\treturn (\n\t\tstart >= 0 &&\n\t\tstart < string.getLength() &&\n\t\tend >= 0 &&\n\t\tend < string.getLength() &&\n\t\t(start < end ||\n\t\t\t(start === end &&\n\t\t\t\t(startSlide === SlidingPreference.FORWARD ||\n\t\t\t\t\tendSlide !== SlidingPreference.FORWARD)))\n\t);\n}\n\nfunction revertLocalAdd(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.ADD>,\n) {\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tstring.getIntervalCollection(label).removeIntervalById(id);\n}\n\nfunction createSequencePlace(\n\tpos: number,\n\tnewSlidingPreference: SlidingPreference | undefined,\n\toldSlidingPreference: SlidingPreference | undefined = undefined,\n): number | InteriorSequencePlace {\n\treturn newSlidingPreference === SlidingPreference.BACKWARD ||\n\t\t(newSlidingPreference === undefined && oldSlidingPreference === SlidingPreference.BACKWARD)\n\t\t? {\n\t\t\t\tpos,\n\t\t\t\tside: Side.After,\n\t\t }\n\t\t: newSlidingPreference === SlidingPreference.FORWARD &&\n\t\t oldSlidingPreference === SlidingPreference.BACKWARD\n\t\t? {\n\t\t\t\tpos,\n\t\t\t\tside: Side.Before,\n\t\t }\n\t\t: pos; // Avoid setting side if possible since stickiness may not be enabled\n}\n\nfunction revertLocalDelete(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.DELETE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\t// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add\n\tconst { intervalId, ...props } = revertible.interval.properties;\n\tif (\n\t\tisValidRange(\n\t\t\tstartSlidePos,\n\t\t\trevertible.start.slidingPreference,\n\t\t\tendSlidePos,\n\t\t\trevertible.end.slidingPreference,\n\t\t\tstring,\n\t\t)\n\t) {\n\t\tconst int = collection.add({\n\t\t\tstart: createSequencePlace(startSlidePos, revertible.start.slidingPreference),\n\t\t\tend: createSequencePlace(endSlidePos, revertible.end.slidingPreference),\n\t\t\tprops,\n\t\t});\n\n\t\tidMap.forEach((newId, oldId) => {\n\t\t\tif (intervalId === newId) {\n\t\t\t\tidMap.set(oldId, getUpdatedIdFromInterval(int));\n\t\t\t}\n\t\t});\n\t\tidMap.set(intervalId, int.getIntervalId());\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalChange(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.CHANGE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tconst interval = collection.getIntervalById(id);\n\tif (\n\t\tinterval !== undefined &&\n\t\tisValidRange(\n\t\t\tstartSlidePos,\n\t\t\trevertible.start.slidingPreference ?? interval.start.slidingPreference,\n\t\t\tendSlidePos,\n\t\t\trevertible.end.slidingPreference ?? interval.end.slidingPreference,\n\t\t\tstring,\n\t\t)\n\t) {\n\t\tcollection.change(\n\t\t\tid,\n\t\t\tcreateSequencePlace(\n\t\t\t\tstartSlidePos,\n\t\t\t\trevertible.start.slidingPreference,\n\t\t\t\tinterval.start.slidingPreference,\n\t\t\t),\n\t\t\tcreateSequencePlace(\n\t\t\t\tendSlidePos,\n\t\t\t\trevertible.end.slidingPreference,\n\t\t\t\tinterval.end.slidingPreference,\n\t\t\t),\n\t\t);\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalPropertyChanged(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst newProps = revertible.propertyDeltas;\n\tstring.getIntervalCollection(label).changeProperties(id, newProps);\n}\n\nfunction newPosition(offset: number | undefined, restoredRanges: SortedRangeSet) {\n\tif (offset === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet offsetFromSegment = offset;\n\tfor (const rangeInfo of restoredRanges.items) {\n\t\tif (offsetFromSegment < rangeInfo.length) {\n\t\t\t// find the segment inside the range\n\t\t\tfor (const range of rangeInfo.ranges) {\n\t\t\t\tif (range.segment.cachedLength > offsetFromSegment) {\n\t\t\t\t\treturn { segment: range.segment, offset: offsetFromSegment };\n\t\t\t\t}\n\t\t\t\toffsetFromSegment -= range.segment.cachedLength;\n\t\t\t}\n\t\t}\n\t\toffsetFromSegment -= rangeInfo.length;\n\t}\n\n\treturn undefined;\n}\n\nfunction newEndpointPosition(\n\toffset: number | undefined,\n\trestoredRanges: SortedRangeSet,\n\tsharedString: SharedString,\n) {\n\tconst pos = newPosition(offset, restoredRanges);\n\treturn pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;\n}\n\ninterface RangeInfo {\n\tranges: readonly Readonly<ISequenceDeltaRange<MergeTreeDeltaOperationType>>[];\n\tlength: number;\n}\n\nclass SortedRangeSet extends SortedSet<RangeInfo, string> {\n\tprotected getKey(item: RangeInfo): string {\n\t\treturn item.ranges[0].segment.ordinal;\n\t}\n}\n\nfunction revertLocalSequenceRemove(\n\tsharedString: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE>,\n) {\n\tconst restoredRanges = new SortedRangeSet();\n\tconst saveSegments = (event: SequenceDeltaEvent) => {\n\t\tif (event.ranges.length > 0) {\n\t\t\tlet length = 0;\n\t\t\tevent.ranges.forEach((range) => {\n\t\t\t\tlength += range.segment.cachedLength;\n\t\t\t});\n\t\t\trestoredRanges.addOrUpdate({ ranges: event.ranges, length });\n\t\t}\n\t};\n\tsharedString.on(\"sequenceDelta\", saveSegments);\n\trevertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);\n\tsharedString.off(\"sequenceDelta\", saveSegments);\n\n\trevertible.intervals.forEach((intervalInfo) => {\n\t\tconst intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);\n\t\tconst intervalId = getUpdatedId(intervalInfo.intervalId);\n\t\tconst interval = intervalCollection.getIntervalById(intervalId);\n\t\tif (interval !== undefined) {\n\t\t\tconst start =\n\t\t\t\tnewEndpointPosition(intervalInfo.startOffset, restoredRanges, sharedString) ??\n\t\t\t\tsharedString.localReferencePositionToPosition(interval.start);\n\t\t\tconst end =\n\t\t\t\tnewEndpointPosition(intervalInfo.endOffset, restoredRanges, sharedString) ??\n\t\t\t\tsharedString.localReferencePositionToPosition(interval.end);\n\t\t\tif (\n\t\t\t\tisValidRange(\n\t\t\t\t\tstart,\n\t\t\t\t\tinterval.start.slidingPreference,\n\t\t\t\t\tend,\n\t\t\t\t\tinterval.end.slidingPreference,\n\t\t\t\t\tsharedString,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tintervalCollection.change(\n\t\t\t\t\tintervalId,\n\t\t\t\t\tcreateSequencePlace(start, interval.start.slidingPreference),\n\t\t\t\t\tcreateSequencePlace(end, interval.end.slidingPreference),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\t// fix up the local references used by delete and change revertibles\n\trevertible.revertibleRefs.forEach((revertibleRef) => {\n\t\tassert(\n\t\t\trevertibleRef.revertible.event === IntervalOpType.CHANGE ||\n\t\t\t\trevertibleRef.revertible.event === IntervalOpType.DELETE,\n\t\t\t0x6c5 /* revertible is not delete or change */,\n\t\t);\n\t\tconst pos = newPosition(revertibleRef.offset, restoredRanges);\n\t\tif (pos !== undefined) {\n\t\t\tif (revertibleRef.isStart) {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.start);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t\trevertibleRef.revertible.start.slidingPreference,\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.start = newRef;\n\t\t\t} else {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.end);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t\trevertibleRef.revertible.end.slidingPreference,\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.end = newRef;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Invoke revertibles to reverse prior edits\n * @internal\n */\nexport function revertSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tif (\"event\" in r) {\n\t\t\tconst event = r.event;\n\t\t\tswitch (event) {\n\t\t\t\tcase IntervalOpType.ADD:\n\t\t\t\t\trevertLocalAdd(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.DELETE:\n\t\t\t\t\trevertLocalDelete(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.CHANGE:\n\t\t\t\t\trevertLocalChange(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.PROPERTY_CHANGED:\n\t\t\t\t\trevertLocalPropertyChanged(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.POSITION_REMOVE:\n\t\t\t\t\trevertLocalSequenceRemove(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(event);\n\t\t\t}\n\t\t} else {\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, [r]);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"revertibles.js","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-deprecated */\n/* eslint-disable no-bitwise */\n\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tappendToMergeTreeDeltaRevertibles,\n\tdiscardMergeTreeDeltaRevertible,\n\tisMergeTreeDeltaRevertible,\n\tLocalReferencePosition,\n\tMergeTreeDeltaOperationType,\n\tMergeTreeDeltaRevertible,\n\tMergeTreeDeltaType,\n\tPropertySet,\n\tReferenceType,\n\trefTypeIncludesFlag,\n\trevertMergeTreeDeltaRevertibles,\n\tSortedSet,\n\tgetSlideToSegoff,\n\tSlidingPreference,\n} from \"@fluidframework/merge-tree\";\nimport { InteriorSequencePlace, Side } from \"./intervalCollection\";\nimport { IntervalOpType, SequenceInterval } from \"./intervals\";\nimport { SharedString, SharedStringSegment } from \"./sharedString\";\nimport { ISequenceDeltaRange, SequenceDeltaEvent } from \"./sequenceDeltaEvent\";\n\n/**\n * Data for undoing edits on SharedStrings and Intervals.\n * @internal\n */\nexport type SharedStringRevertible = MergeTreeDeltaRevertible | IntervalRevertible;\n\nconst idMap = new Map<string, string>();\n\n/**\n * Data for undoing edits affecting Intervals.\n * @internal\n */\nexport type IntervalRevertible =\n\t| {\n\t\t\tevent: typeof IntervalOpType.CHANGE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.ADD;\n\t\t\tinterval: SequenceInterval;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.DELETE;\n\t\t\tinterval: SequenceInterval;\n\t\t\tstart: LocalReferencePosition;\n\t\t\tend: LocalReferencePosition;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.PROPERTY_CHANGED;\n\t\t\tinterval: SequenceInterval;\n\t\t\tpropertyDeltas: PropertySet;\n\t }\n\t| {\n\t\t\tevent: typeof IntervalOpType.POSITION_REMOVE;\n\t\t\tintervals: {\n\t\t\t\tintervalId: string;\n\t\t\t\tlabel: string;\n\t\t\t\tstartOffset?: number; // interval start index within a removed range\n\t\t\t\tendOffset?: number; // interval end index within a removed range\n\t\t\t}[];\n\t\t\t// local refs used by IntervalOpType.CHANGE and DELETE revertibles\n\t\t\trevertibleRefs: {\n\t\t\t\trevertible: IntervalRevertible;\n\t\t\t\toffset: number;\n\t\t\t\tisStart: boolean;\n\t\t\t}[];\n\t\t\tmergeTreeRevertible: MergeTreeDeltaRevertible;\n\t };\n\ntype TypedRevertible<T extends IntervalRevertible[\"event\"]> = IntervalRevertible & { event: T };\n\nfunction getUpdatedIdFromInterval(interval: SequenceInterval): string {\n\tconst maybeId = interval.getIntervalId();\n\treturn getUpdatedId(maybeId);\n}\n\nfunction getUpdatedId(intervalId: string): string {\n\treturn idMap.get(intervalId) ?? intervalId;\n}\n\n/**\n * Create revertibles for adding an interval\n * @internal\n */\nexport function appendAddIntervalToRevertibles(\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.ADD,\n\t\tinterval,\n\t});\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for deleting an interval\n * @internal\n */\nexport function appendDeleteIntervalToRevertibles(\n\tstring: SharedString,\n\tinterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = interval.start.getSegment() as SharedStringSegment;\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = interval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst startRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tinterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tinterval.start.slidingPreference,\n\t);\n\tconst endRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tinterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tinterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.DELETE,\n\t\tinterval,\n\t\tstart: startRef,\n\t\tend: endRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for moving endpoints of an interval\n * @internal\n */\nexport function appendChangeIntervalToRevertibles(\n\tstring: SharedString,\n\tnewInterval: SequenceInterval,\n\tpreviousInterval: SequenceInterval,\n\trevertibles: SharedStringRevertible[],\n) {\n\tconst startSeg = previousInterval.start.getSegment() as SharedStringSegment;\n\t// This logic is needed because the ReferenceType StayOnRemove cannot be used\n\t// on removed segments. This works for revertibles because the old position of the\n\t// interval within the removed segment is handled by the remove range revertible.\n\tconst startType =\n\t\tstartSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeBegin;\n\tconst endSeg = previousInterval.end.getSegment() as SharedStringSegment;\n\tconst endType =\n\t\tendSeg.removedSeq !== undefined\n\t\t\t? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd\n\t\t\t: ReferenceType.StayOnRemove | ReferenceType.RangeEnd;\n\tconst prevStartRef = string.createLocalReferencePosition(\n\t\tstartSeg,\n\t\tpreviousInterval.start.getOffset(),\n\t\tstartType,\n\t\tundefined,\n\t\tpreviousInterval.start.slidingPreference,\n\t);\n\tconst prevEndRef = string.createLocalReferencePosition(\n\t\tendSeg,\n\t\tpreviousInterval.end.getOffset(),\n\t\tendType,\n\t\tundefined,\n\t\tpreviousInterval.end.slidingPreference,\n\t);\n\tconst revertible = {\n\t\tevent: IntervalOpType.CHANGE,\n\t\tinterval: newInterval,\n\t\tstart: prevStartRef,\n\t\tend: prevEndRef,\n\t};\n\trevertible.start.addProperties({ revertible });\n\trevertible.end.addProperties({ revertible });\n\trevertibles.push(revertible);\n\n\treturn revertibles;\n}\n\n/**\n * Create revertibles for changing properties of an interval\n * @internal\n */\nexport function appendIntervalPropertyChangedToRevertibles(\n\tinterval: SequenceInterval,\n\tdeltas: PropertySet,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.push({\n\t\tevent: IntervalOpType.PROPERTY_CHANGED,\n\t\tinterval,\n\t\tpropertyDeltas: deltas,\n\t});\n\n\treturn revertibles;\n}\n\nfunction addIfIntervalEndpoint(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\tstartIntervals: { offset: number; interval: SequenceInterval }[],\n\tendIntervals: { offset: number; interval: SequenceInterval }[],\n) {\n\tif (refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tstartIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t} else if (refTypeIncludesFlag(ref.refType, ReferenceType.RangeEnd)) {\n\t\tconst interval = ref.properties?.interval;\n\t\tif (interval && interval instanceof SequenceInterval) {\n\t\t\tendIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction addIfRevertibleRef(\n\tref: LocalReferencePosition,\n\tsegmentLengths: number,\n\trevertibleRefs: {\n\t\trevertible: IntervalRevertible;\n\t\toffset: number;\n\t\tisStart: boolean;\n\t}[],\n) {\n\tconst revertible = ref.properties?.revertible;\n\tif (revertible) {\n\t\trevertibleRefs.push({\n\t\t\trevertible,\n\t\t\toffset: segmentLengths + ref.getOffset(),\n\t\t\tisStart: refTypeIncludesFlag(ref.refType, ReferenceType.RangeBegin),\n\t\t});\n\t}\n}\n\n/**\n * Create revertibles for SharedStringDeltas, handling indirectly modified intervals\n * (e.g. reverting remove of a range that contains an interval will move the interval back)\n * @internal\n */\nexport function appendSharedStringDeltaToRevertibles(\n\tstring: SharedString,\n\tdelta: SequenceDeltaEvent,\n\trevertibles: SharedStringRevertible[],\n) {\n\tif (delta.ranges.length === 0) {\n\t\treturn;\n\t}\n\tif (delta.deltaOperation === MergeTreeDeltaType.REMOVE) {\n\t\tconst startIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst endIntervals: { offset: number; interval: SequenceInterval }[] = [];\n\t\tconst revertibleRefs: {\n\t\t\trevertible: IntervalRevertible;\n\t\t\toffset: number;\n\t\t\tisStart: boolean;\n\t\t}[] = [];\n\t\tlet segmentLengths = 0;\n\n\t\t// find interval endpoints in each segment\n\t\tfor (const deltaRange of delta.ranges) {\n\t\t\tconst refs = deltaRange.segment.localRefs;\n\t\t\tif (refs !== undefined && deltaRange.position !== -1) {\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\taddIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals);\n\t\t\t\t\taddIfRevertibleRef(ref, segmentLengths, revertibleRefs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsegmentLengths += deltaRange.segment.cachedLength;\n\t\t}\n\n\t\tif (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {\n\t\t\tconst removeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t\t\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, removeRevertibles);\n\t\t\tassert(\n\t\t\t\tremoveRevertibles.length === 1,\n\t\t\t\t0x6c4 /* Remove revertible should be a single delta */,\n\t\t\t);\n\n\t\t\tconst revertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE> = {\n\t\t\t\tevent: IntervalOpType.POSITION_REMOVE,\n\t\t\t\tintervals: [],\n\t\t\t\trevertibleRefs,\n\t\t\t\tmergeTreeRevertible: removeRevertibles[0],\n\t\t\t};\n\n\t\t\t// add an interval for each startInterval, accounting for any corresponding endIntervals\n\t\t\tstartIntervals.forEach(({ interval, offset }) => {\n\t\t\t\t// find any corresponding end for this interval\n\t\t\t\tconst endIntervalIndex = endIntervals.findIndex((end) => {\n\t\t\t\t\treturn end.interval === interval;\n\t\t\t\t});\n\t\t\t\tlet endOffset: number | undefined;\n\t\t\t\tif (endIntervalIndex !== -1) {\n\t\t\t\t\tendOffset = endIntervals[endIntervalIndex].offset;\n\t\t\t\t\tendIntervals.splice(endIntervalIndex, 1);\n\t\t\t\t}\n\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tstartOffset: offset,\n\t\t\t\t\tendOffset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// add any remaining endIntervals that aren't matched with a startInterval\n\t\t\tendIntervals.forEach(({ interval, offset }) => {\n\t\t\t\trevertible.intervals.push({\n\t\t\t\t\tintervalId: interval.getIntervalId(),\n\t\t\t\t\tlabel: interval.properties.referenceRangeLabels[0],\n\t\t\t\t\tendOffset: offset,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trevertibles.push(revertible);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Handle any merge tree delta that is not REMOVE or is REMOVE with no interval endpoints\n\tconst mergeTreeRevertibles: MergeTreeDeltaRevertible[] = [];\n\t// Allow merging MergeTreeDeltaRevertible with previous\n\tif (revertibles.length > 0 && isMergeTreeDeltaRevertible(revertibles[revertibles.length - 1])) {\n\t\tmergeTreeRevertibles.push(revertibles.pop() as MergeTreeDeltaRevertible);\n\t}\n\tappendToMergeTreeDeltaRevertibles(delta.deltaArgs, mergeTreeRevertibles);\n\trevertibles.push(...mergeTreeRevertibles);\n}\n\n/**\n * Clean up resources held by revertibles that are no longer needed.\n * @internal\n */\nexport function discardSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\trevertibles.forEach((r) => {\n\t\tif (isMergeTreeDeltaRevertible(r)) {\n\t\t\tdiscardMergeTreeDeltaRevertible([r]);\n\t\t} else if (r.event === IntervalOpType.CHANGE || r.event === IntervalOpType.DELETE) {\n\t\t\tsharedString.removeLocalReferencePosition(r.start);\n\t\t\tsharedString.removeLocalReferencePosition(r.end);\n\t\t}\n\t});\n}\n\nfunction getSlidePosition(string: SharedString, lref: LocalReferencePosition, pos: number): number {\n\tconst slide = getSlideToSegoff(\n\t\t{ segment: lref.getSegment(), offset: undefined },\n\t\tlref.slidingPreference,\n\t);\n\treturn slide?.segment !== undefined &&\n\t\tslide.offset !== undefined &&\n\t\tstring.getPosition(slide.segment) !== -1 &&\n\t\t(pos < 0 || pos >= string.getLength())\n\t\t? string.getPosition(slide.segment) + slide.offset\n\t\t: pos;\n}\n\nfunction isValidRange(\n\tstart: number,\n\tstartSlide: SlidingPreference | undefined,\n\tend: number,\n\tendSlide: SlidingPreference | undefined,\n\tstring: SharedString,\n) {\n\treturn (\n\t\tstart >= 0 &&\n\t\tstart < string.getLength() &&\n\t\tend >= 0 &&\n\t\tend < string.getLength() &&\n\t\t(start < end ||\n\t\t\t(start === end &&\n\t\t\t\t(startSlide === SlidingPreference.FORWARD ||\n\t\t\t\t\tendSlide !== SlidingPreference.FORWARD)))\n\t);\n}\n\nfunction revertLocalAdd(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.ADD>,\n) {\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tstring.getIntervalCollection(label).removeIntervalById(id);\n}\n\nfunction createSequencePlace(\n\tpos: number,\n\tnewSlidingPreference: SlidingPreference | undefined,\n\toldSlidingPreference: SlidingPreference | undefined = undefined,\n): number | InteriorSequencePlace {\n\treturn newSlidingPreference === SlidingPreference.BACKWARD ||\n\t\t(newSlidingPreference === undefined && oldSlidingPreference === SlidingPreference.BACKWARD)\n\t\t? {\n\t\t\t\tpos,\n\t\t\t\tside: Side.After,\n\t\t }\n\t\t: newSlidingPreference === SlidingPreference.FORWARD &&\n\t\t oldSlidingPreference === SlidingPreference.BACKWARD\n\t\t? {\n\t\t\t\tpos,\n\t\t\t\tside: Side.Before,\n\t\t }\n\t\t: pos; // Avoid setting side if possible since stickiness may not be enabled\n}\n\nfunction revertLocalDelete(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.DELETE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\t// reusing the id causes eventual consistency bugs, so it is removed here and recreated in add\n\tconst { intervalId, ...props } = revertible.interval.properties;\n\tif (\n\t\tisValidRange(\n\t\t\tstartSlidePos,\n\t\t\trevertible.start.slidingPreference,\n\t\t\tendSlidePos,\n\t\t\trevertible.end.slidingPreference,\n\t\t\tstring,\n\t\t)\n\t) {\n\t\tconst int = collection.add({\n\t\t\tstart: createSequencePlace(startSlidePos, revertible.start.slidingPreference),\n\t\t\tend: createSequencePlace(endSlidePos, revertible.end.slidingPreference),\n\t\t\tprops,\n\t\t});\n\n\t\tidMap.forEach((newId, oldId) => {\n\t\t\tif (intervalId === newId) {\n\t\t\t\tidMap.set(oldId, getUpdatedIdFromInterval(int));\n\t\t\t}\n\t\t});\n\t\tidMap.set(intervalId, int.getIntervalId());\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalChange(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.CHANGE>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst collection = string.getIntervalCollection(label);\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst start = string.localReferencePositionToPosition(revertible.start);\n\tconst startSlidePos = getSlidePosition(string, revertible.start, start);\n\tconst end = string.localReferencePositionToPosition(revertible.end);\n\tconst endSlidePos = getSlidePosition(string, revertible.end, end);\n\tconst interval = collection.getIntervalById(id);\n\tif (\n\t\tinterval !== undefined &&\n\t\tisValidRange(\n\t\t\tstartSlidePos,\n\t\t\trevertible.start.slidingPreference ?? interval.start.slidingPreference,\n\t\t\tendSlidePos,\n\t\t\trevertible.end.slidingPreference ?? interval.end.slidingPreference,\n\t\t\tstring,\n\t\t)\n\t) {\n\t\tcollection.change(\n\t\t\tid,\n\t\t\tcreateSequencePlace(\n\t\t\t\tstartSlidePos,\n\t\t\t\trevertible.start.slidingPreference,\n\t\t\t\tinterval.start.slidingPreference,\n\t\t\t),\n\t\t\tcreateSequencePlace(\n\t\t\t\tendSlidePos,\n\t\t\t\trevertible.end.slidingPreference,\n\t\t\t\tinterval.end.slidingPreference,\n\t\t\t),\n\t\t);\n\t}\n\n\tstring.removeLocalReferencePosition(revertible.start);\n\tstring.removeLocalReferencePosition(revertible.end);\n}\n\nfunction revertLocalPropertyChanged(\n\tstring: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,\n) {\n\tconst label = revertible.interval.properties.referenceRangeLabels[0];\n\tconst id = getUpdatedIdFromInterval(revertible.interval);\n\tconst newProps = revertible.propertyDeltas;\n\tstring.getIntervalCollection(label).changeProperties(id, newProps);\n}\n\nfunction newPosition(offset: number | undefined, restoredRanges: SortedRangeSet) {\n\tif (offset === undefined) {\n\t\treturn undefined;\n\t}\n\n\tlet offsetFromSegment = offset;\n\tfor (const rangeInfo of restoredRanges.items) {\n\t\tif (offsetFromSegment < rangeInfo.length) {\n\t\t\t// find the segment inside the range\n\t\t\tfor (const range of rangeInfo.ranges) {\n\t\t\t\tif (range.segment.cachedLength > offsetFromSegment) {\n\t\t\t\t\treturn { segment: range.segment, offset: offsetFromSegment };\n\t\t\t\t}\n\t\t\t\toffsetFromSegment -= range.segment.cachedLength;\n\t\t\t}\n\t\t}\n\t\toffsetFromSegment -= rangeInfo.length;\n\t}\n\n\treturn undefined;\n}\n\nfunction newEndpointPosition(\n\toffset: number | undefined,\n\trestoredRanges: SortedRangeSet,\n\tsharedString: SharedString,\n) {\n\tconst pos = newPosition(offset, restoredRanges);\n\treturn pos === undefined ? undefined : sharedString.getPosition(pos.segment) + pos.offset;\n}\n\ninterface RangeInfo {\n\tranges: readonly Readonly<ISequenceDeltaRange<MergeTreeDeltaOperationType>>[];\n\tlength: number;\n}\n\nclass SortedRangeSet extends SortedSet<RangeInfo, string> {\n\tprotected getKey(item: RangeInfo): string {\n\t\treturn item.ranges[0].segment.ordinal;\n\t}\n}\n\nfunction revertLocalSequenceRemove(\n\tsharedString: SharedString,\n\trevertible: TypedRevertible<typeof IntervalOpType.POSITION_REMOVE>,\n) {\n\tconst restoredRanges = new SortedRangeSet();\n\tconst saveSegments = (event: SequenceDeltaEvent) => {\n\t\tif (event.ranges.length > 0) {\n\t\t\tlet length = 0;\n\t\t\tevent.ranges.forEach((range) => {\n\t\t\t\tlength += range.segment.cachedLength;\n\t\t\t});\n\t\t\trestoredRanges.addOrUpdate({ ranges: event.ranges, length });\n\t\t}\n\t};\n\tsharedString.on(\"sequenceDelta\", saveSegments);\n\trevertMergeTreeDeltaRevertibles(sharedString, [revertible.mergeTreeRevertible]);\n\tsharedString.off(\"sequenceDelta\", saveSegments);\n\n\trevertible.intervals.forEach((intervalInfo) => {\n\t\tconst intervalCollection = sharedString.getIntervalCollection(intervalInfo.label);\n\t\tconst intervalId = getUpdatedId(intervalInfo.intervalId);\n\t\tconst interval = intervalCollection.getIntervalById(intervalId);\n\t\tif (interval !== undefined) {\n\t\t\tconst start =\n\t\t\t\tnewEndpointPosition(intervalInfo.startOffset, restoredRanges, sharedString) ??\n\t\t\t\tsharedString.localReferencePositionToPosition(interval.start);\n\t\t\tconst end =\n\t\t\t\tnewEndpointPosition(intervalInfo.endOffset, restoredRanges, sharedString) ??\n\t\t\t\tsharedString.localReferencePositionToPosition(interval.end);\n\t\t\tif (\n\t\t\t\tisValidRange(\n\t\t\t\t\tstart,\n\t\t\t\t\tinterval.start.slidingPreference,\n\t\t\t\t\tend,\n\t\t\t\t\tinterval.end.slidingPreference,\n\t\t\t\t\tsharedString,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tintervalCollection.change(\n\t\t\t\t\tintervalId,\n\t\t\t\t\tcreateSequencePlace(start, interval.start.slidingPreference),\n\t\t\t\t\tcreateSequencePlace(end, interval.end.slidingPreference),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\t// fix up the local references used by delete and change revertibles\n\trevertible.revertibleRefs.forEach((revertibleRef) => {\n\t\tassert(\n\t\t\trevertibleRef.revertible.event === IntervalOpType.CHANGE ||\n\t\t\t\trevertibleRef.revertible.event === IntervalOpType.DELETE,\n\t\t\t0x6c5 /* revertible is not delete or change */,\n\t\t);\n\t\tconst pos = newPosition(revertibleRef.offset, restoredRanges);\n\t\tif (pos !== undefined) {\n\t\t\tif (revertibleRef.isStart) {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.start);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeBegin,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t\trevertibleRef.revertible.start.slidingPreference,\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.start = newRef;\n\t\t\t} else {\n\t\t\t\tsharedString.removeLocalReferencePosition(revertibleRef.revertible.end);\n\t\t\t\tconst newRef = sharedString.createLocalReferencePosition(\n\t\t\t\t\tpos.segment as SharedStringSegment,\n\t\t\t\t\tpos.offset,\n\t\t\t\t\tReferenceType.StayOnRemove | ReferenceType.RangeEnd,\n\t\t\t\t\t{ revertible: revertibleRef.revertible },\n\t\t\t\t\trevertibleRef.revertible.end.slidingPreference,\n\t\t\t\t);\n\t\t\t\trevertibleRef.revertible.end = newRef;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/**\n * Invoke revertibles to reverse prior edits\n * @internal\n */\nexport function revertSharedStringRevertibles(\n\tsharedString: SharedString,\n\trevertibles: SharedStringRevertible[],\n) {\n\twhile (revertibles.length > 0) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst r = revertibles.pop()!;\n\t\tif (\"event\" in r) {\n\t\t\tconst event = r.event;\n\t\t\tswitch (event) {\n\t\t\t\tcase IntervalOpType.ADD:\n\t\t\t\t\trevertLocalAdd(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.DELETE:\n\t\t\t\t\trevertLocalDelete(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.CHANGE:\n\t\t\t\t\trevertLocalChange(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.PROPERTY_CHANGED:\n\t\t\t\t\trevertLocalPropertyChanged(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tcase IntervalOpType.POSITION_REMOVE:\n\t\t\t\t\trevertLocalSequenceRemove(sharedString, r);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(event);\n\t\t\t}\n\t\t} else {\n\t\t\trevertMergeTreeDeltaRevertibles(sharedString, [r]);\n\t\t}\n\t}\n}\n"]}