@fluidframework/sequence 2.0.0-internal.5.3.2 → 2.0.0-internal.5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/index.d.ts +4 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +12 -9
  5. package/dist/index.js.map +1 -1
  6. package/dist/intervalCollection.d.ts +46 -410
  7. package/dist/intervalCollection.d.ts.map +1 -1
  8. package/dist/intervalCollection.js +44 -732
  9. package/dist/intervalCollection.js.map +1 -1
  10. package/dist/intervalIndex/endpointInRangeIndex.d.ts +20 -0
  11. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  12. package/dist/intervalIndex/endpointInRangeIndex.js +60 -0
  13. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -0
  14. package/dist/intervalIndex/endpointIndex.d.ts +21 -0
  15. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
  16. package/dist/intervalIndex/endpointIndex.js +42 -0
  17. package/dist/intervalIndex/endpointIndex.js.map +1 -0
  18. package/dist/intervalIndex/idIntervalIndex.d.ts +12 -0
  19. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  20. package/dist/intervalIndex/idIntervalIndex.js +41 -0
  21. package/dist/intervalIndex/idIntervalIndex.js.map +1 -0
  22. package/dist/intervalIndex/index.d.ts +5 -0
  23. package/dist/intervalIndex/index.d.ts.map +1 -1
  24. package/dist/intervalIndex/index.js +9 -1
  25. package/dist/intervalIndex/index.js.map +1 -1
  26. package/dist/intervalIndex/intervalIndex.d.ts +29 -0
  27. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
  28. package/dist/intervalIndex/intervalIndex.js +7 -0
  29. package/dist/intervalIndex/intervalIndex.js.map +1 -0
  30. package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
  31. package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  32. package/dist/intervalIndex/intervalIndexUtils.js +23 -0
  33. package/dist/intervalIndex/intervalIndexUtils.js.map +1 -0
  34. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
  35. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  36. package/dist/intervalIndex/overlappingIntervalsIndex.js +3 -3
  37. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  38. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +5 -5
  39. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  40. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  41. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  42. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  43. package/dist/intervalIndex/startpointInRangeIndex.d.ts +20 -0
  44. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  45. package/dist/intervalIndex/startpointInRangeIndex.js +62 -0
  46. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -0
  47. package/dist/intervalTree.d.ts +1 -47
  48. package/dist/intervalTree.d.ts.map +1 -1
  49. package/dist/intervalTree.js.map +1 -1
  50. package/dist/intervals/index.d.ts +8 -0
  51. package/dist/intervals/index.d.ts.map +1 -0
  52. package/dist/intervals/index.js +23 -0
  53. package/dist/intervals/index.js.map +1 -0
  54. package/dist/intervals/interval.d.ts +88 -0
  55. package/dist/intervals/interval.d.ts.map +1 -0
  56. package/dist/intervals/interval.js +182 -0
  57. package/dist/intervals/interval.js.map +1 -0
  58. package/dist/intervals/intervalUtils.d.ts +194 -0
  59. package/dist/intervals/intervalUtils.d.ts.map +1 -0
  60. package/dist/intervals/intervalUtils.js +79 -0
  61. package/dist/intervals/intervalUtils.js.map +1 -0
  62. package/dist/intervals/sequenceInterval.d.ts +132 -0
  63. package/dist/intervals/sequenceInterval.d.ts.map +1 -0
  64. package/dist/intervals/sequenceInterval.js +315 -0
  65. package/dist/intervals/sequenceInterval.js.map +1 -0
  66. package/dist/packageVersion.d.ts +1 -1
  67. package/dist/packageVersion.js +1 -1
  68. package/dist/packageVersion.js.map +1 -1
  69. package/dist/revertibles.d.ts +1 -1
  70. package/dist/revertibles.d.ts.map +1 -1
  71. package/dist/revertibles.js +36 -29
  72. package/dist/revertibles.js.map +1 -1
  73. package/dist/sequence.d.ts +2 -1
  74. package/dist/sequence.d.ts.map +1 -1
  75. package/dist/sequence.js +4 -1
  76. package/dist/sequence.js.map +1 -1
  77. package/dist/sharedIntervalCollection.d.ts +2 -1
  78. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  79. package/dist/sharedIntervalCollection.js.map +1 -1
  80. package/lib/index.d.ts +4 -3
  81. package/lib/index.d.ts.map +1 -1
  82. package/lib/index.js +3 -2
  83. package/lib/index.js.map +1 -1
  84. package/lib/intervalCollection.d.ts +46 -410
  85. package/lib/intervalCollection.d.ts.map +1 -1
  86. package/lib/intervalCollection.js +25 -705
  87. package/lib/intervalCollection.js.map +1 -1
  88. package/lib/intervalIndex/endpointInRangeIndex.d.ts +20 -0
  89. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  90. package/lib/intervalIndex/endpointInRangeIndex.js +56 -0
  91. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
  92. package/lib/intervalIndex/endpointIndex.d.ts +21 -0
  93. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
  94. package/lib/intervalIndex/endpointIndex.js +38 -0
  95. package/lib/intervalIndex/endpointIndex.js.map +1 -0
  96. package/lib/intervalIndex/idIntervalIndex.d.ts +12 -0
  97. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  98. package/lib/intervalIndex/idIntervalIndex.js +37 -0
  99. package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
  100. package/lib/intervalIndex/index.d.ts +5 -0
  101. package/lib/intervalIndex/index.d.ts.map +1 -1
  102. package/lib/intervalIndex/index.js +4 -0
  103. package/lib/intervalIndex/index.js.map +1 -1
  104. package/lib/intervalIndex/intervalIndex.d.ts +29 -0
  105. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
  106. package/lib/intervalIndex/intervalIndex.js +6 -0
  107. package/lib/intervalIndex/intervalIndex.js.map +1 -0
  108. package/lib/intervalIndex/intervalIndexUtils.d.ts +17 -0
  109. package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  110. package/lib/intervalIndex/intervalIndexUtils.js +19 -0
  111. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
  112. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -1
  113. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  114. package/lib/intervalIndex/overlappingIntervalsIndex.js +1 -1
  115. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  116. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  117. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  118. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  119. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  120. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  121. package/lib/intervalIndex/startpointInRangeIndex.d.ts +20 -0
  122. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  123. package/lib/intervalIndex/startpointInRangeIndex.js +58 -0
  124. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
  125. package/lib/intervalTree.d.ts +1 -47
  126. package/lib/intervalTree.d.ts.map +1 -1
  127. package/lib/intervalTree.js.map +1 -1
  128. package/lib/intervals/index.d.ts +8 -0
  129. package/lib/intervals/index.d.ts.map +1 -0
  130. package/lib/intervals/index.js +8 -0
  131. package/lib/intervals/index.js.map +1 -0
  132. package/lib/intervals/interval.d.ts +88 -0
  133. package/lib/intervals/interval.d.ts.map +1 -0
  134. package/lib/intervals/interval.js +177 -0
  135. package/lib/intervals/interval.js.map +1 -0
  136. package/lib/intervals/intervalUtils.d.ts +194 -0
  137. package/lib/intervals/intervalUtils.d.ts.map +1 -0
  138. package/lib/intervals/intervalUtils.js +74 -0
  139. package/lib/intervals/intervalUtils.js.map +1 -0
  140. package/lib/intervals/sequenceInterval.d.ts +132 -0
  141. package/lib/intervals/sequenceInterval.d.ts.map +1 -0
  142. package/lib/intervals/sequenceInterval.js +307 -0
  143. package/lib/intervals/sequenceInterval.js.map +1 -0
  144. package/lib/packageVersion.d.ts +1 -1
  145. package/lib/packageVersion.js +1 -1
  146. package/lib/packageVersion.js.map +1 -1
  147. package/lib/revertibles.d.ts +1 -1
  148. package/lib/revertibles.d.ts.map +1 -1
  149. package/lib/revertibles.js +21 -14
  150. package/lib/revertibles.js.map +1 -1
  151. package/lib/sequence.d.ts +2 -1
  152. package/lib/sequence.d.ts.map +1 -1
  153. package/lib/sequence.js +5 -2
  154. package/lib/sequence.js.map +1 -1
  155. package/lib/sharedIntervalCollection.d.ts +2 -1
  156. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  157. package/lib/sharedIntervalCollection.js.map +1 -1
  158. package/package.json +15 -15
  159. package/src/index.ts +19 -12
  160. package/src/intervalCollection.ts +75 -1204
  161. package/src/intervalIndex/endpointInRangeIndex.ts +104 -0
  162. package/src/intervalIndex/endpointIndex.ts +78 -0
  163. package/src/intervalIndex/idIntervalIndex.ts +58 -0
  164. package/src/intervalIndex/index.ts +5 -0
  165. package/src/intervalIndex/intervalIndex.ts +31 -0
  166. package/src/intervalIndex/intervalIndexUtils.ts +27 -0
  167. package/src/intervalIndex/overlappingIntervalsIndex.ts +2 -6
  168. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -1
  169. package/src/intervalIndex/sequenceIntervalIndexes.ts +1 -1
  170. package/src/intervalIndex/startpointInRangeIndex.ts +109 -0
  171. package/src/intervalTree.ts +1 -54
  172. package/src/intervals/index.ts +25 -0
  173. package/src/intervals/interval.ts +230 -0
  174. package/src/intervals/intervalUtils.ts +249 -0
  175. package/src/intervals/sequenceInterval.ts +494 -0
  176. package/src/packageVersion.ts +1 -1
  177. package/src/revertibles.ts +23 -12
  178. package/src/sequence.ts +6 -3
  179. package/src/sharedIntervalCollection.ts +1 -2
@@ -0,0 +1,230 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ ICombiningOp,
8
+ PropertiesManager,
9
+ PropertySet,
10
+ createMap,
11
+ reservedRangeLabelsKey,
12
+ } from "@fluidframework/merge-tree";
13
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
14
+ import { assert } from "@fluidframework/common-utils";
15
+ import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils";
16
+
17
+ const reservedIntervalIdKey = "intervalId";
18
+
19
+ /**
20
+ * Serializable interval whose endpoints are plain-old numbers.
21
+ */
22
+ export class Interval implements ISerializableInterval {
23
+ /**
24
+ * {@inheritDoc ISerializableInterval.properties}
25
+ */
26
+ public properties: PropertySet;
27
+ /** @internal */
28
+ public auxProps: PropertySet[] | undefined;
29
+ /**
30
+ * {@inheritDoc ISerializableInterval.propertyManager}
31
+ * @deprecated - This API was never intended to be public and will be marked internal in a future release.
32
+ */
33
+ public propertyManager: PropertiesManager;
34
+ constructor(public start: number, public end: number, props?: PropertySet) {
35
+ this.propertyManager = new PropertiesManager();
36
+ this.properties = {};
37
+
38
+ if (props) {
39
+ this.addProperties(props);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * {@inheritDoc ISerializableInterval.getIntervalId}
45
+ */
46
+ public getIntervalId(): string {
47
+ const id = this.properties?.[reservedIntervalIdKey];
48
+ assert(id !== undefined, 0x5e1 /* interval ID should not be undefined */);
49
+ return `${id}`;
50
+ }
51
+
52
+ /**
53
+ * @returns an array containing any auxiliary property sets added with `addPropertySet`.
54
+ */
55
+ public getAdditionalPropertySets(): PropertySet[] {
56
+ return this.auxProps ?? [];
57
+ }
58
+
59
+ /**
60
+ * Adds an auxiliary set of properties to this interval.
61
+ * These properties can be recovered using `getAdditionalPropertySets`
62
+ * @param props - set of properties to add
63
+ * @remarks - This gets called as part of the default conflict resolver for `IIntervalCollection<Interval>`
64
+ * (i.e. non-sequence-based interval collections). However, the additional properties don't get serialized.
65
+ * This functionality seems half-baked.
66
+ */
67
+ public addPropertySet(props: PropertySet) {
68
+ if (this.auxProps === undefined) {
69
+ this.auxProps = [];
70
+ }
71
+ this.auxProps.push(props);
72
+ }
73
+
74
+ /**
75
+ * {@inheritDoc ISerializableInterval.serialize}
76
+ * @internal
77
+ */
78
+ public serialize(): ISerializedInterval {
79
+ const serializedInterval: ISerializedInterval = {
80
+ end: this.end,
81
+ intervalType: 0,
82
+ sequenceNumber: 0,
83
+ start: this.start,
84
+ };
85
+ if (this.properties) {
86
+ serializedInterval.properties = this.properties;
87
+ }
88
+ return serializedInterval;
89
+ }
90
+
91
+ /**
92
+ * {@inheritDoc IInterval.clone}
93
+ */
94
+ public clone() {
95
+ return new Interval(this.start, this.end, this.properties);
96
+ }
97
+
98
+ /**
99
+ * {@inheritDoc IInterval.compare}
100
+ */
101
+ public compare(b: Interval) {
102
+ const startResult = this.compareStart(b);
103
+ if (startResult === 0) {
104
+ const endResult = this.compareEnd(b);
105
+ if (endResult === 0) {
106
+ const thisId = this.getIntervalId();
107
+ if (thisId) {
108
+ const bId = b.getIntervalId();
109
+ if (bId) {
110
+ return thisId > bId ? 1 : thisId < bId ? -1 : 0;
111
+ }
112
+ return 0;
113
+ }
114
+ return 0;
115
+ } else {
116
+ return endResult;
117
+ }
118
+ } else {
119
+ return startResult;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * {@inheritDoc IInterval.compareStart}
125
+ */
126
+ public compareStart(b: Interval) {
127
+ return this.start - b.start;
128
+ }
129
+
130
+ /**
131
+ * {@inheritDoc IInterval.compareEnd}
132
+ */
133
+ public compareEnd(b: Interval) {
134
+ return this.end - b.end;
135
+ }
136
+
137
+ /**
138
+ * {@inheritDoc IInterval.overlaps}
139
+ */
140
+ public overlaps(b: Interval) {
141
+ const result = this.start <= b.end && this.end >= b.start;
142
+ return result;
143
+ }
144
+
145
+ /**
146
+ * {@inheritDoc IInterval.union}
147
+ * @deprecated - This API was never intended to be public and will be marked internal in a future release.
148
+ */
149
+ public union(b: Interval) {
150
+ return new Interval(
151
+ Math.min(this.start, b.start),
152
+ Math.max(this.end, b.end),
153
+ this.properties,
154
+ );
155
+ }
156
+
157
+ public getProperties() {
158
+ return this.properties;
159
+ }
160
+
161
+ /**
162
+ * {@inheritDoc ISerializableInterval.addProperties}
163
+ * @deprecated - This API was never intended to be public and will be marked internal in a future release.
164
+ */
165
+ public addProperties(
166
+ newProps: PropertySet,
167
+ collaborating: boolean = false,
168
+ seq?: number,
169
+ op?: ICombiningOp,
170
+ ): PropertySet | undefined {
171
+ if (newProps) {
172
+ this.initializeProperties();
173
+ return this.propertyManager.addProperties(
174
+ this.properties,
175
+ newProps,
176
+ op,
177
+ seq,
178
+ collaborating,
179
+ );
180
+ }
181
+ }
182
+
183
+ /**
184
+ * {@inheritDoc IInterval.modify}
185
+ * @deprecated - This API was never intended to be public and will be marked internal in a future release.
186
+ */
187
+ public modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage) {
188
+ const startPos = start ?? this.start;
189
+ const endPos = end ?? this.end;
190
+ if (this.start === startPos && this.end === endPos) {
191
+ // Return undefined to indicate that no change is necessary.
192
+ return;
193
+ }
194
+ const newInterval = new Interval(startPos, endPos);
195
+ if (this.properties) {
196
+ newInterval.initializeProperties();
197
+ this.propertyManager.copyTo(
198
+ this.properties,
199
+ newInterval.properties,
200
+ newInterval.propertyManager,
201
+ );
202
+ }
203
+ return newInterval;
204
+ }
205
+
206
+ private initializeProperties(): void {
207
+ if (!this.propertyManager) {
208
+ this.propertyManager = new PropertiesManager();
209
+ }
210
+ if (!this.properties) {
211
+ this.properties = createMap<any>();
212
+ }
213
+ }
214
+ }
215
+
216
+ export function createInterval(label: string, start: number, end: number): Interval {
217
+ const rangeProp: PropertySet = {};
218
+
219
+ if (label && label.length > 0) {
220
+ rangeProp[reservedRangeLabelsKey] = [label];
221
+ }
222
+
223
+ return new Interval(start, end, rangeProp);
224
+ }
225
+
226
+ export const intervalHelpers: IIntervalHelpers<Interval> = {
227
+ compareEnds: (a: Interval, b: Interval) => a.end - b.end,
228
+ compareStarts: (a: Interval, b: Interval) => a.start - b.start,
229
+ create: createInterval,
230
+ };
@@ -0,0 +1,249 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ /* eslint-disable no-bitwise */
7
+
8
+ import {
9
+ Client,
10
+ PropertiesManager,
11
+ PropertySet,
12
+ SlidingPreference,
13
+ } from "@fluidframework/merge-tree";
14
+ import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
15
+ /**
16
+ * Basic interval abstraction
17
+ */
18
+ export interface IInterval {
19
+ /**
20
+ * @returns a new interval object with identical semantics.
21
+ */
22
+ clone(): IInterval;
23
+ /**
24
+ * Compares this interval to `b` with standard comparator semantics:
25
+ * - returns -1 if this is less than `b`
26
+ * - returns 1 if this is greater than `b`
27
+ * - returns 0 if this is equivalent to `b`
28
+ * @param b - Interval to compare against
29
+ */
30
+ compare(b: IInterval): number;
31
+ /**
32
+ * Compares the start endpoint of this interval to `b`'s start endpoint.
33
+ * Standard comparator semantics apply.
34
+ * @param b - Interval to compare against
35
+ */
36
+ compareStart(b: IInterval): number;
37
+ /**
38
+ * Compares the end endpoint of this interval to `b`'s end endpoint.
39
+ * Standard comparator semantics apply.
40
+ * @param b - Interval to compare against
41
+ */
42
+ compareEnd(b: IInterval): number;
43
+ /**
44
+ * Modifies one or more of the endpoints of this interval, returning a new interval representing the result.
45
+ * @internal
46
+ */
47
+ modify(
48
+ label: string,
49
+ start: number | undefined,
50
+ end: number | undefined,
51
+ op?: ISequencedDocumentMessage,
52
+ localSeq?: number,
53
+ ): IInterval | undefined;
54
+ /**
55
+ * @returns whether this interval overlaps with `b`.
56
+ * Intervals are considered to overlap if their intersection is non-empty.
57
+ */
58
+ overlaps(b: IInterval): boolean;
59
+ /**
60
+ * Unions this interval with `b`, returning a new interval.
61
+ * The union operates as a convex hull, i.e. if the two intervals are disjoint, the return value includes
62
+ * intermediate values between the two intervals.
63
+ * @internal
64
+ */
65
+ union(b: IInterval): IInterval;
66
+ }
67
+
68
+ /**
69
+ * Values are used in persisted formats (ops) and revertibles.
70
+ * @alpha
71
+ */
72
+ export const IntervalOpType = {
73
+ ADD: "add",
74
+ DELETE: "delete",
75
+ CHANGE: "change",
76
+ PROPERTY_CHANGED: "propertyChanged",
77
+ POSITION_REMOVE: "positionRemove",
78
+ } as const;
79
+
80
+ export enum IntervalType {
81
+ Simple = 0x0,
82
+ Nest = 0x1,
83
+
84
+ /**
85
+ * SlideOnRemove indicates that the ends of the interval will slide if the segment
86
+ * they reference is removed and acked.
87
+ * See `packages\dds\merge-tree\docs\REFERENCEPOSITIONS.md` for details
88
+ * SlideOnRemove is the default interval behavior and does not need to be specified.
89
+ */
90
+ SlideOnRemove = 0x2, // SlideOnRemove is default behavior - all intervals are SlideOnRemove
91
+
92
+ /**
93
+ * A temporary interval, used internally
94
+ * @internal
95
+ */
96
+ Transient = 0x4,
97
+ }
98
+
99
+ /**
100
+ * Serialized object representation of an interval.
101
+ * This representation is used for ops that create or change intervals.
102
+ * @internal
103
+ */
104
+ export interface ISerializedInterval {
105
+ /**
106
+ * Sequence number at which `start` and `end` should be interpreted
107
+ *
108
+ * @remarks - It's unclear that this is necessary to store here.
109
+ * This should just be the refSeq on the op that modified the interval, which should be available via other means.
110
+ * At the time of writing, it's not plumbed through to the reconnect/rebase code, however, which does need it.
111
+ */
112
+ sequenceNumber: number;
113
+ /** Start position of the interval */
114
+ start: number;
115
+ /** End position of the interval */
116
+ end: number;
117
+ /** Interval type to create */
118
+ intervalType: IntervalType;
119
+ stickiness?: IntervalStickiness;
120
+ /** Any properties the interval has */
121
+ properties?: PropertySet;
122
+ }
123
+
124
+ export interface ISerializableInterval extends IInterval {
125
+ /** Serializable bag of properties associated with the interval. */
126
+ properties: PropertySet;
127
+ /** @internal */
128
+ propertyManager: PropertiesManager;
129
+ /** @internal */
130
+ serialize(): ISerializedInterval;
131
+ /** @internal */
132
+ addProperties(
133
+ props: PropertySet,
134
+ collaborating?: boolean,
135
+ seq?: number,
136
+ ): PropertySet | undefined;
137
+ /**
138
+ * Gets the id associated with this interval.
139
+ * When the interval is used as part of an interval collection, this id can be used to modify or remove the
140
+ * interval.
141
+ * @remarks - This signature includes `undefined` strictly for backwards-compatibility reasons, as older versions
142
+ * of Fluid didn't always write interval ids.
143
+ */
144
+ getIntervalId(): string | undefined;
145
+ }
146
+
147
+ /**
148
+ * Represents a change that should be applied to an existing interval.
149
+ * Changes can modify any of start/end/properties, with `undefined` signifying no change should be made.
150
+ * @internal
151
+ */
152
+ export type SerializedIntervalDelta = Omit<ISerializedInterval, "start" | "end" | "properties"> &
153
+ Partial<Pick<ISerializedInterval, "start" | "end" | "properties">>;
154
+
155
+ /**
156
+ * A size optimization to avoid redundantly storing keys when serializing intervals
157
+ * as JSON for summaries.
158
+ *
159
+ * Intervals are of the format:
160
+ *
161
+ * [start, end, sequenceNumber, intervalType, properties, stickiness?]
162
+ */
163
+ export type CompressedSerializedInterval =
164
+ | [number, number, number, IntervalType, PropertySet, IntervalStickiness]
165
+ | [number, number, number, IntervalType, PropertySet];
166
+
167
+ /**
168
+ * @sealed
169
+ */
170
+ export interface IIntervalHelpers<TInterval extends ISerializableInterval> {
171
+ compareEnds(a: TInterval, b: TInterval): number;
172
+ compareStarts?(a: TInterval, b: TInterval): number;
173
+ /**
174
+ *
175
+ * @param label - label of the interval collection this interval is being added to. This parameter is
176
+ * irrelevant for transient intervals.
177
+ * @param start - numerical start position of the interval
178
+ * @param end - numerical end position of the interval
179
+ * @param client - client creating the interval
180
+ * @param intervalType - Type of interval to create. Default is SlideOnRemove
181
+ * @param op - If this create came from a remote client, op that created it. Default is undefined (i.e. local)
182
+ * @param fromSnapshot - If this create came from loading a snapshot. Default is false.
183
+ * @param stickiness - {@link (IntervalStickiness:type)} to apply to the added interval.
184
+ */
185
+ create(
186
+ label: string,
187
+ start: number | undefined,
188
+ end: number | undefined,
189
+ client: Client | undefined,
190
+ intervalType: IntervalType,
191
+ op?: ISequencedDocumentMessage,
192
+ fromSnapshot?: boolean,
193
+ stickiness?: IntervalStickiness,
194
+ ): TInterval;
195
+ }
196
+
197
+ /**
198
+ * Determines how an interval should expand when segments are inserted adjacent
199
+ * to the range it spans
200
+ *
201
+ * Note that interval stickiness is currently an experimental feature and must
202
+ * be explicitly enabled with the `intervalStickinessEnabled` flag
203
+ */
204
+ export const IntervalStickiness = {
205
+ /**
206
+ * Interval does not expand to include adjacent segments
207
+ */
208
+ NONE: 0b00,
209
+
210
+ /**
211
+ * Interval expands to include segments inserted adjacent to the start
212
+ */
213
+ START: 0b01,
214
+
215
+ /**
216
+ * Interval expands to include segments inserted adjacent to the end
217
+ *
218
+ * This is the default stickiness
219
+ */
220
+ END: 0b10,
221
+
222
+ /**
223
+ * Interval expands to include all segments inserted adjacent to it
224
+ */
225
+ FULL: 0b11,
226
+ } as const;
227
+
228
+ /**
229
+ * Determines how an interval should expand when segments are inserted adjacent
230
+ * to the range it spans
231
+ *
232
+ * Note that interval stickiness is currently an experimental feature and must
233
+ * be explicitly enabled with the `intervalStickinessEnabled` flag
234
+ */
235
+ export type IntervalStickiness = typeof IntervalStickiness[keyof typeof IntervalStickiness];
236
+
237
+ export function endReferenceSlidingPreference(stickiness: IntervalStickiness): SlidingPreference {
238
+ // if any end stickiness, prefer sliding forwards
239
+ return (stickiness & IntervalStickiness.END) !== 0
240
+ ? SlidingPreference.FORWARD
241
+ : SlidingPreference.BACKWARD;
242
+ }
243
+
244
+ export function startReferenceSlidingPreference(stickiness: IntervalStickiness): SlidingPreference {
245
+ // if any start stickiness, prefer sliding backwards
246
+ return (stickiness & IntervalStickiness.START) !== 0
247
+ ? SlidingPreference.BACKWARD
248
+ : SlidingPreference.FORWARD;
249
+ }