@fluidframework/sequence 2.0.0-dev.5.3.2.178189 → 2.0.0-dev.6.4.0.191457

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 (225) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +4 -3
  3. package/dist/defaultMap.d.ts +1 -1
  4. package/dist/defaultMap.d.ts.map +1 -1
  5. package/dist/defaultMap.js +9 -10
  6. package/dist/defaultMap.js.map +1 -1
  7. package/dist/defaultMapInterfaces.d.ts +1 -1
  8. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  9. package/dist/defaultMapInterfaces.js.map +1 -1
  10. package/dist/index.d.ts +3 -3
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +12 -9
  13. package/dist/index.js.map +1 -1
  14. package/dist/intervalCollection.d.ts +11 -424
  15. package/dist/intervalCollection.d.ts.map +1 -1
  16. package/dist/intervalCollection.js +74 -815
  17. package/dist/intervalCollection.js.map +1 -1
  18. package/dist/intervalIndex/endpointInRangeIndex.d.ts +20 -0
  19. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  20. package/dist/intervalIndex/endpointInRangeIndex.js +60 -0
  21. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -0
  22. package/dist/intervalIndex/endpointIndex.d.ts +21 -0
  23. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
  24. package/dist/intervalIndex/endpointIndex.js +42 -0
  25. package/dist/intervalIndex/endpointIndex.js.map +1 -0
  26. package/dist/intervalIndex/idIntervalIndex.d.ts +12 -0
  27. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  28. package/dist/intervalIndex/idIntervalIndex.js +41 -0
  29. package/dist/intervalIndex/idIntervalIndex.js.map +1 -0
  30. package/dist/intervalIndex/index.d.ts +5 -0
  31. package/dist/intervalIndex/index.d.ts.map +1 -1
  32. package/dist/intervalIndex/index.js +9 -1
  33. package/dist/intervalIndex/index.js.map +1 -1
  34. package/dist/intervalIndex/intervalIndex.d.ts +29 -0
  35. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
  36. package/dist/intervalIndex/intervalIndex.js +7 -0
  37. package/dist/intervalIndex/intervalIndex.js.map +1 -0
  38. package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
  39. package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  40. package/dist/intervalIndex/intervalIndexUtils.js +22 -0
  41. package/dist/intervalIndex/intervalIndexUtils.js.map +1 -0
  42. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
  43. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  44. package/dist/intervalIndex/overlappingIntervalsIndex.js +3 -3
  45. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  46. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +5 -5
  47. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  48. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  49. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  50. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  51. package/dist/intervalIndex/startpointInRangeIndex.d.ts +20 -0
  52. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  53. package/dist/intervalIndex/startpointInRangeIndex.js +62 -0
  54. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -0
  55. package/dist/intervalTree.d.ts +2 -56
  56. package/dist/intervalTree.d.ts.map +1 -1
  57. package/dist/intervalTree.js +2 -11
  58. package/dist/intervalTree.js.map +1 -1
  59. package/dist/intervals/index.d.ts +8 -0
  60. package/dist/intervals/index.d.ts.map +1 -0
  61. package/dist/intervals/index.js +23 -0
  62. package/dist/intervals/index.js.map +1 -0
  63. package/dist/intervals/interval.d.ts +88 -0
  64. package/dist/intervals/interval.d.ts.map +1 -0
  65. package/dist/intervals/interval.js +180 -0
  66. package/dist/intervals/interval.js.map +1 -0
  67. package/dist/intervals/intervalUtils.d.ts +200 -0
  68. package/dist/intervals/intervalUtils.d.ts.map +1 -0
  69. package/dist/intervals/intervalUtils.js +79 -0
  70. package/dist/intervals/intervalUtils.js.map +1 -0
  71. package/dist/intervals/sequenceInterval.d.ts +132 -0
  72. package/dist/intervals/sequenceInterval.d.ts.map +1 -0
  73. package/dist/intervals/sequenceInterval.js +313 -0
  74. package/dist/intervals/sequenceInterval.js.map +1 -0
  75. package/dist/packageVersion.d.ts +1 -1
  76. package/dist/packageVersion.js +1 -1
  77. package/dist/packageVersion.js.map +1 -1
  78. package/dist/revertibles.d.ts +1 -1
  79. package/dist/revertibles.d.ts.map +1 -1
  80. package/dist/revertibles.js +45 -52
  81. package/dist/revertibles.js.map +1 -1
  82. package/dist/sequence.d.ts +33 -4
  83. package/dist/sequence.d.ts.map +1 -1
  84. package/dist/sequence.js +91 -47
  85. package/dist/sequence.js.map +1 -1
  86. package/dist/sequenceDeltaEvent.d.ts +8 -3
  87. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  88. package/dist/sequenceDeltaEvent.js +3 -4
  89. package/dist/sequenceDeltaEvent.js.map +1 -1
  90. package/dist/sharedIntervalCollection.d.ts +2 -1
  91. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  92. package/dist/sharedIntervalCollection.js +2 -2
  93. package/dist/sharedIntervalCollection.js.map +1 -1
  94. package/dist/sharedSequence.d.ts +9 -0
  95. package/dist/sharedSequence.d.ts.map +1 -1
  96. package/dist/sharedSequence.js +9 -6
  97. package/dist/sharedSequence.js.map +1 -1
  98. package/dist/sharedString.d.ts.map +1 -1
  99. package/dist/sharedString.js +9 -29
  100. package/dist/sharedString.js.map +1 -1
  101. package/lib/defaultMap.d.ts +1 -1
  102. package/lib/defaultMap.d.ts.map +1 -1
  103. package/lib/defaultMap.js +5 -6
  104. package/lib/defaultMap.js.map +1 -1
  105. package/lib/defaultMapInterfaces.d.ts +1 -1
  106. package/lib/defaultMapInterfaces.d.ts.map +1 -1
  107. package/lib/defaultMapInterfaces.js.map +1 -1
  108. package/lib/index.d.ts +3 -3
  109. package/lib/index.d.ts.map +1 -1
  110. package/lib/index.js +3 -2
  111. package/lib/index.js.map +1 -1
  112. package/lib/intervalCollection.d.ts +11 -424
  113. package/lib/intervalCollection.d.ts.map +1 -1
  114. package/lib/intervalCollection.js +43 -776
  115. package/lib/intervalCollection.js.map +1 -1
  116. package/lib/intervalIndex/endpointInRangeIndex.d.ts +20 -0
  117. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  118. package/lib/intervalIndex/endpointInRangeIndex.js +56 -0
  119. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
  120. package/lib/intervalIndex/endpointIndex.d.ts +21 -0
  121. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
  122. package/lib/intervalIndex/endpointIndex.js +38 -0
  123. package/lib/intervalIndex/endpointIndex.js.map +1 -0
  124. package/lib/intervalIndex/idIntervalIndex.d.ts +12 -0
  125. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  126. package/lib/intervalIndex/idIntervalIndex.js +37 -0
  127. package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
  128. package/lib/intervalIndex/index.d.ts +5 -0
  129. package/lib/intervalIndex/index.d.ts.map +1 -1
  130. package/lib/intervalIndex/index.js +4 -0
  131. package/lib/intervalIndex/index.js.map +1 -1
  132. package/lib/intervalIndex/intervalIndex.d.ts +29 -0
  133. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
  134. package/lib/intervalIndex/intervalIndex.js +6 -0
  135. package/lib/intervalIndex/intervalIndex.js.map +1 -0
  136. package/lib/intervalIndex/intervalIndexUtils.d.ts +17 -0
  137. package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  138. package/lib/intervalIndex/intervalIndexUtils.js +18 -0
  139. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
  140. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
  141. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  142. package/lib/intervalIndex/overlappingIntervalsIndex.js +1 -1
  143. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  144. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  145. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  146. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  147. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  148. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  149. package/lib/intervalIndex/startpointInRangeIndex.d.ts +20 -0
  150. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  151. package/lib/intervalIndex/startpointInRangeIndex.js +58 -0
  152. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
  153. package/lib/intervalTree.d.ts +2 -56
  154. package/lib/intervalTree.d.ts.map +1 -1
  155. package/lib/intervalTree.js +2 -11
  156. package/lib/intervalTree.js.map +1 -1
  157. package/lib/intervals/index.d.ts +8 -0
  158. package/lib/intervals/index.d.ts.map +1 -0
  159. package/lib/intervals/index.js +8 -0
  160. package/lib/intervals/index.js.map +1 -0
  161. package/lib/intervals/interval.d.ts +88 -0
  162. package/lib/intervals/interval.d.ts.map +1 -0
  163. package/lib/intervals/interval.js +175 -0
  164. package/lib/intervals/interval.js.map +1 -0
  165. package/lib/intervals/intervalUtils.d.ts +200 -0
  166. package/lib/intervals/intervalUtils.d.ts.map +1 -0
  167. package/lib/intervals/intervalUtils.js +74 -0
  168. package/lib/intervals/intervalUtils.js.map +1 -0
  169. package/lib/intervals/sequenceInterval.d.ts +132 -0
  170. package/lib/intervals/sequenceInterval.d.ts.map +1 -0
  171. package/lib/intervals/sequenceInterval.js +305 -0
  172. package/lib/intervals/sequenceInterval.js.map +1 -0
  173. package/lib/packageVersion.d.ts +1 -1
  174. package/lib/packageVersion.js +1 -1
  175. package/lib/packageVersion.js.map +1 -1
  176. package/lib/revertibles.d.ts +1 -1
  177. package/lib/revertibles.d.ts.map +1 -1
  178. package/lib/revertibles.js +28 -35
  179. package/lib/revertibles.js.map +1 -1
  180. package/lib/sequence.d.ts +33 -4
  181. package/lib/sequence.d.ts.map +1 -1
  182. package/lib/sequence.js +86 -41
  183. package/lib/sequence.js.map +1 -1
  184. package/lib/sequenceDeltaEvent.d.ts +8 -3
  185. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  186. package/lib/sequenceDeltaEvent.js +2 -3
  187. package/lib/sequenceDeltaEvent.js.map +1 -1
  188. package/lib/sharedIntervalCollection.d.ts +2 -1
  189. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  190. package/lib/sharedIntervalCollection.js +1 -1
  191. package/lib/sharedIntervalCollection.js.map +1 -1
  192. package/lib/sharedSequence.d.ts +9 -0
  193. package/lib/sharedSequence.d.ts.map +1 -1
  194. package/lib/sharedSequence.js +8 -5
  195. package/lib/sharedSequence.js.map +1 -1
  196. package/lib/sharedString.d.ts.map +1 -1
  197. package/lib/sharedString.js +9 -29
  198. package/lib/sharedString.js.map +1 -1
  199. package/package.json +29 -32
  200. package/src/defaultMap.ts +2 -1
  201. package/src/defaultMapInterfaces.ts +1 -1
  202. package/src/index.ts +18 -12
  203. package/src/intervalCollection.ts +42 -1225
  204. package/src/intervalIndex/endpointInRangeIndex.ts +104 -0
  205. package/src/intervalIndex/endpointIndex.ts +78 -0
  206. package/src/intervalIndex/idIntervalIndex.ts +58 -0
  207. package/src/intervalIndex/index.ts +5 -0
  208. package/src/intervalIndex/intervalIndex.ts +31 -0
  209. package/src/intervalIndex/intervalIndexUtils.ts +27 -0
  210. package/src/intervalIndex/overlappingIntervalsIndex.ts +2 -6
  211. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -1
  212. package/src/intervalIndex/sequenceIntervalIndexes.ts +1 -1
  213. package/src/intervalIndex/startpointInRangeIndex.ts +109 -0
  214. package/src/intervalTree.ts +3 -75
  215. package/src/intervals/index.ts +25 -0
  216. package/src/intervals/interval.ts +230 -0
  217. package/src/intervals/intervalUtils.ts +256 -0
  218. package/src/intervals/sequenceInterval.ts +494 -0
  219. package/src/packageVersion.ts +1 -1
  220. package/src/revertibles.ts +24 -13
  221. package/src/sequence.ts +100 -35
  222. package/src/sequenceDeltaEvent.ts +12 -4
  223. package/src/sharedIntervalCollection.ts +2 -3
  224. package/src/sharedSequence.ts +11 -5
  225. package/src/sharedString.ts +8 -25
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.sequenceIntervalHelpers = exports.compareSequenceIntervalStarts = exports.compareSequenceIntervalEnds = exports.createSequenceInterval = exports.createPositionReferenceFromSegoff = exports.SequenceInterval = void 0;
8
+ /* eslint-disable no-bitwise */
9
+ const merge_tree_1 = require("@fluidframework/merge-tree");
10
+ const core_utils_1 = require("@fluidframework/core-utils");
11
+ const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
12
+ const intervalUtils_1 = require("./intervalUtils");
13
+ const reservedIntervalIdKey = "intervalId";
14
+ /**
15
+ * Interval implementation whose ends are associated with positions in a mutatable sequence.
16
+ * As such, when content is inserted into the middle of the interval, the interval expands to
17
+ * include that content.
18
+ *
19
+ * @remarks The endpoint's position should be treated exclusively to get reasonable behavior--i.e.
20
+ * an interval referring to "hello" in "hello world" should have a start position of 0 and an end
21
+ * position of 5.
22
+ *
23
+ * To see why, consider what happens if "llo wor" is removed from the string to make "held".
24
+ * The interval's startpoint remains on the "h" (it isn't altered), but the interval's endpoint
25
+ * slides forward to the next unremoved position, which is the "l" in "held".
26
+ * Users would generally expect the interval to now refer to "he" (as it is the subset of content
27
+ * remaining after the removal), hence the "l" should be excluded.
28
+ * If the interval endpoint was treated inclusively, the interval would now refer to "hel", which
29
+ * is undesirable.
30
+ *
31
+ * Since the end of an interval is treated exclusively but cannot be greater than or equal to the
32
+ * length of the associated sequence, application models which leverage interval collections should
33
+ * consider inserting a marker at the end of the sequence to represent the end of the content.
34
+ */
35
+ class SequenceInterval {
36
+ constructor(client,
37
+ /**
38
+ * Start endpoint of this interval.
39
+ * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.
40
+ */
41
+ start,
42
+ /**
43
+ * End endpoint of this interval.
44
+ * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.
45
+ */
46
+ end, intervalType, props, stickiness = intervalUtils_1.IntervalStickiness.END) {
47
+ this.client = client;
48
+ this.start = start;
49
+ this.end = end;
50
+ this.intervalType = intervalType;
51
+ this.stickiness = stickiness;
52
+ this.propertyManager = new merge_tree_1.PropertiesManager();
53
+ this.properties = {};
54
+ if (props) {
55
+ this.addProperties(props);
56
+ }
57
+ }
58
+ /**
59
+ * Subscribes to position change events on this interval if there are no current listeners.
60
+ * @internal
61
+ */
62
+ addPositionChangeListeners(beforePositionChange, afterPositionChange) {
63
+ var _a, _b;
64
+ if (this.callbacks === undefined) {
65
+ this.callbacks = {
66
+ beforePositionChange,
67
+ afterPositionChange,
68
+ };
69
+ const startCbs = ((_a = this.start).callbacks ?? (_a.callbacks = {}));
70
+ const endCbs = ((_b = this.end).callbacks ?? (_b.callbacks = {}));
71
+ startCbs.beforeSlide = endCbs.beforeSlide = beforePositionChange;
72
+ startCbs.afterSlide = endCbs.afterSlide = afterPositionChange;
73
+ }
74
+ }
75
+ /**
76
+ * Removes the currently subscribed position change listeners.
77
+ * @internal
78
+ */
79
+ removePositionChangeListeners() {
80
+ if (this.callbacks) {
81
+ this.callbacks = undefined;
82
+ this.start.callbacks = undefined;
83
+ this.end.callbacks = undefined;
84
+ }
85
+ }
86
+ /**
87
+ * {@inheritDoc ISerializableInterval.serialize}
88
+ * @internal
89
+ */
90
+ serialize() {
91
+ const startPosition = this.client.localReferencePositionToPosition(this.start);
92
+ const endPosition = this.client.localReferencePositionToPosition(this.end);
93
+ const serializedInterval = {
94
+ end: endPosition,
95
+ intervalType: this.intervalType,
96
+ sequenceNumber: this.client.getCurrentSeq(),
97
+ start: startPosition,
98
+ };
99
+ if (this.properties) {
100
+ serializedInterval.properties = this.properties;
101
+ }
102
+ if (this.stickiness !== intervalUtils_1.IntervalStickiness.END) {
103
+ serializedInterval.stickiness = this.stickiness;
104
+ }
105
+ return serializedInterval;
106
+ }
107
+ /**
108
+ * {@inheritDoc IInterval.clone}
109
+ */
110
+ clone() {
111
+ return new SequenceInterval(this.client, this.start, this.end, this.intervalType, this.properties, this.stickiness);
112
+ }
113
+ /**
114
+ * {@inheritDoc IInterval.compare}
115
+ */
116
+ compare(b) {
117
+ const startResult = this.compareStart(b);
118
+ if (startResult === 0) {
119
+ const endResult = this.compareEnd(b);
120
+ if (endResult === 0) {
121
+ const thisId = this.getIntervalId();
122
+ if (thisId) {
123
+ const bId = b.getIntervalId();
124
+ if (bId) {
125
+ return thisId > bId ? 1 : thisId < bId ? -1 : 0;
126
+ }
127
+ return 0;
128
+ }
129
+ return 0;
130
+ }
131
+ else {
132
+ return endResult;
133
+ }
134
+ }
135
+ else {
136
+ return startResult;
137
+ }
138
+ }
139
+ /**
140
+ * {@inheritDoc IInterval.compareStart}
141
+ */
142
+ compareStart(b) {
143
+ return (0, merge_tree_1.compareReferencePositions)(this.start, b.start);
144
+ }
145
+ /**
146
+ * {@inheritDoc IInterval.compareEnd}
147
+ */
148
+ compareEnd(b) {
149
+ return (0, merge_tree_1.compareReferencePositions)(this.end, b.end);
150
+ }
151
+ /**
152
+ * {@inheritDoc IInterval.overlaps}
153
+ */
154
+ overlaps(b) {
155
+ const result = (0, merge_tree_1.compareReferencePositions)(this.start, b.end) <= 0 &&
156
+ (0, merge_tree_1.compareReferencePositions)(this.end, b.start) >= 0;
157
+ return result;
158
+ }
159
+ /**
160
+ * {@inheritDoc ISerializableInterval.getIntervalId}
161
+ */
162
+ getIntervalId() {
163
+ const id = this.properties?.[reservedIntervalIdKey];
164
+ (0, core_utils_1.assert)(id !== undefined, 0x5e2 /* interval ID should not be undefined */);
165
+ return `${id}`;
166
+ }
167
+ /**
168
+ * {@inheritDoc IInterval.union}
169
+ * @internal
170
+ */
171
+ union(b) {
172
+ return new SequenceInterval(this.client, (0, merge_tree_1.minReferencePosition)(this.start, b.start), (0, merge_tree_1.maxReferencePosition)(this.end, b.end), this.intervalType);
173
+ }
174
+ /**
175
+ * {@inheritDoc ISerializableInterval.addProperties}
176
+ * @internal
177
+ */
178
+ addProperties(newProps, collab = false, seq, op) {
179
+ this.initializeProperties();
180
+ return this.propertyManager.addProperties(this.properties, newProps, op, seq, collab);
181
+ }
182
+ /**
183
+ * @returns whether this interval overlaps two numerical positions.
184
+ */
185
+ overlapsPos(bstart, bend) {
186
+ const startPos = this.client.localReferencePositionToPosition(this.start);
187
+ const endPos = this.client.localReferencePositionToPosition(this.end);
188
+ return endPos > bstart && startPos < bend;
189
+ }
190
+ /**
191
+ * {@inheritDoc IInterval.modify}
192
+ * @internal
193
+ */
194
+ modify(label, start, end, op, localSeq, stickiness = intervalUtils_1.IntervalStickiness.END) {
195
+ const getRefType = (baseType) => {
196
+ let refType = baseType;
197
+ if (op === undefined) {
198
+ refType &= ~merge_tree_1.ReferenceType.SlideOnRemove;
199
+ refType |= merge_tree_1.ReferenceType.StayOnRemove;
200
+ }
201
+ return refType;
202
+ };
203
+ let startRef = this.start;
204
+ if (start !== undefined) {
205
+ startRef = createPositionReference(this.client, start, getRefType(this.start.refType), op, undefined, localSeq, (0, intervalUtils_1.startReferenceSlidingPreference)(stickiness));
206
+ if (this.start.properties) {
207
+ startRef.addProperties(this.start.properties);
208
+ }
209
+ }
210
+ let endRef = this.end;
211
+ if (end !== undefined) {
212
+ endRef = createPositionReference(this.client, end, getRefType(this.end.refType), op, undefined, localSeq, (0, intervalUtils_1.endReferenceSlidingPreference)(stickiness));
213
+ if (this.end.properties) {
214
+ endRef.addProperties(this.end.properties);
215
+ }
216
+ }
217
+ const newInterval = new SequenceInterval(this.client, startRef, endRef, this.intervalType);
218
+ if (this.properties) {
219
+ newInterval.initializeProperties();
220
+ this.propertyManager.copyTo(this.properties, newInterval.properties, newInterval.propertyManager);
221
+ }
222
+ return newInterval;
223
+ }
224
+ initializeProperties() {
225
+ if (!this.propertyManager) {
226
+ this.propertyManager = new merge_tree_1.PropertiesManager();
227
+ }
228
+ if (!this.properties) {
229
+ this.properties = (0, merge_tree_1.createMap)();
230
+ }
231
+ }
232
+ }
233
+ exports.SequenceInterval = SequenceInterval;
234
+ function createPositionReferenceFromSegoff(client, segoff, refType, op, localSeq, fromSnapshot, slidingPreference) {
235
+ if (segoff.segment) {
236
+ const ref = client.createLocalReferencePosition(segoff.segment, segoff.offset, refType, undefined, slidingPreference);
237
+ return ref;
238
+ }
239
+ // Creating references on detached segments is allowed for:
240
+ // - Transient segments
241
+ // - References coming from a remote client (location may have been concurrently removed)
242
+ // - References being rebased to a new sequence number
243
+ // (segment they originally referred to may have been removed with no suitable replacement)
244
+ if (!op &&
245
+ !localSeq &&
246
+ !fromSnapshot &&
247
+ !(0, merge_tree_1.refTypeIncludesFlag)(refType, merge_tree_1.ReferenceType.Transient)) {
248
+ throw new telemetry_utils_1.UsageError("Non-transient references need segment");
249
+ }
250
+ return (0, merge_tree_1.createDetachedLocalReferencePosition)(refType);
251
+ }
252
+ exports.createPositionReferenceFromSegoff = createPositionReferenceFromSegoff;
253
+ function createPositionReference(client, pos, refType, op, fromSnapshot, localSeq, slidingPreference) {
254
+ let segoff;
255
+ if (op) {
256
+ (0, core_utils_1.assert)((refType & merge_tree_1.ReferenceType.SlideOnRemove) !== 0, 0x2f5 /* op create references must be SlideOnRemove */);
257
+ segoff = client.getContainingSegment(pos, {
258
+ referenceSequenceNumber: op.referenceSequenceNumber,
259
+ clientId: op.clientId,
260
+ });
261
+ segoff = (0, merge_tree_1.getSlideToSegoff)(segoff);
262
+ }
263
+ else {
264
+ (0, core_utils_1.assert)((refType & merge_tree_1.ReferenceType.SlideOnRemove) === 0 || !!fromSnapshot, 0x2f6 /* SlideOnRemove references must be op created */);
265
+ segoff = client.getContainingSegment(pos, undefined, localSeq);
266
+ }
267
+ return createPositionReferenceFromSegoff(client, segoff, refType, op, localSeq, fromSnapshot, slidingPreference);
268
+ }
269
+ function createSequenceInterval(label, start, end, client, intervalType, op, fromSnapshot, stickiness = intervalUtils_1.IntervalStickiness.END) {
270
+ let beginRefType = merge_tree_1.ReferenceType.RangeBegin;
271
+ let endRefType = merge_tree_1.ReferenceType.RangeEnd;
272
+ if (intervalType === intervalUtils_1.IntervalType.Transient) {
273
+ beginRefType = merge_tree_1.ReferenceType.Transient;
274
+ endRefType = merge_tree_1.ReferenceType.Transient;
275
+ }
276
+ else {
277
+ if (intervalType === intervalUtils_1.IntervalType.Nest) {
278
+ beginRefType = merge_tree_1.ReferenceType.NestBegin;
279
+ endRefType = merge_tree_1.ReferenceType.NestEnd;
280
+ }
281
+ // All non-transient interval references must eventually be SlideOnRemove
282
+ // To ensure eventual consistency, they must start as StayOnRemove when
283
+ // pending (created locally and creation op is not acked)
284
+ if (op || fromSnapshot) {
285
+ beginRefType |= merge_tree_1.ReferenceType.SlideOnRemove;
286
+ endRefType |= merge_tree_1.ReferenceType.SlideOnRemove;
287
+ }
288
+ else {
289
+ beginRefType |= merge_tree_1.ReferenceType.StayOnRemove;
290
+ endRefType |= merge_tree_1.ReferenceType.StayOnRemove;
291
+ }
292
+ }
293
+ const startLref = createPositionReference(client, start, beginRefType, op, fromSnapshot, undefined, (0, intervalUtils_1.startReferenceSlidingPreference)(stickiness));
294
+ const endLref = createPositionReference(client, end, endRefType, op, fromSnapshot, undefined, (0, intervalUtils_1.endReferenceSlidingPreference)(stickiness));
295
+ const rangeProp = {
296
+ [merge_tree_1.reservedRangeLabelsKey]: [label],
297
+ };
298
+ startLref.addProperties(rangeProp);
299
+ endLref.addProperties(rangeProp);
300
+ const ival = new SequenceInterval(client, startLref, endLref, intervalType, rangeProp, stickiness);
301
+ return ival;
302
+ }
303
+ exports.createSequenceInterval = createSequenceInterval;
304
+ const compareSequenceIntervalEnds = (a, b) => (0, merge_tree_1.compareReferencePositions)(a.end, b.end);
305
+ exports.compareSequenceIntervalEnds = compareSequenceIntervalEnds;
306
+ const compareSequenceIntervalStarts = (a, b) => (0, merge_tree_1.compareReferencePositions)(a.start, b.start);
307
+ exports.compareSequenceIntervalStarts = compareSequenceIntervalStarts;
308
+ exports.sequenceIntervalHelpers = {
309
+ compareEnds: exports.compareSequenceIntervalEnds,
310
+ compareStarts: exports.compareSequenceIntervalStarts,
311
+ create: createSequenceInterval,
312
+ };
313
+ //# sourceMappingURL=sequenceInterval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequenceInterval.js","sourceRoot":"","sources":["../../src/intervals/sequenceInterval.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 no-bitwise */\n\nimport {\n\tClient,\n\tICombiningOp,\n\tISegment,\n\tLocalReferencePosition,\n\tPropertiesManager,\n\tPropertySet,\n\tReferenceType,\n\tSlidingPreference,\n\tcompareReferencePositions,\n\tcreateDetachedLocalReferencePosition,\n\tcreateMap,\n\tgetSlideToSegoff,\n\tmaxReferencePosition,\n\tminReferencePosition,\n\trefTypeIncludesFlag,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { UsageError } from \"@fluidframework/telemetry-utils\";\nimport {\n\tIIntervalHelpers,\n\tISerializableInterval,\n\tISerializedInterval,\n\tIntervalStickiness,\n\tIntervalType,\n\tendReferenceSlidingPreference,\n\tstartReferenceSlidingPreference,\n} from \"./intervalUtils\";\n\nconst reservedIntervalIdKey = \"intervalId\";\n\n/**\n * Interval implementation whose ends are associated with positions in a mutatable sequence.\n * As such, when content is inserted into the middle of the interval, the interval expands to\n * include that content.\n *\n * @remarks The endpoint's position should be treated exclusively to get reasonable behavior--i.e.\n * an interval referring to \"hello\" in \"hello world\" should have a start position of 0 and an end\n * position of 5.\n *\n * To see why, consider what happens if \"llo wor\" is removed from the string to make \"held\".\n * The interval's startpoint remains on the \"h\" (it isn't altered), but the interval's endpoint\n * slides forward to the next unremoved position, which is the \"l\" in \"held\".\n * Users would generally expect the interval to now refer to \"he\" (as it is the subset of content\n * remaining after the removal), hence the \"l\" should be excluded.\n * If the interval endpoint was treated inclusively, the interval would now refer to \"hel\", which\n * is undesirable.\n *\n * Since the end of an interval is treated exclusively but cannot be greater than or equal to the\n * length of the associated sequence, application models which leverage interval collections should\n * consider inserting a marker at the end of the sequence to represent the end of the content.\n */\nexport class SequenceInterval implements ISerializableInterval {\n\t/**\n\t * {@inheritDoc ISerializableInterval.properties}\n\t */\n\tpublic properties: PropertySet;\n\t/**\n\t * {@inheritDoc ISerializableInterval.propertyManager}\n\t * @internal\n\t */\n\tpublic propertyManager: PropertiesManager;\n\n\tconstructor(\n\t\tprivate readonly client: Client,\n\t\t/**\n\t\t * Start endpoint of this interval.\n\t\t * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.\n\t\t */\n\t\tpublic start: LocalReferencePosition,\n\t\t/**\n\t\t * End endpoint of this interval.\n\t\t * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.\n\t\t */\n\t\tpublic end: LocalReferencePosition,\n\t\tpublic intervalType: IntervalType,\n\t\tprops?: PropertySet,\n\t\tpublic readonly stickiness: IntervalStickiness = IntervalStickiness.END,\n\t) {\n\t\tthis.propertyManager = new PropertiesManager();\n\t\tthis.properties = {};\n\n\t\tif (props) {\n\t\t\tthis.addProperties(props);\n\t\t}\n\t}\n\n\tprivate callbacks?: Record<\"beforePositionChange\" | \"afterPositionChange\", () => void>;\n\n\t/**\n\t * Subscribes to position change events on this interval if there are no current listeners.\n\t * @internal\n\t */\n\tpublic addPositionChangeListeners(\n\t\tbeforePositionChange: () => void,\n\t\tafterPositionChange: () => void,\n\t): void {\n\t\tif (this.callbacks === undefined) {\n\t\t\tthis.callbacks = {\n\t\t\t\tbeforePositionChange,\n\t\t\t\tafterPositionChange,\n\t\t\t};\n\n\t\t\tconst startCbs = (this.start.callbacks ??= {});\n\t\t\tconst endCbs = (this.end.callbacks ??= {});\n\t\t\tstartCbs.beforeSlide = endCbs.beforeSlide = beforePositionChange;\n\t\t\tstartCbs.afterSlide = endCbs.afterSlide = afterPositionChange;\n\t\t}\n\t}\n\n\t/**\n\t * Removes the currently subscribed position change listeners.\n\t * @internal\n\t */\n\tpublic removePositionChangeListeners(): void {\n\t\tif (this.callbacks) {\n\t\t\tthis.callbacks = undefined;\n\t\t\tthis.start.callbacks = undefined;\n\t\t\tthis.end.callbacks = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.serialize}\n\t * @internal\n\t */\n\tpublic serialize(): ISerializedInterval {\n\t\tconst startPosition = this.client.localReferencePositionToPosition(this.start);\n\t\tconst endPosition = this.client.localReferencePositionToPosition(this.end);\n\t\tconst serializedInterval: ISerializedInterval = {\n\t\t\tend: endPosition,\n\t\t\tintervalType: this.intervalType,\n\t\t\tsequenceNumber: this.client.getCurrentSeq(),\n\t\t\tstart: startPosition,\n\t\t};\n\n\t\tif (this.properties) {\n\t\t\tserializedInterval.properties = this.properties;\n\t\t}\n\t\tif (this.stickiness !== IntervalStickiness.END) {\n\t\t\tserializedInterval.stickiness = this.stickiness;\n\t\t}\n\n\t\treturn serializedInterval;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.clone}\n\t */\n\tpublic clone() {\n\t\treturn new SequenceInterval(\n\t\t\tthis.client,\n\t\t\tthis.start,\n\t\t\tthis.end,\n\t\t\tthis.intervalType,\n\t\t\tthis.properties,\n\t\t\tthis.stickiness,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compare}\n\t */\n\tpublic compare(b: SequenceInterval) {\n\t\tconst startResult = this.compareStart(b);\n\t\tif (startResult === 0) {\n\t\t\tconst endResult = this.compareEnd(b);\n\t\t\tif (endResult === 0) {\n\t\t\t\tconst thisId = this.getIntervalId();\n\t\t\t\tif (thisId) {\n\t\t\t\t\tconst bId = b.getIntervalId();\n\t\t\t\t\tif (bId) {\n\t\t\t\t\t\treturn thisId > bId ? 1 : thisId < bId ? -1 : 0;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn endResult;\n\t\t\t}\n\t\t} else {\n\t\t\treturn startResult;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareStart}\n\t */\n\tpublic compareStart(b: SequenceInterval) {\n\t\treturn compareReferencePositions(this.start, b.start);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareEnd}\n\t */\n\tpublic compareEnd(b: SequenceInterval) {\n\t\treturn compareReferencePositions(this.end, b.end);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.overlaps}\n\t */\n\tpublic overlaps(b: SequenceInterval) {\n\t\tconst result =\n\t\t\tcompareReferencePositions(this.start, b.end) <= 0 &&\n\t\t\tcompareReferencePositions(this.end, b.start) >= 0;\n\t\treturn result;\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.getIntervalId}\n\t */\n\tpublic getIntervalId(): string {\n\t\tconst id = this.properties?.[reservedIntervalIdKey];\n\t\tassert(id !== undefined, 0x5e2 /* interval ID should not be undefined */);\n\t\treturn `${id}`;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.union}\n\t * @internal\n\t */\n\tpublic union(b: SequenceInterval) {\n\t\treturn new SequenceInterval(\n\t\t\tthis.client,\n\t\t\tminReferencePosition(this.start, b.start),\n\t\t\tmaxReferencePosition(this.end, b.end),\n\t\t\tthis.intervalType,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.addProperties}\n\t * @internal\n\t */\n\tpublic addProperties(\n\t\tnewProps: PropertySet,\n\t\tcollab: boolean = false,\n\t\tseq?: number,\n\t\top?: ICombiningOp,\n\t): PropertySet | undefined {\n\t\tthis.initializeProperties();\n\t\treturn this.propertyManager.addProperties(this.properties, newProps, op, seq, collab);\n\t}\n\n\t/**\n\t * @returns whether this interval overlaps two numerical positions.\n\t */\n\tpublic overlapsPos(bstart: number, bend: number) {\n\t\tconst startPos = this.client.localReferencePositionToPosition(this.start);\n\t\tconst endPos = this.client.localReferencePositionToPosition(this.end);\n\t\treturn endPos > bstart && startPos < bend;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.modify}\n\t * @internal\n\t */\n\tpublic modify(\n\t\tlabel: string,\n\t\tstart: number,\n\t\tend: number,\n\t\top?: ISequencedDocumentMessage,\n\t\tlocalSeq?: number,\n\t\tstickiness: IntervalStickiness = IntervalStickiness.END,\n\t) {\n\t\tconst getRefType = (baseType: ReferenceType): ReferenceType => {\n\t\t\tlet refType = baseType;\n\t\t\tif (op === undefined) {\n\t\t\t\trefType &= ~ReferenceType.SlideOnRemove;\n\t\t\t\trefType |= ReferenceType.StayOnRemove;\n\t\t\t}\n\t\t\treturn refType;\n\t\t};\n\n\t\tlet startRef = this.start;\n\t\tif (start !== undefined) {\n\t\t\tstartRef = createPositionReference(\n\t\t\t\tthis.client,\n\t\t\t\tstart,\n\t\t\t\tgetRefType(this.start.refType),\n\t\t\t\top,\n\t\t\t\tundefined,\n\t\t\t\tlocalSeq,\n\t\t\t\tstartReferenceSlidingPreference(stickiness),\n\t\t\t);\n\t\t\tif (this.start.properties) {\n\t\t\t\tstartRef.addProperties(this.start.properties);\n\t\t\t}\n\t\t}\n\n\t\tlet endRef = this.end;\n\t\tif (end !== undefined) {\n\t\t\tendRef = createPositionReference(\n\t\t\t\tthis.client,\n\t\t\t\tend,\n\t\t\t\tgetRefType(this.end.refType),\n\t\t\t\top,\n\t\t\t\tundefined,\n\t\t\t\tlocalSeq,\n\t\t\t\tendReferenceSlidingPreference(stickiness),\n\t\t\t);\n\t\t\tif (this.end.properties) {\n\t\t\t\tendRef.addProperties(this.end.properties);\n\t\t\t}\n\t\t}\n\n\t\tconst newInterval = new SequenceInterval(this.client, startRef, endRef, this.intervalType);\n\t\tif (this.properties) {\n\t\t\tnewInterval.initializeProperties();\n\t\t\tthis.propertyManager.copyTo(\n\t\t\t\tthis.properties,\n\t\t\t\tnewInterval.properties,\n\t\t\t\tnewInterval.propertyManager,\n\t\t\t);\n\t\t}\n\t\treturn newInterval;\n\t}\n\n\tprivate initializeProperties(): void {\n\t\tif (!this.propertyManager) {\n\t\t\tthis.propertyManager = new PropertiesManager();\n\t\t}\n\t\tif (!this.properties) {\n\t\t\tthis.properties = createMap<any>();\n\t\t}\n\t}\n}\n\nexport function createPositionReferenceFromSegoff(\n\tclient: Client,\n\tsegoff: { segment: ISegment | undefined; offset: number | undefined },\n\trefType: ReferenceType,\n\top?: ISequencedDocumentMessage,\n\tlocalSeq?: number,\n\tfromSnapshot?: boolean,\n\tslidingPreference?: SlidingPreference,\n): LocalReferencePosition {\n\tif (segoff.segment) {\n\t\tconst ref = client.createLocalReferencePosition(\n\t\t\tsegoff.segment,\n\t\t\tsegoff.offset,\n\t\t\trefType,\n\t\t\tundefined,\n\t\t\tslidingPreference,\n\t\t);\n\t\treturn ref;\n\t}\n\n\t// Creating references on detached segments is allowed for:\n\t// - Transient segments\n\t// - References coming from a remote client (location may have been concurrently removed)\n\t// - References being rebased to a new sequence number\n\t// (segment they originally referred to may have been removed with no suitable replacement)\n\tif (\n\t\t!op &&\n\t\t!localSeq &&\n\t\t!fromSnapshot &&\n\t\t!refTypeIncludesFlag(refType, ReferenceType.Transient)\n\t) {\n\t\tthrow new UsageError(\"Non-transient references need segment\");\n\t}\n\n\treturn createDetachedLocalReferencePosition(refType);\n}\n\nfunction createPositionReference(\n\tclient: Client,\n\tpos: number,\n\trefType: ReferenceType,\n\top?: ISequencedDocumentMessage,\n\tfromSnapshot?: boolean,\n\tlocalSeq?: number,\n\tslidingPreference?: SlidingPreference,\n): LocalReferencePosition {\n\tlet segoff;\n\tif (op) {\n\t\tassert(\n\t\t\t(refType & ReferenceType.SlideOnRemove) !== 0,\n\t\t\t0x2f5 /* op create references must be SlideOnRemove */,\n\t\t);\n\t\tsegoff = client.getContainingSegment(pos, {\n\t\t\treferenceSequenceNumber: op.referenceSequenceNumber,\n\t\t\tclientId: op.clientId,\n\t\t});\n\t\tsegoff = getSlideToSegoff(segoff);\n\t} else {\n\t\tassert(\n\t\t\t(refType & ReferenceType.SlideOnRemove) === 0 || !!fromSnapshot,\n\t\t\t0x2f6 /* SlideOnRemove references must be op created */,\n\t\t);\n\t\tsegoff = client.getContainingSegment(pos, undefined, localSeq);\n\t}\n\n\treturn createPositionReferenceFromSegoff(\n\t\tclient,\n\t\tsegoff,\n\t\trefType,\n\t\top,\n\t\tlocalSeq,\n\t\tfromSnapshot,\n\t\tslidingPreference,\n\t);\n}\n\nexport function createSequenceInterval(\n\tlabel: string,\n\tstart: number,\n\tend: number,\n\tclient: Client,\n\tintervalType: IntervalType,\n\top?: ISequencedDocumentMessage,\n\tfromSnapshot?: boolean,\n\tstickiness: IntervalStickiness = IntervalStickiness.END,\n): SequenceInterval {\n\tlet beginRefType = ReferenceType.RangeBegin;\n\tlet endRefType = ReferenceType.RangeEnd;\n\tif (intervalType === IntervalType.Transient) {\n\t\tbeginRefType = ReferenceType.Transient;\n\t\tendRefType = ReferenceType.Transient;\n\t} else {\n\t\tif (intervalType === IntervalType.Nest) {\n\t\t\tbeginRefType = ReferenceType.NestBegin;\n\t\t\tendRefType = ReferenceType.NestEnd;\n\t\t}\n\t\t// All non-transient interval references must eventually be SlideOnRemove\n\t\t// To ensure eventual consistency, they must start as StayOnRemove when\n\t\t// pending (created locally and creation op is not acked)\n\t\tif (op || fromSnapshot) {\n\t\t\tbeginRefType |= ReferenceType.SlideOnRemove;\n\t\t\tendRefType |= ReferenceType.SlideOnRemove;\n\t\t} else {\n\t\t\tbeginRefType |= ReferenceType.StayOnRemove;\n\t\t\tendRefType |= ReferenceType.StayOnRemove;\n\t\t}\n\t}\n\n\tconst startLref = createPositionReference(\n\t\tclient,\n\t\tstart,\n\t\tbeginRefType,\n\t\top,\n\t\tfromSnapshot,\n\t\tundefined,\n\t\tstartReferenceSlidingPreference(stickiness),\n\t);\n\n\tconst endLref = createPositionReference(\n\t\tclient,\n\t\tend,\n\t\tendRefType,\n\t\top,\n\t\tfromSnapshot,\n\t\tundefined,\n\t\tendReferenceSlidingPreference(stickiness),\n\t);\n\n\tconst rangeProp = {\n\t\t[reservedRangeLabelsKey]: [label],\n\t};\n\tstartLref.addProperties(rangeProp);\n\tendLref.addProperties(rangeProp);\n\n\tconst ival = new SequenceInterval(\n\t\tclient,\n\t\tstartLref,\n\t\tendLref,\n\t\tintervalType,\n\t\trangeProp,\n\t\tstickiness,\n\t);\n\treturn ival;\n}\n\nexport const compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInterval): number =>\n\tcompareReferencePositions(a.end, b.end);\n\nexport const compareSequenceIntervalStarts = (a: SequenceInterval, b: SequenceInterval): number =>\n\tcompareReferencePositions(a.start, b.start);\n\nexport const sequenceIntervalHelpers: IIntervalHelpers<SequenceInterval> = {\n\tcompareEnds: compareSequenceIntervalEnds,\n\tcompareStarts: compareSequenceIntervalStarts,\n\tcreate: createSequenceInterval,\n};\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/sequence";
8
- export declare const pkgVersion = "2.0.0-dev.5.3.2.178189";
8
+ export declare const pkgVersion = "2.0.0-dev.6.4.0.191457";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -8,5 +8,5 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.pkgVersion = exports.pkgName = void 0;
10
10
  exports.pkgName = "@fluidframework/sequence";
11
- exports.pkgVersion = "2.0.0-dev.5.3.2.178189";
11
+ exports.pkgVersion = "2.0.0-dev.6.4.0.191457";
12
12
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,0BAA0B,CAAC;AACrC,QAAA,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"2.0.0-dev.5.3.2.178189\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,0BAA0B,CAAC;AACrC,QAAA,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"2.0.0-dev.6.4.0.191457\";\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { LocalReferencePosition, MergeTreeDeltaRevertible, PropertySet } from "@fluidframework/merge-tree";
6
- import { IntervalOpType, SequenceInterval } from "./intervalCollection";
6
+ import { IntervalOpType, SequenceInterval } from "./intervals";
7
7
  import { SharedString } from "./sharedString";
8
8
  import { SequenceDeltaEvent } from "./sequenceDeltaEvent";
9
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"revertibles.d.ts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAIN,sBAAsB,EAEtB,wBAAwB,EAExB,WAAW,EAMX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAuB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E;;;;;;;GAOG;AACH,oBAAY,sBAAsB,GAAG,wBAAwB,GAAG,kBAAkB,CAAC;AAInF,aAAK,cAAc,GAAG,OAAO,cAAc,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEzE;;;;;;;GAOG;AACH,oBAAY,kBAAkB,GAC3B;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,GAAG,EAAE,sBAAsB,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,GAAG,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC;CAC1B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,GAAG,EAAE,sBAAsB,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC9C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,cAAc,EAAE,WAAW,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,eAAe,CAAC;IAC7C,SAAS,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;IAEJ,cAAc,EAAE;QACf,UAAU,EAAE,kBAAkB,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KACjB,EAAE,CAAC;IACJ,mBAAmB,EAAE,wBAAwB,CAAC;CAC7C,CAAC;AAaL;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,sBAAsB,EAAE,4BAQrC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,sBAAsB,EAAE,4BAqCrC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,gBAAgB,EAC7B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,sBAAsB,EAAE,4BAwCrC;AAED;;;GAGG;AACH,wBAAgB,0CAA0C,CACzD,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,sBAAsB,EAAE,4BASrC;AA2CD;;;;;;;;GAQG;AACH,wBAAgB,oCAAoC,CACnD,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,sBAAsB,EAAE,QAoFrC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,sBAAsB,EAAE,QAUrC;AA0MD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC5C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,sBAAsB,EAAE,QA8BrC"}
1
+ {"version":3,"file":"revertibles.d.ts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAIN,sBAAsB,EAEtB,wBAAwB,EAExB,WAAW,EAMX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAuB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E;;;;;;;GAOG;AACH,oBAAY,sBAAsB,GAAG,wBAAwB,GAAG,kBAAkB,CAAC;AAInF,aAAK,cAAc,GAAG,OAAO,cAAc,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEzE;;;;;;;GAOG;AACH,oBAAY,kBAAkB,GAC3B;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,GAAG,EAAE,sBAAsB,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,GAAG,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC;CAC1B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,sBAAsB,CAAC;IAC9B,GAAG,EAAE,sBAAsB,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,gBAAgB,CAAC;IAC9C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,cAAc,EAAE,WAAW,CAAC;CAC3B,GACD;IACA,KAAK,EAAE,OAAO,cAAc,CAAC,eAAe,CAAC;IAC7C,SAAS,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,EAAE,CAAC;IAEJ,cAAc,EAAE;QACf,UAAU,EAAE,kBAAkB,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KACjB,EAAE,CAAC;IACJ,mBAAmB,EAAE,wBAAwB,CAAC;CAC7C,CAAC;AAaL;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,sBAAsB,EAAE,4BAQrC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,sBAAsB,EAAE,4BAqCrC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,gBAAgB,EAC7B,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,sBAAsB,EAAE,4BAwCrC;AAED;;;GAGG;AACH,wBAAgB,0CAA0C,CACzD,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,sBAAsB,EAAE,4BASrC;AA2CD;;;;;;;;GAQG;AACH,wBAAgB,oCAAoC,CACnD,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,sBAAsB,EAAE,QAoFrC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC7C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,sBAAsB,EAAE,QAUrC;AAqND;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC5C,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,sBAAsB,EAAE,QA8BrC"}
@@ -4,30 +4,18 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  /* eslint-disable no-bitwise */
7
- var __rest = (this && this.__rest) || function (s, e) {
8
- var t = {};
9
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
10
- t[p] = s[p];
11
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
12
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
13
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
14
- t[p[i]] = s[p[i]];
15
- }
16
- return t;
17
- };
18
7
  Object.defineProperty(exports, "__esModule", { value: true });
19
8
  exports.revertSharedStringRevertibles = exports.discardSharedStringRevertibles = exports.appendSharedStringDeltaToRevertibles = exports.appendIntervalPropertyChangedToRevertibles = exports.appendChangeIntervalToRevertibles = exports.appendDeleteIntervalToRevertibles = exports.appendAddIntervalToRevertibles = void 0;
20
- const common_utils_1 = require("@fluidframework/common-utils");
9
+ const core_utils_1 = require("@fluidframework/core-utils");
21
10
  const merge_tree_1 = require("@fluidframework/merge-tree");
22
- const intervalCollection_1 = require("./intervalCollection");
11
+ const intervals_1 = require("./intervals");
23
12
  const idMap = new Map();
24
13
  function getUpdatedIdFromInterval(interval) {
25
14
  const maybeId = interval.getIntervalId();
26
15
  return getUpdatedId(maybeId);
27
16
  }
28
17
  function getUpdatedId(intervalId) {
29
- var _a;
30
- return (_a = idMap.get(intervalId)) !== null && _a !== void 0 ? _a : intervalId;
18
+ return idMap.get(intervalId) ?? intervalId;
31
19
  }
32
20
  /**
33
21
  * Create revertibles for adding an interval
@@ -35,7 +23,7 @@ function getUpdatedId(intervalId) {
35
23
  */
36
24
  function appendAddIntervalToRevertibles(interval, revertibles) {
37
25
  revertibles.push({
38
- event: intervalCollection_1.IntervalOpType.ADD,
26
+ event: intervals_1.IntervalOpType.ADD,
39
27
  interval,
40
28
  });
41
29
  return revertibles;
@@ -57,7 +45,7 @@ function appendDeleteIntervalToRevertibles(string, interval, revertibles) {
57
45
  const startRef = string.createLocalReferencePosition(startSeg, interval.start.getOffset(), startType, undefined, interval.start.slidingPreference);
58
46
  const endRef = string.createLocalReferencePosition(endSeg, interval.end.getOffset(), endType, undefined, interval.end.slidingPreference);
59
47
  const revertible = {
60
- event: intervalCollection_1.IntervalOpType.DELETE,
48
+ event: intervals_1.IntervalOpType.DELETE,
61
49
  interval,
62
50
  start: startRef,
63
51
  end: endRef,
@@ -87,7 +75,7 @@ function appendChangeIntervalToRevertibles(string, newInterval, previousInterval
87
75
  const prevStartRef = string.createLocalReferencePosition(startSeg, previousInterval.start.getOffset(), startType, undefined, previousInterval.start.slidingPreference);
88
76
  const prevEndRef = string.createLocalReferencePosition(endSeg, previousInterval.end.getOffset(), endType, undefined, previousInterval.end.slidingPreference);
89
77
  const revertible = {
90
- event: intervalCollection_1.IntervalOpType.CHANGE,
78
+ event: intervals_1.IntervalOpType.CHANGE,
91
79
  interval: newInterval,
92
80
  start: prevStartRef,
93
81
  end: prevEndRef,
@@ -104,7 +92,7 @@ exports.appendChangeIntervalToRevertibles = appendChangeIntervalToRevertibles;
104
92
  */
105
93
  function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertibles) {
106
94
  revertibles.push({
107
- event: intervalCollection_1.IntervalOpType.PROPERTY_CHANGED,
95
+ event: intervals_1.IntervalOpType.PROPERTY_CHANGED,
108
96
  interval,
109
97
  propertyDeltas: deltas,
110
98
  });
@@ -112,17 +100,16 @@ function appendIntervalPropertyChangedToRevertibles(interval, deltas, revertible
112
100
  }
113
101
  exports.appendIntervalPropertyChangedToRevertibles = appendIntervalPropertyChangedToRevertibles;
114
102
  function addIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals) {
115
- var _a, _b;
116
103
  if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeBegin)) {
117
- const interval = (_a = ref.properties) === null || _a === void 0 ? void 0 : _a.interval;
118
- if (interval && interval instanceof intervalCollection_1.SequenceInterval) {
104
+ const interval = ref.properties?.interval;
105
+ if (interval && interval instanceof intervals_1.SequenceInterval) {
119
106
  startIntervals.push({ offset: segmentLengths + interval.start.getOffset(), interval });
120
107
  return true;
121
108
  }
122
109
  }
123
110
  else if ((0, merge_tree_1.refTypeIncludesFlag)(ref.refType, merge_tree_1.ReferenceType.RangeEnd)) {
124
- const interval = (_b = ref.properties) === null || _b === void 0 ? void 0 : _b.interval;
125
- if (interval && interval instanceof intervalCollection_1.SequenceInterval) {
111
+ const interval = ref.properties?.interval;
112
+ if (interval && interval instanceof intervals_1.SequenceInterval) {
126
113
  endIntervals.push({ offset: segmentLengths + interval.end.getOffset(), interval });
127
114
  return true;
128
115
  }
@@ -130,8 +117,7 @@ function addIfIntervalEndpoint(ref, segmentLengths, startIntervals, endIntervals
130
117
  return false;
131
118
  }
132
119
  function addIfRevertibleRef(ref, segmentLengths, revertibleRefs) {
133
- var _a;
134
- const revertible = (_a = ref.properties) === null || _a === void 0 ? void 0 : _a.revertible;
120
+ const revertible = ref.properties?.revertible;
135
121
  if (revertible) {
136
122
  revertibleRefs.push({
137
123
  revertible,
@@ -172,9 +158,9 @@ function appendSharedStringDeltaToRevertibles(string, delta, revertibles) {
172
158
  if (startIntervals.length > 0 || endIntervals.length > 0 || revertibleRefs.length > 0) {
173
159
  const removeRevertibles = [];
174
160
  (0, merge_tree_1.appendToMergeTreeDeltaRevertibles)(delta.deltaArgs, removeRevertibles);
175
- (0, common_utils_1.assert)(removeRevertibles.length === 1, 0x6c4 /* Remove revertible should be a single delta */);
161
+ (0, core_utils_1.assert)(removeRevertibles.length === 1, 0x6c4 /* Remove revertible should be a single delta */);
176
162
  const revertible = {
177
- event: intervalCollection_1.IntervalOpType.POSITION_REMOVE,
163
+ event: intervals_1.IntervalOpType.POSITION_REMOVE,
178
164
  intervals: [],
179
165
  revertibleRefs,
180
166
  mergeTreeRevertible: removeRevertibles[0],
@@ -228,7 +214,7 @@ function discardSharedStringRevertibles(sharedString, revertibles) {
228
214
  if ((0, merge_tree_1.isMergeTreeDeltaRevertible)(r)) {
229
215
  (0, merge_tree_1.discardMergeTreeDeltaRevertible)([r]);
230
216
  }
231
- else if (r.event === intervalCollection_1.IntervalOpType.CHANGE || r.event === intervalCollection_1.IntervalOpType.DELETE) {
217
+ else if (r.event === intervals_1.IntervalOpType.CHANGE || r.event === intervals_1.IntervalOpType.DELETE) {
232
218
  sharedString.removeLocalReferencePosition(r.start);
233
219
  sharedString.removeLocalReferencePosition(r.end);
234
220
  }
@@ -237,7 +223,7 @@ function discardSharedStringRevertibles(sharedString, revertibles) {
237
223
  exports.discardSharedStringRevertibles = discardSharedStringRevertibles;
238
224
  function getSlidePosition(string, lref, pos) {
239
225
  const slide = (0, merge_tree_1.getSlideToSegoff)({ segment: lref.getSegment(), offset: undefined }, lref.slidingPreference);
240
- return (slide === null || slide === void 0 ? void 0 : slide.segment) !== undefined &&
226
+ return slide?.segment !== undefined &&
241
227
  slide.offset !== undefined &&
242
228
  string.getPosition(slide.segment) !== -1 &&
243
229
  (pos < 0 || pos >= string.getLength())
@@ -265,16 +251,16 @@ function revertLocalDelete(string, revertible) {
265
251
  const endSlidePos = getSlidePosition(string, revertible.end, end);
266
252
  const type = revertible.interval.intervalType;
267
253
  // reusing the id causes eventual consistency bugs, so it is removed here and recreated in add
268
- const _a = revertible.interval.properties, { intervalId } = _a, props = __rest(_a, ["intervalId"]);
269
- if (!isValidRange(startSlidePos, endSlidePos, string))
270
- return;
271
- const int = collection.add(startSlidePos, endSlidePos, type, props);
272
- idMap.forEach((newId, oldId) => {
273
- if (intervalId === newId) {
274
- idMap.set(oldId, getUpdatedIdFromInterval(int));
275
- }
276
- });
277
- idMap.set(intervalId, int.getIntervalId());
254
+ const { intervalId, ...props } = revertible.interval.properties;
255
+ if (isValidRange(startSlidePos, endSlidePos, string)) {
256
+ const int = collection.add(startSlidePos, endSlidePos, type, props);
257
+ idMap.forEach((newId, oldId) => {
258
+ if (intervalId === newId) {
259
+ idMap.set(oldId, getUpdatedIdFromInterval(int));
260
+ }
261
+ });
262
+ idMap.set(intervalId, int.getIntervalId());
263
+ }
278
264
  string.removeLocalReferencePosition(revertible.start);
279
265
  string.removeLocalReferencePosition(revertible.end);
280
266
  }
@@ -286,9 +272,9 @@ function revertLocalChange(string, revertible) {
286
272
  const startSlidePos = getSlidePosition(string, revertible.start, start);
287
273
  const end = string.localReferencePositionToPosition(revertible.end);
288
274
  const endSlidePos = getSlidePosition(string, revertible.end, end);
289
- if (!isValidRange(startSlidePos, endSlidePos, string))
290
- return;
291
- collection.change(id, startSlidePos, endSlidePos);
275
+ if (isValidRange(startSlidePos, endSlidePos, string)) {
276
+ collection.change(id, startSlidePos, endSlidePos);
277
+ }
292
278
  string.removeLocalReferencePosition(revertible.start);
293
279
  string.removeLocalReferencePosition(revertible.end);
294
280
  }
@@ -347,15 +333,22 @@ function revertLocalSequenceRemove(sharedString, revertible) {
347
333
  if (interval !== undefined) {
348
334
  const newStart = newEndpointPosition(intervalInfo.startOffset, restoredRanges, sharedString);
349
335
  const newEnd = newEndpointPosition(intervalInfo.endOffset, restoredRanges, sharedString);
350
- if (newStart !== undefined || newEnd !== undefined) {
336
+ // only move interval if start <= end
337
+ if ((newStart === undefined &&
338
+ newEnd !== undefined &&
339
+ sharedString.localReferencePositionToPosition(interval.start) <= newEnd) ||
340
+ (newEnd === undefined &&
341
+ newStart !== undefined &&
342
+ sharedString.localReferencePositionToPosition(interval.end) >= newStart) ||
343
+ (newStart !== undefined && newEnd !== undefined && newStart <= newEnd)) {
351
344
  intervalCollection.change(intervalId, newStart, newEnd);
352
345
  }
353
346
  }
354
347
  });
355
348
  // fix up the local references used by delete and change revertibles
356
349
  revertible.revertibleRefs.forEach((revertibleRef) => {
357
- (0, common_utils_1.assert)(revertibleRef.revertible.event === intervalCollection_1.IntervalOpType.CHANGE ||
358
- revertibleRef.revertible.event === intervalCollection_1.IntervalOpType.DELETE, 0x6c5 /* revertible is not delete or change */);
350
+ (0, core_utils_1.assert)(revertibleRef.revertible.event === intervals_1.IntervalOpType.CHANGE ||
351
+ revertibleRef.revertible.event === intervals_1.IntervalOpType.DELETE, 0x6c5 /* revertible is not delete or change */);
359
352
  const pos = newPosition(revertibleRef.offset, restoredRanges);
360
353
  if (pos !== undefined) {
361
354
  if (revertibleRef.isStart) {
@@ -386,23 +379,23 @@ function revertSharedStringRevertibles(sharedString, revertibles) {
386
379
  if ("event" in r) {
387
380
  const event = r.event;
388
381
  switch (event) {
389
- case intervalCollection_1.IntervalOpType.ADD:
382
+ case intervals_1.IntervalOpType.ADD:
390
383
  revertLocalAdd(sharedString, r);
391
384
  break;
392
- case intervalCollection_1.IntervalOpType.DELETE:
385
+ case intervals_1.IntervalOpType.DELETE:
393
386
  revertLocalDelete(sharedString, r);
394
387
  break;
395
- case intervalCollection_1.IntervalOpType.CHANGE:
388
+ case intervals_1.IntervalOpType.CHANGE:
396
389
  revertLocalChange(sharedString, r);
397
390
  break;
398
- case intervalCollection_1.IntervalOpType.PROPERTY_CHANGED:
391
+ case intervals_1.IntervalOpType.PROPERTY_CHANGED:
399
392
  revertLocalPropertyChanged(sharedString, r);
400
393
  break;
401
- case intervalCollection_1.IntervalOpType.POSITION_REMOVE:
394
+ case intervals_1.IntervalOpType.POSITION_REMOVE:
402
395
  revertLocalSequenceRemove(sharedString, r);
403
396
  break;
404
397
  default:
405
- (0, common_utils_1.unreachableCase)(event);
398
+ (0, core_utils_1.unreachableCase)(event);
406
399
  }
407
400
  }
408
401
  else {