@fluidframework/sequence 2.30.0 → 2.31.1

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 (189) hide show
  1. package/CHANGELOG.md +506 -495
  2. package/api-report/sequence.legacy.alpha.api.md +67 -5
  3. package/dist/IntervalCollectionValues.d.ts +3 -51
  4. package/dist/IntervalCollectionValues.d.ts.map +1 -1
  5. package/dist/IntervalCollectionValues.js +6 -49
  6. package/dist/IntervalCollectionValues.js.map +1 -1
  7. package/dist/index.d.ts +4 -4
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -8
  10. package/dist/index.js.map +1 -1
  11. package/dist/intervalCollection.d.ts +292 -63
  12. package/dist/intervalCollection.d.ts.map +1 -1
  13. package/dist/intervalCollection.js +111 -193
  14. package/dist/intervalCollection.js.map +1 -1
  15. package/dist/intervalCollectionMap.d.ts +11 -32
  16. package/dist/intervalCollectionMap.d.ts.map +1 -1
  17. package/dist/intervalCollectionMap.js +37 -90
  18. package/dist/intervalCollectionMap.js.map +1 -1
  19. package/dist/intervalCollectionMapInterfaces.d.ts +10 -83
  20. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -1
  21. package/dist/intervalCollectionMapInterfaces.js.map +1 -1
  22. package/dist/intervalIndex/endpointInRangeIndex.d.ts +10 -11
  23. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  24. package/dist/intervalIndex/endpointInRangeIndex.js +4 -5
  25. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  26. package/dist/intervalIndex/endpointIndex.d.ts +12 -13
  27. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  28. package/dist/intervalIndex/endpointIndex.js +4 -5
  29. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  30. package/dist/intervalIndex/idIntervalIndex.d.ts +6 -12
  31. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  32. package/dist/intervalIndex/idIntervalIndex.js +0 -3
  33. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  34. package/dist/intervalIndex/index.d.ts +2 -2
  35. package/dist/intervalIndex/index.d.ts.map +1 -1
  36. package/dist/intervalIndex/index.js.map +1 -1
  37. package/dist/intervalIndex/intervalIndex.d.ts +28 -1
  38. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  39. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  40. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
  41. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  42. package/dist/intervalIndex/overlappingIntervalsIndex.js +4 -5
  43. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  44. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  45. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  46. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  47. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  48. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  49. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  50. package/dist/intervalIndex/startpointInRangeIndex.d.ts +10 -11
  51. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  52. package/dist/intervalIndex/startpointInRangeIndex.js +4 -5
  53. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  54. package/dist/intervals/index.d.ts +2 -3
  55. package/dist/intervals/index.d.ts.map +1 -1
  56. package/dist/intervals/index.js +1 -6
  57. package/dist/intervals/index.js.map +1 -1
  58. package/dist/intervals/intervalUtils.d.ts +3 -25
  59. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  60. package/dist/intervals/intervalUtils.js.map +1 -1
  61. package/dist/intervals/sequenceInterval.d.ts +3 -8
  62. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  63. package/dist/intervals/sequenceInterval.js +1 -9
  64. package/dist/intervals/sequenceInterval.js.map +1 -1
  65. package/dist/legacy.d.ts +4 -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/sequence.d.ts +4 -6
  70. package/dist/sequence.d.ts.map +1 -1
  71. package/dist/sequence.js +3 -5
  72. package/dist/sequence.js.map +1 -1
  73. package/dist/sharedIntervalCollection.d.ts +2 -63
  74. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  75. package/dist/sharedIntervalCollection.js +0 -113
  76. package/dist/sharedIntervalCollection.js.map +1 -1
  77. package/dist/sharedString.d.ts.map +1 -1
  78. package/dist/sharedString.js +6 -6
  79. package/dist/sharedString.js.map +1 -1
  80. package/lib/IntervalCollectionValues.d.ts +3 -51
  81. package/lib/IntervalCollectionValues.d.ts.map +1 -1
  82. package/lib/IntervalCollectionValues.js +5 -47
  83. package/lib/IntervalCollectionValues.js.map +1 -1
  84. package/lib/index.d.ts +4 -4
  85. package/lib/index.d.ts.map +1 -1
  86. package/lib/index.js +2 -3
  87. package/lib/index.js.map +1 -1
  88. package/lib/intervalCollection.d.ts +292 -63
  89. package/lib/intervalCollection.d.ts.map +1 -1
  90. package/lib/intervalCollection.js +113 -191
  91. package/lib/intervalCollection.js.map +1 -1
  92. package/lib/intervalCollectionMap.d.ts +11 -32
  93. package/lib/intervalCollectionMap.d.ts.map +1 -1
  94. package/lib/intervalCollectionMap.js +39 -92
  95. package/lib/intervalCollectionMap.js.map +1 -1
  96. package/lib/intervalCollectionMapInterfaces.d.ts +10 -83
  97. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -1
  98. package/lib/intervalCollectionMapInterfaces.js.map +1 -1
  99. package/lib/intervalIndex/endpointInRangeIndex.d.ts +10 -11
  100. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  101. package/lib/intervalIndex/endpointInRangeIndex.js +5 -6
  102. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  103. package/lib/intervalIndex/endpointIndex.d.ts +12 -13
  104. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  105. package/lib/intervalIndex/endpointIndex.js +5 -6
  106. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  107. package/lib/intervalIndex/idIntervalIndex.d.ts +6 -12
  108. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  109. package/lib/intervalIndex/idIntervalIndex.js +0 -3
  110. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  111. package/lib/intervalIndex/index.d.ts +2 -2
  112. package/lib/intervalIndex/index.d.ts.map +1 -1
  113. package/lib/intervalIndex/index.js.map +1 -1
  114. package/lib/intervalIndex/intervalIndex.d.ts +28 -1
  115. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
  116. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  117. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +30 -13
  118. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  119. package/lib/intervalIndex/overlappingIntervalsIndex.js +5 -6
  120. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  121. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  122. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +2 -2
  123. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  124. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  125. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  126. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  127. package/lib/intervalIndex/startpointInRangeIndex.d.ts +10 -11
  128. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  129. package/lib/intervalIndex/startpointInRangeIndex.js +5 -6
  130. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  131. package/lib/intervals/index.d.ts +2 -3
  132. package/lib/intervals/index.d.ts.map +1 -1
  133. package/lib/intervals/index.js +1 -2
  134. package/lib/intervals/index.js.map +1 -1
  135. package/lib/intervals/intervalUtils.d.ts +3 -25
  136. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  137. package/lib/intervals/intervalUtils.js.map +1 -1
  138. package/lib/intervals/sequenceInterval.d.ts +3 -8
  139. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  140. package/lib/intervals/sequenceInterval.js +0 -8
  141. package/lib/intervals/sequenceInterval.js.map +1 -1
  142. package/lib/legacy.d.ts +4 -0
  143. package/lib/packageVersion.d.ts +1 -1
  144. package/lib/packageVersion.js +1 -1
  145. package/lib/packageVersion.js.map +1 -1
  146. package/lib/sequence.d.ts +4 -6
  147. package/lib/sequence.d.ts.map +1 -1
  148. package/lib/sequence.js +3 -5
  149. package/lib/sequence.js.map +1 -1
  150. package/lib/sharedIntervalCollection.d.ts +2 -63
  151. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  152. package/lib/sharedIntervalCollection.js +1 -110
  153. package/lib/sharedIntervalCollection.js.map +1 -1
  154. package/lib/sharedString.d.ts.map +1 -1
  155. package/lib/sharedString.js +6 -6
  156. package/lib/sharedString.js.map +1 -1
  157. package/lib/tsdoc-metadata.json +1 -1
  158. package/package.json +19 -22
  159. package/src/IntervalCollectionValues.ts +10 -93
  160. package/src/index.ts +6 -17
  161. package/src/intervalCollection.ts +524 -343
  162. package/src/intervalCollectionMap.ts +72 -140
  163. package/src/intervalCollectionMapInterfaces.ts +13 -104
  164. package/src/intervalIndex/endpointInRangeIndex.ts +17 -29
  165. package/src/intervalIndex/endpointIndex.ts +19 -31
  166. package/src/intervalIndex/idIntervalIndex.ts +15 -25
  167. package/src/intervalIndex/index.ts +2 -1
  168. package/src/intervalIndex/intervalIndex.ts +30 -1
  169. package/src/intervalIndex/overlappingIntervalsIndex.ts +50 -27
  170. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +2 -3
  171. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
  172. package/src/intervalIndex/startpointInRangeIndex.ts +17 -29
  173. package/src/intervals/index.ts +0 -3
  174. package/src/intervals/intervalUtils.ts +3 -38
  175. package/src/intervals/sequenceInterval.ts +2 -12
  176. package/src/packageVersion.ts +1 -1
  177. package/src/sequence.ts +8 -20
  178. package/src/sharedIntervalCollection.ts +5 -183
  179. package/src/sharedString.ts +6 -24
  180. package/dist/intervals/interval.d.ts +0 -76
  181. package/dist/intervals/interval.d.ts.map +0 -1
  182. package/dist/intervals/interval.js +0 -167
  183. package/dist/intervals/interval.js.map +0 -1
  184. package/lib/intervals/interval.d.ts +0 -76
  185. package/lib/intervals/interval.d.ts.map +0 -1
  186. package/lib/intervals/interval.js +0 -162
  187. package/lib/intervals/interval.js.map +0 -1
  188. package/prettier.config.cjs +0 -8
  189. package/src/intervals/interval.ts +0 -226
@@ -7,49 +7,39 @@
7
7
 
8
8
  import { Client, RedBlackTree } from "@fluidframework/merge-tree/internal";
9
9
 
10
- import {
11
- IIntervalHelpers,
12
- ISerializableInterval,
13
- IntervalType,
14
- SequenceInterval,
15
- sequenceIntervalHelpers,
16
- } from "../intervals/index.js";
10
+ import { createSequenceInterval, IntervalType, SequenceInterval } from "../intervals/index.js";
17
11
  import { ISharedString } from "../sharedString.js";
18
12
 
19
- import { IntervalIndex } from "./intervalIndex.js";
13
+ import { type SequenceIntervalIndex } from "./intervalIndex.js";
20
14
 
21
15
  /**
22
16
  * @internal
23
17
  */
24
- export interface IEndpointIndex<TInterval extends ISerializableInterval>
25
- extends IntervalIndex<TInterval> {
18
+ export interface IEndpointIndex extends SequenceIntervalIndex {
26
19
  /**
27
20
  * @returns the previous interval based on the given position number.
28
21
  * If no such interval exists in this index, returns `undefined`
29
22
  */
30
- previousInterval(pos: number): TInterval | undefined;
23
+ previousInterval(pos: number): SequenceInterval | undefined;
31
24
 
32
25
  /**
33
26
  * @returns the next interval based on the given position number.
34
27
  * If no such interval exists in this index, returns `undefined`
35
28
  */
36
- nextInterval(pos: number): TInterval | undefined;
29
+ nextInterval(pos: number): SequenceInterval | undefined;
37
30
  }
38
31
 
39
- export class EndpointIndex<TInterval extends ISerializableInterval>
40
- implements IEndpointIndex<TInterval>
41
- {
42
- private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;
32
+ export class EndpointIndex implements IEndpointIndex {
33
+ private readonly endIntervalTree: RedBlackTree<SequenceInterval, SequenceInterval>;
43
34
 
44
- constructor(
45
- private readonly client: Client,
46
- private readonly helpers: IIntervalHelpers<TInterval>,
47
- ) {
48
- this.endIntervalTree = new RedBlackTree<TInterval, TInterval>((a, b) => a.compareEnd(b));
35
+ constructor(private readonly client: Client) {
36
+ this.endIntervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>((a, b) =>
37
+ a.compareEnd(b),
38
+ );
49
39
  }
50
40
 
51
- public previousInterval(pos: number): TInterval | undefined {
52
- const transientInterval = this.helpers.create(
41
+ public previousInterval(pos: number): SequenceInterval | undefined {
42
+ const transientInterval = createSequenceInterval(
53
43
  "transient",
54
44
  pos,
55
45
  pos,
@@ -62,8 +52,8 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
62
52
  }
63
53
  }
64
54
 
65
- public nextInterval(pos: number): TInterval | undefined {
66
- const transientInterval = this.helpers.create(
55
+ public nextInterval(pos: number): SequenceInterval | undefined {
56
+ const transientInterval = createSequenceInterval(
67
57
  "transient",
68
58
  pos,
69
59
  pos,
@@ -76,11 +66,11 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
76
66
  }
77
67
  }
78
68
 
79
- public add(interval: TInterval): void {
69
+ public add(interval: SequenceInterval): void {
80
70
  this.endIntervalTree.put(interval, interval);
81
71
  }
82
72
 
83
- public remove(interval: TInterval): void {
73
+ public remove(interval: SequenceInterval): void {
84
74
  this.endIntervalTree.remove(interval);
85
75
  }
86
76
  }
@@ -88,9 +78,7 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
88
78
  /**
89
79
  * @internal
90
80
  */
91
- export function createEndpointIndex(
92
- sharedString: ISharedString,
93
- ): IEndpointIndex<SequenceInterval> {
81
+ export function createEndpointIndex(sharedString: ISharedString): IEndpointIndex {
94
82
  const client = (sharedString as unknown as { client: Client }).client;
95
- return new EndpointIndex<SequenceInterval>(client, sequenceIntervalHelpers);
83
+ return new EndpointIndex(client);
96
84
  }
@@ -6,26 +6,21 @@
6
6
  import { assert } from "@fluidframework/core-utils/internal";
7
7
 
8
8
  import { reservedIntervalIdKey } from "../intervalCollection.js";
9
- import { ISerializableInterval } from "../intervals/index.js";
9
+ import { type SequenceIntervalClass } from "../intervals/index.js";
10
10
 
11
- import { IntervalIndex } from "./intervalIndex.js";
11
+ import { type SequenceIntervalIndex } from "./intervalIndex.js";
12
12
 
13
- /**
14
- * @internal
15
- */
16
- export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
17
- extends IntervalIndex<TInterval>,
18
- Iterable<TInterval> {
19
- getIntervalById(id: string): TInterval | undefined;
13
+ export interface IIdIntervalIndex
14
+ extends SequenceIntervalIndex,
15
+ Iterable<SequenceIntervalClass> {
16
+ getIntervalById(id: string): SequenceIntervalClass | undefined;
20
17
 
21
- [Symbol.iterator](): Iterator<TInterval>;
18
+ [Symbol.iterator](): Iterator<SequenceIntervalClass>;
22
19
  }
23
- class IdIntervalIndex<TInterval extends ISerializableInterval>
24
- implements IIdIntervalIndex<TInterval>, Iterable<TInterval>
25
- {
26
- private readonly intervalIdMap = new Map<string, TInterval>();
20
+ class IdIntervalIndex implements IIdIntervalIndex, Iterable<SequenceIntervalClass> {
21
+ private readonly intervalIdMap = new Map<string, SequenceIntervalClass>();
27
22
 
28
- public add(interval: TInterval) {
23
+ public add(interval: SequenceIntervalClass) {
29
24
  const id = interval.getIntervalId();
30
25
  assert(
31
26
  id !== undefined,
@@ -40,26 +35,21 @@ class IdIntervalIndex<TInterval extends ISerializableInterval>
40
35
  this.intervalIdMap.set(id, interval);
41
36
  }
42
37
 
43
- public remove(interval: TInterval) {
38
+ public remove(interval: SequenceIntervalClass) {
44
39
  const id = interval.getIntervalId();
45
40
  assert(id !== undefined, 0x311 /* expected id to exist on interval */);
46
41
  this.intervalIdMap.delete(id);
47
42
  }
48
43
 
49
- public getIntervalById(id: string): TInterval | undefined {
44
+ public getIntervalById(id: string): SequenceIntervalClass | undefined {
50
45
  return this.intervalIdMap.get(id);
51
46
  }
52
47
 
53
- public [Symbol.iterator](): IterableIterator<TInterval> {
48
+ public [Symbol.iterator](): IterableIterator<SequenceIntervalClass> {
54
49
  return this.intervalIdMap.values();
55
50
  }
56
51
  }
57
52
 
58
- /**
59
- * @internal
60
- */
61
- export function createIdIntervalIndex<
62
- TInterval extends ISerializableInterval,
63
- >(): IIdIntervalIndex<TInterval> {
64
- return new IdIntervalIndex<TInterval>();
53
+ export function createIdIntervalIndex(): IIdIntervalIndex {
54
+ return new IdIntervalIndex();
65
55
  }
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- export { IntervalIndex } from "./intervalIndex.js";
6
+ export { IntervalIndex, SequenceIntervalIndex } from "./intervalIndex.js";
7
7
  export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex.js";
8
8
  export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex.js";
9
9
  export {
@@ -21,5 +21,6 @@ export {
21
21
  IOverlappingIntervalsIndex,
22
22
  createOverlappingIntervalsIndex,
23
23
  OverlappingIntervalsIndex,
24
+ ISequenceOverlappingIntervalsIndex,
24
25
  } from "./overlappingIntervalsIndex.js";
25
26
  export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex.js";
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ISerializableInterval } from "../intervals/index.js";
6
+ import { ISerializableInterval, type SequenceInterval } from "../intervals/index.js";
7
7
 
8
8
  /**
9
9
  * Collection of intervals.
@@ -15,6 +15,8 @@ import { ISerializableInterval } from "../intervals/index.js";
15
15
  * etc.
16
16
  * @legacy
17
17
  * @alpha
18
+ *
19
+ * @remarks The generic version of this interface is no longer used and will be removed. Use {@link SequenceIntervalIndex} instead.
18
20
  */
19
21
  export interface IntervalIndex<TInterval extends ISerializableInterval> {
20
22
  /**
@@ -31,3 +33,30 @@ export interface IntervalIndex<TInterval extends ISerializableInterval> {
31
33
  */
32
34
  remove(interval: TInterval): void;
33
35
  }
36
+
37
+ /**
38
+ * Collection of intervals.
39
+ *
40
+ * Implementers of this interface will typically implement additional APIs to support efficiently querying a collection
41
+ * of intervals in some manner, for example:
42
+ * - "find all intervals with start endpoint between these two points"
43
+ * - "find all intervals which overlap this range"
44
+ * etc.
45
+ * @legacy
46
+ * @alpha
47
+ */
48
+ export interface SequenceIntervalIndex {
49
+ /**
50
+ * Adds an interval to the index.
51
+ * @remarks Application code should never need to invoke this method on their index for production scenarios:
52
+ * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.
53
+ */
54
+ add(interval: SequenceInterval): void;
55
+
56
+ /**
57
+ * Removes an interval from the index.
58
+ * @remarks Application code should never need to invoke this method on their index for production scenarios:
59
+ * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.
60
+ */
61
+ remove(interval: SequenceInterval): void;
62
+ }
@@ -13,19 +13,21 @@ import {
13
13
 
14
14
  import { IntervalNode, IntervalTree } from "../intervalTree.js";
15
15
  import {
16
- IIntervalHelpers,
17
16
  ISerializableInterval,
18
17
  IntervalType,
19
18
  SequenceInterval,
20
- sequenceIntervalHelpers,
19
+ createSequenceInterval,
21
20
  } from "../intervals/index.js";
22
21
  import { ISharedString } from "../sharedString.js";
23
22
 
24
- import { IntervalIndex } from "./intervalIndex.js";
23
+ import { IntervalIndex, type SequenceIntervalIndex } from "./intervalIndex.js";
25
24
 
26
25
  /**
26
+ * The generic version of this interface is deprecated and will be removed in a future release.
27
+ * Use {@link ISequenceOverlappingIntervalsIndex} instead.
27
28
  * @legacy
28
29
  * @alpha
30
+ * @remarks The generic version of this interface is no longer used and will be removed. Use {@link ISequenceOverlappingIntervalsIndex} instead.
29
31
  */
30
32
  export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
31
33
  extends IntervalIndex<TInterval> {
@@ -46,28 +48,46 @@ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInter
46
48
  ): void;
47
49
  }
48
50
 
49
- export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
50
- implements IOverlappingIntervalsIndex<TInterval>
51
- {
52
- protected readonly intervalTree = new IntervalTree<TInterval>();
51
+ /**
52
+ * @legacy
53
+ * @alpha
54
+ */
55
+ export interface ISequenceOverlappingIntervalsIndex extends SequenceIntervalIndex {
56
+ /**
57
+ * @returns an array of all intervals contained in this collection that overlap the range
58
+ * `[start end]`.
59
+ */
60
+ findOverlappingIntervals(start: SequencePlace, end: SequencePlace): SequenceInterval[];
61
+
62
+ /**
63
+ * Gathers the interval results based on specified parameters.
64
+ */
65
+ gatherIterationResults(
66
+ results: SequenceInterval[],
67
+ iteratesForward: boolean,
68
+ start?: SequencePlace,
69
+ end?: SequencePlace,
70
+ ): void;
71
+ }
72
+
73
+ export class OverlappingIntervalsIndex implements ISequenceOverlappingIntervalsIndex {
74
+ protected readonly intervalTree = new IntervalTree<SequenceInterval>();
53
75
  protected readonly client: Client;
54
- protected readonly helpers: IIntervalHelpers<TInterval>;
55
76
 
56
- constructor(client: Client, helpers: IIntervalHelpers<TInterval>) {
77
+ constructor(client: Client) {
57
78
  this.client = client;
58
- this.helpers = helpers;
59
79
  }
60
80
 
61
- public map(fn: (interval: TInterval) => void) {
81
+ public map(fn: (interval: SequenceInterval) => void) {
62
82
  this.intervalTree.map(fn);
63
83
  }
64
84
 
65
- public mapUntil(fn: (interval: TInterval) => boolean) {
85
+ public mapUntil(fn: (interval: SequenceInterval) => boolean) {
66
86
  this.intervalTree.mapUntil(fn);
67
87
  }
68
88
 
69
89
  public gatherIterationResults(
70
- results: TInterval[],
90
+ results: SequenceInterval[],
71
91
  iteratesForward: boolean,
72
92
  start?: SequencePlace,
73
93
  end?: SequencePlace,
@@ -79,16 +99,16 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
79
99
  if (start === undefined && end === undefined) {
80
100
  // No start/end provided. Gather the whole tree in the specified order.
81
101
  if (iteratesForward) {
82
- this.intervalTree.map((interval: TInterval) => {
102
+ this.intervalTree.map((interval: SequenceInterval) => {
83
103
  results.push(interval);
84
104
  });
85
105
  } else {
86
- this.intervalTree.mapBackward((interval: TInterval) => {
106
+ this.intervalTree.mapBackward((interval: SequenceInterval) => {
87
107
  results.push(interval);
88
108
  });
89
109
  }
90
110
  } else {
91
- const transientInterval: TInterval = this.helpers.create(
111
+ const transientInterval: SequenceInterval = createSequenceInterval(
92
112
  "transient",
93
113
  start ?? "start",
94
114
  end ?? "end",
@@ -100,13 +120,13 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
100
120
  // Only end position provided. Since the tree is not sorted by end position,
101
121
  // walk the whole tree in the specified order, gathering intervals that match the end.
102
122
  if (iteratesForward) {
103
- this.intervalTree.map((interval: TInterval) => {
123
+ this.intervalTree.map((interval: SequenceInterval) => {
104
124
  if (transientInterval.compareEnd(interval) === 0) {
105
125
  results.push(interval);
106
126
  }
107
127
  });
108
128
  } else {
109
- this.intervalTree.mapBackward((interval: TInterval) => {
129
+ this.intervalTree.mapBackward((interval: SequenceInterval) => {
110
130
  if (transientInterval.compareEnd(interval) === 0) {
111
131
  results.push(interval);
112
132
  }
@@ -117,15 +137,15 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
117
137
  // this start position.
118
138
  const compareFn =
119
139
  end === undefined
120
- ? (node: IntervalNode<TInterval>) => {
140
+ ? (node: IntervalNode<SequenceInterval>) => {
121
141
  return transientInterval.compareStart(node.key);
122
142
  }
123
- : (node: IntervalNode<TInterval>) => {
143
+ : (node: IntervalNode<SequenceInterval>) => {
124
144
  return transientInterval.compare(node.key);
125
145
  };
126
146
  const continueLeftFn = (cmpResult: number) => cmpResult <= 0;
127
147
  const continueRightFn = (cmpResult: number) => cmpResult >= 0;
128
- const actionFn = (node: IntervalNode<TInterval>) => {
148
+ const actionFn = (node: IntervalNode<SequenceInterval>) => {
129
149
  results.push(node.key);
130
150
  };
131
151
 
@@ -148,7 +168,10 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
148
168
  }
149
169
  }
150
170
 
151
- public findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[] {
171
+ public findOverlappingIntervals(
172
+ start: SequencePlace,
173
+ end: SequencePlace,
174
+ ): SequenceInterval[] {
152
175
  const { startPos, endPos } = endpointPosAndSide(start, end);
153
176
 
154
177
  if (
@@ -161,7 +184,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
161
184
  ) {
162
185
  return [];
163
186
  }
164
- const transientInterval = this.helpers.create(
187
+ const transientInterval = createSequenceInterval(
165
188
  "transient",
166
189
  start,
167
190
  end,
@@ -173,11 +196,11 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
173
196
  return overlappingIntervalNodes.map((node) => node.key);
174
197
  }
175
198
 
176
- public remove(interval: TInterval) {
199
+ public remove(interval: SequenceInterval) {
177
200
  this.intervalTree.removeExisting(interval);
178
201
  }
179
202
 
180
- public add(interval: TInterval) {
203
+ public add(interval: SequenceInterval) {
181
204
  this.intervalTree.put(interval);
182
205
  }
183
206
  }
@@ -188,7 +211,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
188
211
  */
189
212
  export function createOverlappingIntervalsIndex(
190
213
  sharedString: ISharedString,
191
- ): IOverlappingIntervalsIndex<SequenceInterval> {
214
+ ): ISequenceOverlappingIntervalsIndex {
192
215
  const client = (sharedString as unknown as { client: Client }).client;
193
- return new OverlappingIntervalsIndex<SequenceInterval>(client, sequenceIntervalHelpers);
216
+ return new OverlappingIntervalsIndex(client);
194
217
  }
@@ -18,7 +18,6 @@ import {
18
18
  SequenceInterval,
19
19
  SequenceIntervalClass,
20
20
  createPositionReferenceFromSegoff,
21
- sequenceIntervalHelpers,
22
21
  } from "../intervals/index.js";
23
22
  import { ISharedString } from "../sharedString.js";
24
23
 
@@ -26,11 +25,11 @@ import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
26
25
  import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
27
26
 
28
27
  class OverlappingSequenceIntervalsIndex
29
- extends OverlappingIntervalsIndex<SequenceInterval>
28
+ extends OverlappingIntervalsIndex
30
29
  implements SequenceIntervalIndexes.Overlapping
31
30
  {
32
31
  constructor(client: Client) {
33
- super(client, sequenceIntervalHelpers);
32
+ super(client);
34
33
  }
35
34
 
36
35
  public findOverlappingIntervalsBySegoff(
@@ -7,7 +7,7 @@ import { ISegment } from "@fluidframework/merge-tree/internal";
7
7
 
8
8
  import { SequenceInterval } from "../intervals/index.js";
9
9
 
10
- import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
10
+ import { type ISequenceOverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
11
11
 
12
12
  /**
13
13
  * This namespace contains specialiazations of indexes which support spatial queries
@@ -22,7 +22,7 @@ export namespace SequenceIntervalIndexes {
22
22
  * Provides additional APIs to support efficiently querying a collection of intervals based on segments and offset.
23
23
  * @internal
24
24
  */
25
- export interface Overlapping extends IOverlappingIntervalsIndex<SequenceInterval> {
25
+ export interface Overlapping extends ISequenceOverlappingIntervalsIndex {
26
26
  /**
27
27
  * Finds overlapping intervals within the specified range.
28
28
  *
@@ -7,16 +7,10 @@
7
7
 
8
8
  import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree/internal";
9
9
 
10
- import {
11
- IIntervalHelpers,
12
- ISerializableInterval,
13
- IntervalType,
14
- SequenceInterval,
15
- sequenceIntervalHelpers,
16
- } from "../intervals/index.js";
10
+ import { IntervalType, SequenceInterval, createSequenceInterval } from "../intervals/index.js";
17
11
  import { ISharedString } from "../sharedString.js";
18
12
 
19
- import { IntervalIndex } from "./intervalIndex.js";
13
+ import { type SequenceIntervalIndex } from "./intervalIndex.js";
20
14
  import {
21
15
  HasComparisonOverride,
22
16
  compareOverrideables,
@@ -29,25 +23,19 @@ import {
29
23
  * Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.
30
24
  * @internal
31
25
  */
32
- export interface IStartpointInRangeIndex<TInterval extends ISerializableInterval>
33
- extends IntervalIndex<TInterval> {
26
+ export interface IStartpointInRangeIndex extends SequenceIntervalIndex {
34
27
  /**
35
28
  * @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)
36
29
  */
37
- findIntervalsWithStartpointInRange(start: number, end: number): TInterval[];
30
+ findIntervalsWithStartpointInRange(start: number, end: number): SequenceInterval[];
38
31
  }
39
32
 
40
- export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
41
- implements IStartpointInRangeIndex<TInterval>
42
- {
33
+ export class StartpointInRangeIndex implements IStartpointInRangeIndex {
43
34
  private readonly intervalTree;
44
35
 
45
- constructor(
46
- private readonly client: Client,
47
- private readonly helpers: IIntervalHelpers<TInterval>,
48
- ) {
49
- this.intervalTree = new RedBlackTree<TInterval, TInterval>(
50
- (a: TInterval, b: TInterval) => {
36
+ constructor(private readonly client: Client) {
37
+ this.intervalTree = new RedBlackTree<SequenceInterval, SequenceInterval>(
38
+ (a: SequenceInterval, b: SequenceInterval) => {
51
39
  const compareStartsResult = a.compareStart(b);
52
40
  if (compareStartsResult !== 0) {
53
41
  return compareStartsResult;
@@ -70,25 +58,25 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
70
58
  );
71
59
  }
72
60
 
73
- public add(interval: TInterval): void {
61
+ public add(interval: SequenceInterval): void {
74
62
  this.intervalTree.put(interval, interval);
75
63
  }
76
64
 
77
- public remove(interval: TInterval): void {
65
+ public remove(interval: SequenceInterval): void {
78
66
  this.intervalTree.remove(interval);
79
67
  }
80
68
 
81
- public findIntervalsWithStartpointInRange(start: number, end: number): TInterval[] {
69
+ public findIntervalsWithStartpointInRange(start: number, end: number): SequenceInterval[] {
82
70
  if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
83
71
  return [];
84
72
  }
85
- const results: TInterval[] = [];
86
- const action: PropertyAction<TInterval, TInterval> = (node) => {
73
+ const results: SequenceInterval[] = [];
74
+ const action: PropertyAction<SequenceInterval, SequenceInterval> = (node) => {
87
75
  results.push(node.data);
88
76
  return true;
89
77
  };
90
78
 
91
- const transientStartInterval = this.helpers.create(
79
+ const transientStartInterval = createSequenceInterval(
92
80
  "transient",
93
81
  start,
94
82
  start,
@@ -96,7 +84,7 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
96
84
  IntervalType.Transient,
97
85
  );
98
86
 
99
- const transientEndInterval = this.helpers.create(
87
+ const transientEndInterval = createSequenceInterval(
100
88
  "transient",
101
89
  end,
102
90
  end,
@@ -117,7 +105,7 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
117
105
  */
118
106
  export function createStartpointInRangeIndex(
119
107
  sharedString: ISharedString,
120
- ): IStartpointInRangeIndex<SequenceInterval> {
108
+ ): IStartpointInRangeIndex {
121
109
  const client = (sharedString as unknown as { client: Client }).client;
122
- return new StartpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);
110
+ return new StartpointInRangeIndex(client);
123
111
  }
@@ -10,7 +10,6 @@ export {
10
10
  IntervalOpType,
11
11
  IntervalType,
12
12
  IntervalDeltaOpType,
13
- IIntervalHelpers,
14
13
  IntervalStickiness,
15
14
  ISerializableIntervalPrivate,
16
15
  SerializedIntervalDelta,
@@ -18,11 +17,9 @@ export {
18
17
  endReferenceSlidingPreference,
19
18
  startReferenceSlidingPreference,
20
19
  } from "./intervalUtils.js";
21
- export { Interval, createInterval, intervalHelpers } from "./interval.js";
22
20
  export {
23
21
  SequenceInterval,
24
22
  SequenceIntervalClass,
25
23
  createSequenceInterval,
26
24
  createPositionReferenceFromSegoff,
27
- sequenceIntervalHelpers,
28
25
  } from "./sequenceInterval.js";
@@ -7,9 +7,6 @@
7
7
 
8
8
  import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
9
9
  import {
10
- // eslint-disable-next-line import/no-deprecated
11
- Client,
12
- // eslint-disable-next-line import/no-deprecated
13
10
  PropertiesManager,
14
11
  PropertySet,
15
12
  SlidingPreference,
@@ -17,6 +14,8 @@ import {
17
14
  Side,
18
15
  } from "@fluidframework/merge-tree/internal";
19
16
 
17
+ import type { SequenceIntervalClass } from "./sequenceInterval.js";
18
+
20
19
  /**
21
20
  * Basic interval abstraction
22
21
  * @legacy
@@ -172,7 +171,7 @@ export interface ISerializableInterval extends IInterval {
172
171
  getIntervalId(): string;
173
172
  }
174
173
 
175
- export type ISerializableIntervalPrivate<T extends ISerializableInterval> = T & {
174
+ export type ISerializableIntervalPrivate = SequenceIntervalClass & {
176
175
  propertyManager?: PropertiesManager;
177
176
  };
178
177
 
@@ -215,40 +214,6 @@ export type CompressedSerializedInterval =
215
214
  ]
216
215
  | [number | "start" | "end", number | "start" | "end", number, IntervalType, PropertySet];
217
216
 
218
- /**
219
- * @sealed
220
- * @deprecated The methods within have substitutions
221
- * @internal
222
- */
223
- export interface IIntervalHelpers<TInterval extends ISerializableInterval> {
224
- /**
225
- *
226
- * @param label - label of the interval collection this interval is being added to. This parameter is
227
- * irrelevant for transient intervals.
228
- * @param start - numerical start position of the interval
229
- * @param end - numerical end position of the interval
230
- * @param client - client creating the interval
231
- * @param intervalType - Type of interval to create. Default is SlideOnRemove
232
- * @param op - If this create came from a remote client, op that created it. Default is undefined (i.e. local)
233
- * @param fromSnapshot - If this create came from loading a snapshot. Default is false.
234
- * @param startSide - The side on which the start position lays. See
235
- * {@link @fluidframework/merge-tree#SequencePlace} for additional context
236
- * @param endSide - The side on which the end position lays. See
237
- * {@link @fluidframework/merge-tree#SequencePlace} for additional context
238
- */
239
- create(
240
- label: string,
241
- start: SequencePlace | undefined,
242
- end: SequencePlace | undefined,
243
- // eslint-disable-next-line import/no-deprecated
244
- client: Client | undefined,
245
- intervalType: IntervalType,
246
- op?: ISequencedDocumentMessage,
247
- fromSnapshot?: boolean,
248
- useNewSlidingBehavior?: boolean,
249
- ): TInterval;
250
- }
251
-
252
217
  /**
253
218
  * Determines how an interval should expand when segments are inserted adjacent
254
219
  * to the range it spans