@fluidframework/sequence 2.0.0-dev.6.4.0.192049 → 2.0.0-dev.7.2.0.204906

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 (226) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +130 -0
  3. package/api-extractor.json +1 -1
  4. package/api-report/sequence.api.md +717 -0
  5. package/dist/defaultMap.d.ts +1 -1
  6. package/dist/defaultMap.d.ts.map +1 -1
  7. package/dist/defaultMap.js +6 -6
  8. package/dist/defaultMap.js.map +1 -1
  9. package/dist/defaultMapInterfaces.d.ts +22 -2
  10. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  11. package/dist/defaultMapInterfaces.js.map +1 -1
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/intervalCollection.d.ts +164 -16
  17. package/dist/intervalCollection.d.ts.map +1 -1
  18. package/dist/intervalCollection.js +174 -54
  19. package/dist/intervalCollection.js.map +1 -1
  20. package/dist/intervalIndex/endpointInRangeIndex.d.ts +17 -3
  21. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  22. package/dist/intervalIndex/endpointInRangeIndex.js +12 -6
  23. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  24. package/dist/intervalIndex/endpointIndex.d.ts +19 -2
  25. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  26. package/dist/intervalIndex/endpointIndex.js +10 -5
  27. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  28. package/dist/intervalIndex/idIntervalIndex.d.ts +6 -0
  29. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  30. package/dist/intervalIndex/idIntervalIndex.js +3 -0
  31. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  32. package/dist/intervalIndex/index.d.ts +4 -4
  33. package/dist/intervalIndex/index.d.ts.map +1 -1
  34. package/dist/intervalIndex/index.js +5 -1
  35. package/dist/intervalIndex/index.js.map +1 -1
  36. package/dist/intervalIndex/intervalIndex.d.ts +1 -0
  37. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  38. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  39. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +17 -6
  40. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  41. package/dist/intervalIndex/overlappingIntervalsIndex.js +17 -4
  42. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  43. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +5 -2
  44. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  45. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +9 -1
  46. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  47. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
  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 +17 -3
  51. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  52. package/dist/intervalIndex/startpointInRangeIndex.js +12 -8
  53. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  54. package/dist/intervalTree.d.ts +1 -1
  55. package/dist/intervalTree.d.ts.map +1 -1
  56. package/dist/intervals/interval.d.ts +4 -2
  57. package/dist/intervals/interval.d.ts.map +1 -1
  58. package/dist/intervals/interval.js +14 -5
  59. package/dist/intervals/interval.js.map +1 -1
  60. package/dist/intervals/intervalUtils.d.ts +51 -18
  61. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  62. package/dist/intervals/intervalUtils.js +18 -10
  63. package/dist/intervals/intervalUtils.js.map +1 -1
  64. package/dist/intervals/sequenceInterval.d.ts +28 -13
  65. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  66. package/dist/intervals/sequenceInterval.js +124 -43
  67. package/dist/intervals/sequenceInterval.js.map +1 -1
  68. package/dist/localValues.d.ts.map +1 -1
  69. package/dist/localValues.js.map +1 -1
  70. package/dist/packageVersion.d.ts +1 -1
  71. package/dist/packageVersion.js +1 -1
  72. package/dist/packageVersion.js.map +1 -1
  73. package/dist/revertibles.d.ts +3 -15
  74. package/dist/revertibles.d.ts.map +1 -1
  75. package/dist/revertibles.js +11 -19
  76. package/dist/revertibles.js.map +1 -1
  77. package/dist/sequence-alpha.d.ts +1587 -0
  78. package/dist/sequence-beta.d.ts +1507 -0
  79. package/dist/sequence-public.d.ts +1507 -0
  80. package/dist/sequence-untrimmed.d.ts +1759 -0
  81. package/dist/sequence.d.ts +8 -4
  82. package/dist/sequence.d.ts.map +1 -1
  83. package/dist/sequence.js +53 -48
  84. package/dist/sequence.js.map +1 -1
  85. package/dist/sequenceDeltaEvent.d.ts +4 -0
  86. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  87. package/dist/sequenceDeltaEvent.js +3 -0
  88. package/dist/sequenceDeltaEvent.js.map +1 -1
  89. package/dist/sequenceFactory.d.ts +3 -0
  90. package/dist/sequenceFactory.d.ts.map +1 -1
  91. package/dist/sequenceFactory.js +4 -1
  92. package/dist/sequenceFactory.js.map +1 -1
  93. package/dist/sharedIntervalCollection.d.ts +5 -0
  94. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  95. package/dist/sharedIntervalCollection.js +11 -9
  96. package/dist/sharedIntervalCollection.js.map +1 -1
  97. package/dist/sharedSequence.d.ts +6 -3
  98. package/dist/sharedSequence.d.ts.map +1 -1
  99. package/dist/sharedSequence.js +10 -8
  100. package/dist/sharedSequence.js.map +1 -1
  101. package/dist/sharedString.d.ts +17 -2
  102. package/dist/sharedString.d.ts.map +1 -1
  103. package/dist/sharedString.js +21 -7
  104. package/dist/sharedString.js.map +1 -1
  105. package/dist/tsdoc-metadata.json +1 -1
  106. package/lib/defaultMap.d.ts +1 -1
  107. package/lib/defaultMap.d.ts.map +1 -1
  108. package/lib/defaultMap.js +6 -6
  109. package/lib/defaultMap.js.map +1 -1
  110. package/lib/defaultMapInterfaces.d.ts +22 -2
  111. package/lib/defaultMapInterfaces.d.ts.map +1 -1
  112. package/lib/defaultMapInterfaces.js.map +1 -1
  113. package/lib/index.d.ts +2 -2
  114. package/lib/index.d.ts.map +1 -1
  115. package/lib/index.js +1 -1
  116. package/lib/index.js.map +1 -1
  117. package/lib/intervalCollection.d.ts +164 -16
  118. package/lib/intervalCollection.d.ts.map +1 -1
  119. package/lib/intervalCollection.js +172 -55
  120. package/lib/intervalCollection.js.map +1 -1
  121. package/lib/intervalIndex/endpointInRangeIndex.d.ts +17 -3
  122. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  123. package/lib/intervalIndex/endpointInRangeIndex.js +12 -7
  124. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  125. package/lib/intervalIndex/endpointIndex.d.ts +19 -2
  126. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  127. package/lib/intervalIndex/endpointIndex.js +10 -6
  128. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  129. package/lib/intervalIndex/idIntervalIndex.d.ts +6 -0
  130. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  131. package/lib/intervalIndex/idIntervalIndex.js +3 -0
  132. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  133. package/lib/intervalIndex/index.d.ts +4 -4
  134. package/lib/intervalIndex/index.d.ts.map +1 -1
  135. package/lib/intervalIndex/index.js +4 -4
  136. package/lib/intervalIndex/index.js.map +1 -1
  137. package/lib/intervalIndex/intervalIndex.d.ts +1 -0
  138. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -1
  139. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  140. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +17 -6
  141. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  142. package/lib/intervalIndex/overlappingIntervalsIndex.js +18 -5
  143. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  144. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +5 -2
  145. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  146. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +9 -1
  147. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  148. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
  149. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  150. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  151. package/lib/intervalIndex/startpointInRangeIndex.d.ts +17 -3
  152. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  153. package/lib/intervalIndex/startpointInRangeIndex.js +12 -9
  154. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  155. package/lib/intervalTree.d.ts +1 -1
  156. package/lib/intervalTree.d.ts.map +1 -1
  157. package/lib/intervals/interval.d.ts +4 -2
  158. package/lib/intervals/interval.d.ts.map +1 -1
  159. package/lib/intervals/interval.js +14 -5
  160. package/lib/intervals/interval.js.map +1 -1
  161. package/lib/intervals/intervalUtils.d.ts +51 -18
  162. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  163. package/lib/intervals/intervalUtils.js +14 -6
  164. package/lib/intervals/intervalUtils.js.map +1 -1
  165. package/lib/intervals/sequenceInterval.d.ts +28 -13
  166. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  167. package/lib/intervals/sequenceInterval.js +125 -42
  168. package/lib/intervals/sequenceInterval.js.map +1 -1
  169. package/lib/localValues.d.ts.map +1 -1
  170. package/lib/localValues.js.map +1 -1
  171. package/lib/packageVersion.d.ts +1 -1
  172. package/lib/packageVersion.js +1 -1
  173. package/lib/packageVersion.js.map +1 -1
  174. package/lib/revertibles.d.ts +3 -15
  175. package/lib/revertibles.d.ts.map +1 -1
  176. package/lib/revertibles.js +11 -19
  177. package/lib/revertibles.js.map +1 -1
  178. package/lib/sequence.d.ts +8 -4
  179. package/lib/sequence.d.ts.map +1 -1
  180. package/lib/sequence.js +56 -49
  181. package/lib/sequence.js.map +1 -1
  182. package/lib/sequenceDeltaEvent.d.ts +4 -0
  183. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  184. package/lib/sequenceDeltaEvent.js +3 -0
  185. package/lib/sequenceDeltaEvent.js.map +1 -1
  186. package/lib/sequenceFactory.d.ts +3 -0
  187. package/lib/sequenceFactory.d.ts.map +1 -1
  188. package/lib/sequenceFactory.js +4 -1
  189. package/lib/sequenceFactory.js.map +1 -1
  190. package/lib/sharedIntervalCollection.d.ts +5 -0
  191. package/lib/sharedIntervalCollection.d.ts.map +1 -1
  192. package/lib/sharedIntervalCollection.js +11 -9
  193. package/lib/sharedIntervalCollection.js.map +1 -1
  194. package/lib/sharedSequence.d.ts +6 -3
  195. package/lib/sharedSequence.d.ts.map +1 -1
  196. package/lib/sharedSequence.js +10 -8
  197. package/lib/sharedSequence.js.map +1 -1
  198. package/lib/sharedString.d.ts +17 -2
  199. package/lib/sharedString.d.ts.map +1 -1
  200. package/lib/sharedString.js +21 -7
  201. package/lib/sharedString.js.map +1 -1
  202. package/package.json +31 -30
  203. package/src/defaultMapInterfaces.ts +22 -2
  204. package/src/index.ts +4 -1
  205. package/src/intervalCollection.ts +423 -82
  206. package/src/intervalIndex/endpointInRangeIndex.ts +23 -11
  207. package/src/intervalIndex/endpointIndex.ts +22 -9
  208. package/src/intervalIndex/idIntervalIndex.ts +7 -1
  209. package/src/intervalIndex/index.ts +12 -3
  210. package/src/intervalIndex/intervalIndex.ts +1 -0
  211. package/src/intervalIndex/overlappingIntervalsIndex.ts +40 -15
  212. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +10 -1
  213. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -1
  214. package/src/intervalIndex/startpointInRangeIndex.ts +23 -18
  215. package/src/intervals/interval.ts +35 -8
  216. package/src/intervals/intervalUtils.ts +61 -27
  217. package/src/intervals/sequenceInterval.ts +197 -47
  218. package/src/localValues.ts +4 -1
  219. package/src/packageVersion.ts +1 -1
  220. package/src/revertibles.ts +14 -36
  221. package/src/sequence.ts +14 -5
  222. package/src/sequenceDeltaEvent.ts +4 -0
  223. package/src/sequenceFactory.ts +4 -1
  224. package/src/sharedIntervalCollection.ts +5 -0
  225. package/src/sharedSequence.ts +6 -3
  226. package/src/sharedString.ts +25 -2
@@ -2,9 +2,17 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree";
7
- import { IIntervalHelpers, ISerializableInterval, IntervalType } from "../intervals";
8
+ import {
9
+ IIntervalHelpers,
10
+ ISerializableInterval,
11
+ IntervalType,
12
+ SequenceInterval,
13
+ sequenceIntervalHelpers,
14
+ } from "../intervals";
15
+ import { SharedString } from "../sharedString";
8
16
  import { IntervalIndex } from "./intervalIndex";
9
17
  import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
10
18
 
@@ -12,26 +20,27 @@ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./int
12
20
  * Collection of intervals.
13
21
  *
14
22
  * Provide additional APIs to support efficiently querying a collection of intervals whose endpoints fall within a specified range.
23
+ * @public
15
24
  */
16
25
  export interface IEndpointInRangeIndex<TInterval extends ISerializableInterval>
17
26
  extends IntervalIndex<TInterval> {
18
27
  /**
19
28
  * @returns an array of all intervals contained in this collection whose endpoints locate in the range [start, end] (includes both ends)
20
29
  */
21
- findIntervalsWithEndpointInRange(start: number, end: number);
30
+ findIntervalsWithEndpointInRange(start: number, end: number): TInterval[];
22
31
  }
23
32
 
24
- class EndpointInRangeIndex<TInterval extends ISerializableInterval>
33
+ export class EndpointInRangeIndex<TInterval extends ISerializableInterval>
25
34
  implements IEndpointInRangeIndex<TInterval>
26
35
  {
27
36
  private readonly intervalTree;
28
37
 
29
38
  constructor(
30
- private readonly helpers: IIntervalHelpers<TInterval>,
31
39
  private readonly client: Client,
40
+ private readonly helpers: IIntervalHelpers<TInterval>,
32
41
  ) {
33
42
  this.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {
34
- const compareEndsResult = helpers.compareEnds(a, b);
43
+ const compareEndsResult = a.compareEnd(b);
35
44
  if (compareEndsResult !== 0) {
36
45
  return compareEndsResult;
37
46
  }
@@ -61,7 +70,7 @@ class EndpointInRangeIndex<TInterval extends ISerializableInterval>
61
70
  this.intervalTree.remove(interval);
62
71
  }
63
72
 
64
- public findIntervalsWithEndpointInRange(start: number, end: number) {
73
+ public findIntervalsWithEndpointInRange(start: number, end: number): TInterval[] {
65
74
  if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
66
75
  return [];
67
76
  }
@@ -96,9 +105,12 @@ class EndpointInRangeIndex<TInterval extends ISerializableInterval>
96
105
  }
97
106
  }
98
107
 
99
- export function createEndpointInRangeIndex<TInterval extends ISerializableInterval>(
100
- helpers: IIntervalHelpers<TInterval>,
101
- client: Client,
102
- ): IEndpointInRangeIndex<TInterval> {
103
- return new EndpointInRangeIndex<TInterval>(helpers, client);
108
+ /**
109
+ * @public
110
+ */
111
+ export function createEndpointInRangeIndex(
112
+ sharedString: SharedString,
113
+ ): IEndpointInRangeIndex<SequenceInterval> {
114
+ const client = (sharedString as unknown as { client: Client }).client;
115
+ return new EndpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);
104
116
  }
@@ -2,11 +2,22 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import { Client, RedBlackTree } from "@fluidframework/merge-tree";
7
- import { IIntervalHelpers, ISerializableInterval, IntervalType } from "../intervals";
8
+ import {
9
+ IIntervalHelpers,
10
+ ISerializableInterval,
11
+ IntervalType,
12
+ SequenceInterval,
13
+ sequenceIntervalHelpers,
14
+ } from "../intervals";
15
+ import { SharedString } from "../sharedString";
8
16
  import { IntervalIndex } from "./intervalIndex";
9
17
 
18
+ /**
19
+ * @public
20
+ */
10
21
  export interface IEndpointIndex<TInterval extends ISerializableInterval>
11
22
  extends IntervalIndex<TInterval> {
12
23
  /**
@@ -22,15 +33,16 @@ export interface IEndpointIndex<TInterval extends ISerializableInterval>
22
33
  nextInterval(pos: number): TInterval | undefined;
23
34
  }
24
35
 
25
- class EndpointIndex<TInterval extends ISerializableInterval> implements IEndpointIndex<TInterval> {
36
+ export class EndpointIndex<TInterval extends ISerializableInterval>
37
+ implements IEndpointIndex<TInterval>
38
+ {
26
39
  private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;
27
40
 
28
41
  constructor(
29
42
  private readonly client: Client,
30
43
  private readonly helpers: IIntervalHelpers<TInterval>,
31
44
  ) {
32
- // eslint-disable-next-line @typescript-eslint/unbound-method
33
- this.endIntervalTree = new RedBlackTree<TInterval, TInterval>(helpers.compareEnds);
45
+ this.endIntervalTree = new RedBlackTree<TInterval, TInterval>((a, b) => a.compareEnd(b));
34
46
  }
35
47
 
36
48
  public previousInterval(pos: number): TInterval | undefined {
@@ -70,9 +82,10 @@ class EndpointIndex<TInterval extends ISerializableInterval> implements IEndpoin
70
82
  }
71
83
  }
72
84
 
73
- export function createEndpointIndex<TInterval extends ISerializableInterval>(
74
- client: Client,
75
- helpers: IIntervalHelpers<TInterval>,
76
- ): IEndpointIndex<TInterval> {
77
- return new EndpointIndex<TInterval>(client, helpers);
85
+ /**
86
+ * @public
87
+ */
88
+ export function createEndpointIndex(sharedString: SharedString): IEndpointIndex<SequenceInterval> {
89
+ const client = (sharedString as unknown as { client: Client }).client;
90
+ return new EndpointIndex<SequenceInterval>(client, sequenceIntervalHelpers);
78
91
  }
@@ -9,6 +9,9 @@ import { IntervalIndex } from "./intervalIndex";
9
9
 
10
10
  const reservedIntervalIdKey = "intervalId";
11
11
 
12
+ /**
13
+ * @public
14
+ */
12
15
  export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
13
16
  extends IntervalIndex<TInterval>,
14
17
  Iterable<TInterval> {
@@ -19,7 +22,7 @@ export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
19
22
  class IdIntervalIndex<TInterval extends ISerializableInterval>
20
23
  implements IIdIntervalIndex<TInterval>, Iterable<TInterval>
21
24
  {
22
- private readonly intervalIdMap: Map<string, TInterval> = new Map();
25
+ private readonly intervalIdMap = new Map<string, TInterval>();
23
26
 
24
27
  public add(interval: TInterval) {
25
28
  const id = interval.getIntervalId();
@@ -51,6 +54,9 @@ class IdIntervalIndex<TInterval extends ISerializableInterval>
51
54
  }
52
55
  }
53
56
 
57
+ /**
58
+ * @public
59
+ */
54
60
  export function createIdIntervalIndex<
55
61
  TInterval extends ISerializableInterval,
56
62
  >(): IIdIntervalIndex<TInterval> {
@@ -5,12 +5,21 @@
5
5
 
6
6
  export { IntervalIndex } from "./intervalIndex";
7
7
  export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex";
8
- export { IEndpointIndex, createEndpointIndex } from "./endpointIndex";
9
- export { IEndpointInRangeIndex, createEndpointInRangeIndex } from "./endpointInRangeIndex";
10
- export { IStartpointInRangeIndex, createStartpointInRangeIndex } from "./startpointInRangeIndex";
8
+ export { IEndpointIndex, createEndpointIndex, EndpointIndex } from "./endpointIndex";
9
+ export {
10
+ IEndpointInRangeIndex,
11
+ createEndpointInRangeIndex,
12
+ EndpointInRangeIndex,
13
+ } from "./endpointInRangeIndex";
14
+ export {
15
+ IStartpointInRangeIndex,
16
+ createStartpointInRangeIndex,
17
+ StartpointInRangeIndex,
18
+ } from "./startpointInRangeIndex";
11
19
  export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
12
20
  export {
13
21
  IOverlappingIntervalsIndex,
14
22
  createOverlappingIntervalsIndex,
23
+ OverlappingIntervalsIndex,
15
24
  } from "./overlappingIntervalsIndex";
16
25
  export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex";
@@ -13,6 +13,7 @@ import { ISerializableInterval } from "../intervals";
13
13
  * - "find all intervals with start endpoint between these two points"
14
14
  * - "find all intervals which overlap this range"
15
15
  * etc.
16
+ * @public
16
17
  */
17
18
  export interface IntervalIndex<TInterval extends ISerializableInterval> {
18
19
  /**
@@ -2,19 +2,31 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import { Client } from "@fluidframework/merge-tree";
7
- import { IntervalType, IIntervalHelpers, ISerializableInterval } from "../intervals";
8
+ import {
9
+ IntervalType,
10
+ IIntervalHelpers,
11
+ ISerializableInterval,
12
+ sequenceIntervalHelpers,
13
+ SequenceInterval,
14
+ } from "../intervals";
8
15
  import { IntervalNode, IntervalTree } from "../intervalTree";
16
+ import { SharedString } from "../sharedString";
17
+ import { SequencePlace, endpointPosAndSide } from "../intervalCollection";
9
18
  import { IntervalIndex } from "./intervalIndex";
10
19
 
20
+ /**
21
+ * @public
22
+ */
11
23
  export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
12
24
  extends IntervalIndex<TInterval> {
13
25
  /**
14
26
  * @returns an array of all intervals contained in this collection that overlap the range
15
27
  * `[start end]`.
16
28
  */
17
- findOverlappingIntervals(start: number, end: number): TInterval[];
29
+ findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[];
18
30
 
19
31
  /**
20
32
  * Gathers the interval results based on specified parameters.
@@ -22,11 +34,14 @@ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInter
22
34
  gatherIterationResults(
23
35
  results: TInterval[],
24
36
  iteratesForward: boolean,
25
- start?: number,
26
- end?: number,
37
+ start?: SequencePlace,
38
+ end?: SequencePlace,
27
39
  ): void;
28
40
  }
29
41
 
42
+ /**
43
+ * @public
44
+ */
30
45
  export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
31
46
  implements IOverlappingIntervalsIndex<TInterval>
32
47
  {
@@ -50,8 +65,8 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
50
65
  public gatherIterationResults(
51
66
  results: TInterval[],
52
67
  iteratesForward: boolean,
53
- start?: number,
54
- end?: number,
68
+ start?: SequencePlace,
69
+ end?: SequencePlace,
55
70
  ): void {
56
71
  if (this.intervalTree.intervals.isEmpty()) {
57
72
  return;
@@ -71,8 +86,8 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
71
86
  } else {
72
87
  const transientInterval: TInterval = this.helpers.create(
73
88
  "transient",
74
- start,
75
- end,
89
+ start ?? "start",
90
+ end ?? "end",
76
91
  this.client,
77
92
  IntervalType.Transient,
78
93
  );
@@ -129,8 +144,15 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
129
144
  }
130
145
  }
131
146
 
132
- public findOverlappingIntervals(start: number, end: number): TInterval[] {
133
- if (end < start || this.intervalTree.intervals.isEmpty()) {
147
+ public findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[] {
148
+ const { startPos, endPos } = endpointPosAndSide(start, end);
149
+
150
+ if (
151
+ startPos === undefined ||
152
+ endPos === undefined ||
153
+ endPos < startPos ||
154
+ this.intervalTree.intervals.isEmpty()
155
+ ) {
134
156
  return [];
135
157
  }
136
158
  const transientInterval = this.helpers.create(
@@ -154,9 +176,12 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
154
176
  }
155
177
  }
156
178
 
157
- export function createOverlappingIntervalsIndex<TInterval extends ISerializableInterval>(
158
- client: Client,
159
- helpers: IIntervalHelpers<TInterval>,
160
- ): IOverlappingIntervalsIndex<TInterval> {
161
- return new OverlappingIntervalsIndex<TInterval>(client, helpers);
179
+ /**
180
+ * @public
181
+ */
182
+ export function createOverlappingIntervalsIndex(
183
+ sharedString: SharedString,
184
+ ): IOverlappingIntervalsIndex<SequenceInterval> {
185
+ const client = (sharedString as unknown as { client: Client }).client;
186
+ return new OverlappingIntervalsIndex<SequenceInterval>(client, sequenceIntervalHelpers);
162
187
  }
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import {
7
8
  Client,
@@ -16,9 +17,13 @@ import {
16
17
  SequenceInterval,
17
18
  createPositionReferenceFromSegoff,
18
19
  } from "../intervals";
20
+ import { SharedString } from "../sharedString";
19
21
  import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
20
22
  import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
21
23
 
24
+ /**
25
+ * @public
26
+ */
22
27
  class OverlappingSequenceIntervalsIndex
23
28
  extends OverlappingIntervalsIndex<SequenceInterval>
24
29
  implements SequenceIntervalIndexes.Overlapping
@@ -64,8 +69,12 @@ class OverlappingSequenceIntervalsIndex
64
69
  }
65
70
  }
66
71
 
72
+ /**
73
+ * @public
74
+ */
67
75
  export function createOverlappingSequenceIntervalsIndex(
68
- client: Client,
76
+ sharedString: SharedString,
69
77
  ): SequenceIntervalIndexes.Overlapping {
78
+ const client = (sharedString as unknown as { client: Client }).client;
70
79
  return new OverlappingSequenceIntervalsIndex(client);
71
80
  }
@@ -10,6 +10,7 @@ import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
10
10
  /**
11
11
  * This namespace contains specialiazations of indexes which support spatial queries
12
12
  * specifically for `SequenceInterval`s.
13
+ * @public
13
14
  */
14
15
  // eslint-disable-next-line @typescript-eslint/no-namespace
15
16
  export namespace SequenceIntervalIndexes {
@@ -27,6 +28,6 @@ export namespace SequenceIntervalIndexes {
27
28
  findOverlappingIntervalsBySegoff(
28
29
  startSegoff: { segment: ISegment | undefined; offset: number | undefined },
29
30
  endSegoff: { segment: ISegment | undefined; offset: number | undefined },
30
- );
31
+ ): Iterable<SequenceInterval>;
31
32
  }
32
33
  }
@@ -2,10 +2,17 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree";
7
- import { assert } from "@fluidframework/core-utils";
8
- import { IIntervalHelpers, ISerializableInterval, IntervalType } from "../intervals";
8
+ import {
9
+ IIntervalHelpers,
10
+ ISerializableInterval,
11
+ IntervalType,
12
+ SequenceInterval,
13
+ sequenceIntervalHelpers,
14
+ } from "../intervals";
15
+ import { SharedString } from "../sharedString";
9
16
  import { IntervalIndex } from "./intervalIndex";
10
17
  import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
11
18
 
@@ -13,31 +20,27 @@ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./int
13
20
  * Collection of intervals.
14
21
  *
15
22
  * Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.
23
+ * @public
16
24
  */
17
25
  export interface IStartpointInRangeIndex<TInterval extends ISerializableInterval>
18
26
  extends IntervalIndex<TInterval> {
19
27
  /**
20
28
  * @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)
21
29
  */
22
- findIntervalsWithStartpointInRange(start: number, end: number);
30
+ findIntervalsWithStartpointInRange(start: number, end: number): TInterval[];
23
31
  }
24
32
 
25
- class StartpointInRangeIndex<TInterval extends ISerializableInterval>
33
+ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
26
34
  implements IStartpointInRangeIndex<TInterval>
27
35
  {
28
36
  private readonly intervalTree;
29
37
 
30
38
  constructor(
31
- private readonly helpers: IIntervalHelpers<TInterval>,
32
39
  private readonly client: Client,
40
+ private readonly helpers: IIntervalHelpers<TInterval>,
33
41
  ) {
34
42
  this.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {
35
- assert(
36
- typeof helpers.compareStarts === "function",
37
- 0x6d1 /* compareStarts does not exist in the helpers */,
38
- );
39
-
40
- const compareStartsResult = helpers.compareStarts(a, b);
43
+ const compareStartsResult = a.compareStart(b);
41
44
  if (compareStartsResult !== 0) {
42
45
  return compareStartsResult;
43
46
  }
@@ -66,7 +69,7 @@ class StartpointInRangeIndex<TInterval extends ISerializableInterval>
66
69
  this.intervalTree.remove(interval);
67
70
  }
68
71
 
69
- public findIntervalsWithStartpointInRange(start: number, end: number) {
72
+ public findIntervalsWithStartpointInRange(start: number, end: number): TInterval[] {
70
73
  if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
71
74
  return [];
72
75
  }
@@ -100,10 +103,12 @@ class StartpointInRangeIndex<TInterval extends ISerializableInterval>
100
103
  return results;
101
104
  }
102
105
  }
103
-
104
- export function createStartpointInRangeIndex<TInterval extends ISerializableInterval>(
105
- helpers: IIntervalHelpers<TInterval>,
106
- client: Client,
107
- ): IStartpointInRangeIndex<TInterval> {
108
- return new StartpointInRangeIndex<TInterval>(helpers, client);
106
+ /**
107
+ * @public
108
+ */
109
+ export function createStartpointInRangeIndex(
110
+ sharedString: SharedString,
111
+ ): IStartpointInRangeIndex<SequenceInterval> {
112
+ const client = (sharedString as unknown as { client: Client }).client;
113
+ return new StartpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);
109
114
  }
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import {
7
8
  ICombiningOp,
@@ -12,12 +13,15 @@ import {
12
13
  } from "@fluidframework/merge-tree";
13
14
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
14
15
  import { assert } from "@fluidframework/core-utils";
16
+ import { UsageError } from "@fluidframework/telemetry-utils";
17
+ import { SequencePlace } from "../intervalCollection";
15
18
  import { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from "./intervalUtils";
16
19
 
17
20
  const reservedIntervalIdKey = "intervalId";
18
21
 
19
22
  /**
20
23
  * Serializable interval whose endpoints are plain-old numbers.
24
+ * @public
21
25
  */
22
26
  export class Interval implements ISerializableInterval {
23
27
  /**
@@ -31,7 +35,11 @@ export class Interval implements ISerializableInterval {
31
35
  * @internal
32
36
  */
33
37
  public propertyManager: PropertiesManager;
34
- constructor(public start: number, public end: number, props?: PropertySet) {
38
+ constructor(
39
+ public start: number,
40
+ public end: number,
41
+ props?: PropertySet,
42
+ ) {
35
43
  this.propertyManager = new PropertiesManager();
36
44
  this.properties = {};
37
45
 
@@ -184,9 +192,21 @@ export class Interval implements ISerializableInterval {
184
192
  * {@inheritDoc IInterval.modify}
185
193
  * @internal
186
194
  */
187
- public modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage) {
188
- const startPos = start ?? this.start;
189
- const endPos = end ?? this.end;
195
+ public modify(
196
+ label: string,
197
+ start?: SequencePlace,
198
+ end?: SequencePlace,
199
+ op?: ISequencedDocumentMessage,
200
+ ) {
201
+ if (typeof start === "string" || typeof end === "string") {
202
+ throw new UsageError(
203
+ "The start and end positions of a plain interval may not be on the special endpoint segments.",
204
+ );
205
+ }
206
+
207
+ const startPos = typeof start === "number" ? start : start?.pos ?? this.start;
208
+ const endPos = typeof end === "number" ? end : end?.pos ?? this.end;
209
+
190
210
  if (this.start === startPos && this.end === endPos) {
191
211
  // Return undefined to indicate that no change is necessary.
192
212
  return;
@@ -213,18 +233,25 @@ export class Interval implements ISerializableInterval {
213
233
  }
214
234
  }
215
235
 
216
- export function createInterval(label: string, start: number, end: number): Interval {
236
+ export function createInterval(label: string, start: SequencePlace, end: SequencePlace): Interval {
237
+ if (typeof start === "string" || typeof end === "string") {
238
+ throw new UsageError(
239
+ "The start and end positions of a plain interval may not be on the special endpoint segments.",
240
+ );
241
+ }
242
+
217
243
  const rangeProp: PropertySet = {};
218
244
 
219
245
  if (label && label.length > 0) {
220
246
  rangeProp[reservedRangeLabelsKey] = [label];
221
247
  }
222
248
 
223
- return new Interval(start, end, rangeProp);
249
+ const startPos = typeof start === "number" ? start : start.pos;
250
+ const endPos = typeof end === "number" ? end : end.pos;
251
+
252
+ return new Interval(startPos, endPos, rangeProp);
224
253
  }
225
254
 
226
255
  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
256
  create: createInterval,
230
257
  };