@fluidframework/sequence 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (350) hide show
  1. package/.eslintrc.js +9 -11
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +449 -0
  4. package/README.md +364 -183
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/sequence.api.md +734 -0
  9. package/dist/{defaultMap.js → defaultMap.cjs} +38 -26
  10. package/dist/defaultMap.cjs.map +1 -0
  11. package/dist/defaultMap.d.ts +7 -6
  12. package/dist/defaultMap.d.ts.map +1 -1
  13. package/dist/defaultMapInterfaces.cjs +7 -0
  14. package/dist/defaultMapInterfaces.cjs.map +1 -0
  15. package/dist/defaultMapInterfaces.d.ts +45 -12
  16. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  17. package/dist/index.cjs +60 -0
  18. package/dist/index.cjs.map +1 -0
  19. package/dist/index.d.ts +14 -12
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/intervalCollection.cjs +1193 -0
  22. package/dist/intervalCollection.cjs.map +1 -0
  23. package/dist/intervalCollection.d.ts +448 -162
  24. package/dist/intervalCollection.d.ts.map +1 -1
  25. package/dist/intervalIndex/endpointInRangeIndex.cjs +66 -0
  26. package/dist/intervalIndex/endpointInRangeIndex.cjs.map +1 -0
  27. package/dist/intervalIndex/endpointInRangeIndex.d.ts +34 -0
  28. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  29. package/dist/intervalIndex/endpointIndex.cjs +47 -0
  30. package/dist/intervalIndex/endpointIndex.cjs.map +1 -0
  31. package/dist/intervalIndex/endpointIndex.d.ts +38 -0
  32. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -0
  33. package/dist/intervalIndex/idIntervalIndex.cjs +44 -0
  34. package/dist/intervalIndex/idIntervalIndex.cjs.map +1 -0
  35. package/dist/intervalIndex/idIntervalIndex.d.ts +18 -0
  36. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  37. package/dist/intervalIndex/index.cjs +24 -0
  38. package/dist/intervalIndex/index.cjs.map +1 -0
  39. package/dist/intervalIndex/index.d.ts +13 -0
  40. package/dist/intervalIndex/index.d.ts.map +1 -0
  41. package/dist/{defaultMapInterfaces.js → intervalIndex/intervalIndex.cjs} +1 -1
  42. package/dist/intervalIndex/intervalIndex.cjs.map +1 -0
  43. package/dist/intervalIndex/intervalIndex.d.ts +30 -0
  44. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -0
  45. package/dist/intervalIndex/intervalIndexUtils.cjs +22 -0
  46. package/dist/intervalIndex/intervalIndexUtils.cjs.map +1 -0
  47. package/dist/intervalIndex/intervalIndexUtils.d.ts +17 -0
  48. package/dist/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  49. package/dist/intervalIndex/overlappingIntervalsIndex.cjs +116 -0
  50. package/dist/intervalIndex/overlappingIntervalsIndex.cjs.map +1 -0
  51. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +44 -0
  52. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  53. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.cjs +41 -0
  54. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.cjs.map +1 -0
  55. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +11 -0
  56. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  57. package/dist/intervalIndex/sequenceIntervalIndexes.cjs +7 -0
  58. package/dist/intervalIndex/sequenceIntervalIndexes.cjs.map +1 -0
  59. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +35 -0
  60. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  61. package/dist/intervalIndex/startpointInRangeIndex.cjs +66 -0
  62. package/dist/intervalIndex/startpointInRangeIndex.cjs.map +1 -0
  63. package/dist/intervalIndex/startpointInRangeIndex.d.ts +34 -0
  64. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  65. package/dist/intervalTree.cjs +80 -0
  66. package/dist/intervalTree.cjs.map +1 -0
  67. package/dist/intervalTree.d.ts +24 -0
  68. package/dist/intervalTree.d.ts.map +1 -0
  69. package/dist/intervals/index.cjs +24 -0
  70. package/dist/intervals/index.cjs.map +1 -0
  71. package/dist/intervals/index.d.ts +8 -0
  72. package/dist/intervals/index.d.ts.map +1 -0
  73. package/dist/intervals/interval.cjs +181 -0
  74. package/dist/intervals/interval.cjs.map +1 -0
  75. package/dist/intervals/interval.d.ts +84 -0
  76. package/dist/intervals/interval.d.ts.map +1 -0
  77. package/dist/intervals/intervalUtils.cjs +90 -0
  78. package/dist/intervals/intervalUtils.cjs.map +1 -0
  79. package/dist/intervals/intervalUtils.d.ts +240 -0
  80. package/dist/intervals/intervalUtils.d.ts.map +1 -0
  81. package/dist/intervals/sequenceInterval.cjs +378 -0
  82. package/dist/intervals/sequenceInterval.cjs.map +1 -0
  83. package/dist/intervals/sequenceInterval.d.ts +137 -0
  84. package/dist/intervals/sequenceInterval.d.ts.map +1 -0
  85. package/dist/{localValues.js → localValues.cjs} +1 -1
  86. package/dist/localValues.cjs.map +1 -0
  87. package/dist/localValues.d.ts +2 -1
  88. package/dist/localValues.d.ts.map +1 -1
  89. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  90. package/dist/packageVersion.cjs.map +1 -0
  91. package/dist/packageVersion.d.ts +1 -1
  92. package/dist/packageVersion.d.ts.map +1 -1
  93. package/dist/revertibles.cjs +425 -0
  94. package/dist/revertibles.cjs.map +1 -0
  95. package/dist/revertibles.d.ts +86 -0
  96. package/dist/revertibles.d.ts.map +1 -0
  97. package/dist/sequence-alpha.d.ts +1290 -0
  98. package/dist/sequence-beta.d.ts +244 -0
  99. package/dist/sequence-public.d.ts +244 -0
  100. package/dist/sequence-untrimmed.d.ts +1778 -0
  101. package/dist/{sequence.js → sequence.cjs} +230 -156
  102. package/dist/sequence.cjs.map +1 -0
  103. package/dist/sequence.d.ts +125 -48
  104. package/dist/sequence.d.ts.map +1 -1
  105. package/dist/{sequenceDeltaEvent.js → sequenceDeltaEvent.cjs} +18 -8
  106. package/dist/sequenceDeltaEvent.cjs.map +1 -0
  107. package/dist/sequenceDeltaEvent.d.ts +24 -7
  108. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  109. package/dist/sequenceFactory.cjs +55 -0
  110. package/dist/sequenceFactory.cjs.map +1 -0
  111. package/dist/sequenceFactory.d.ts +3 -89
  112. package/dist/sequenceFactory.d.ts.map +1 -1
  113. package/dist/{sharedIntervalCollection.js → sharedIntervalCollection.cjs} +17 -22
  114. package/dist/sharedIntervalCollection.cjs.map +1 -0
  115. package/dist/sharedIntervalCollection.d.ts +12 -12
  116. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  117. package/dist/{sharedSequence.js → sharedSequence.cjs} +29 -22
  118. package/dist/sharedSequence.cjs.map +1 -0
  119. package/dist/sharedSequence.d.ts +14 -2
  120. package/dist/sharedSequence.d.ts.map +1 -1
  121. package/dist/sharedString.cjs +274 -0
  122. package/dist/sharedString.cjs.map +1 -0
  123. package/dist/sharedString.d.ts +49 -26
  124. package/dist/sharedString.d.ts.map +1 -1
  125. package/dist/tsdoc-metadata.json +11 -0
  126. package/lib/{defaultMap.d.ts → defaultMap.d.mts} +8 -7
  127. package/lib/defaultMap.d.mts.map +1 -0
  128. package/lib/{defaultMap.js → defaultMap.mjs} +38 -26
  129. package/lib/defaultMap.mjs.map +1 -0
  130. package/lib/{defaultMapInterfaces.d.ts → defaultMapInterfaces.d.mts} +46 -13
  131. package/lib/defaultMapInterfaces.d.mts.map +1 -0
  132. package/lib/defaultMapInterfaces.mjs +6 -0
  133. package/lib/defaultMapInterfaces.mjs.map +1 -0
  134. package/lib/index.d.mts +17 -0
  135. package/lib/index.d.mts.map +1 -0
  136. package/lib/index.mjs +16 -0
  137. package/lib/index.mjs.map +1 -0
  138. package/lib/intervalCollection.d.mts +556 -0
  139. package/lib/intervalCollection.d.mts.map +1 -0
  140. package/lib/intervalCollection.mjs +1178 -0
  141. package/lib/intervalCollection.mjs.map +1 -0
  142. package/lib/intervalIndex/endpointInRangeIndex.d.mts +34 -0
  143. package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +1 -0
  144. package/lib/intervalIndex/endpointInRangeIndex.mjs +61 -0
  145. package/lib/intervalIndex/endpointInRangeIndex.mjs.map +1 -0
  146. package/lib/intervalIndex/endpointIndex.d.mts +38 -0
  147. package/lib/intervalIndex/endpointIndex.d.mts.map +1 -0
  148. package/lib/intervalIndex/endpointIndex.mjs +42 -0
  149. package/lib/intervalIndex/endpointIndex.mjs.map +1 -0
  150. package/lib/intervalIndex/idIntervalIndex.d.mts +18 -0
  151. package/lib/intervalIndex/idIntervalIndex.d.mts.map +1 -0
  152. package/lib/intervalIndex/idIntervalIndex.mjs +40 -0
  153. package/lib/intervalIndex/idIntervalIndex.mjs.map +1 -0
  154. package/lib/intervalIndex/index.d.mts +13 -0
  155. package/lib/intervalIndex/index.d.mts.map +1 -0
  156. package/lib/intervalIndex/index.mjs +11 -0
  157. package/lib/intervalIndex/index.mjs.map +1 -0
  158. package/lib/intervalIndex/intervalIndex.d.mts +30 -0
  159. package/lib/intervalIndex/intervalIndex.d.mts.map +1 -0
  160. package/lib/{defaultMapInterfaces.js → intervalIndex/intervalIndex.mjs} +1 -1
  161. package/lib/intervalIndex/intervalIndex.mjs.map +1 -0
  162. package/lib/intervalIndex/intervalIndexUtils.d.mts +17 -0
  163. package/lib/intervalIndex/intervalIndexUtils.d.mts.map +1 -0
  164. package/lib/intervalIndex/intervalIndexUtils.mjs +18 -0
  165. package/lib/intervalIndex/intervalIndexUtils.mjs.map +1 -0
  166. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts +44 -0
  167. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +1 -0
  168. package/lib/intervalIndex/overlappingIntervalsIndex.mjs +111 -0
  169. package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +1 -0
  170. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts +11 -0
  171. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +1 -0
  172. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs +37 -0
  173. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +1 -0
  174. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts +35 -0
  175. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +1 -0
  176. package/lib/intervalIndex/sequenceIntervalIndexes.mjs +6 -0
  177. package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +1 -0
  178. package/lib/intervalIndex/startpointInRangeIndex.d.mts +34 -0
  179. package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +1 -0
  180. package/lib/intervalIndex/startpointInRangeIndex.mjs +61 -0
  181. package/lib/intervalIndex/startpointInRangeIndex.mjs.map +1 -0
  182. package/lib/intervalTree.d.mts +24 -0
  183. package/lib/intervalTree.d.mts.map +1 -0
  184. package/lib/intervalTree.mjs +76 -0
  185. package/lib/intervalTree.mjs.map +1 -0
  186. package/lib/intervals/index.d.mts +8 -0
  187. package/lib/intervals/index.d.mts.map +1 -0
  188. package/lib/intervals/index.mjs +8 -0
  189. package/lib/intervals/index.mjs.map +1 -0
  190. package/lib/intervals/interval.d.mts +84 -0
  191. package/lib/intervals/interval.d.mts.map +1 -0
  192. package/lib/intervals/interval.mjs +176 -0
  193. package/lib/intervals/interval.mjs.map +1 -0
  194. package/lib/intervals/intervalUtils.d.mts +240 -0
  195. package/lib/intervals/intervalUtils.d.mts.map +1 -0
  196. package/lib/intervals/intervalUtils.mjs +84 -0
  197. package/lib/intervals/intervalUtils.mjs.map +1 -0
  198. package/lib/intervals/sequenceInterval.d.mts +137 -0
  199. package/lib/intervals/sequenceInterval.d.mts.map +1 -0
  200. package/lib/intervals/sequenceInterval.mjs +370 -0
  201. package/lib/intervals/sequenceInterval.mjs.map +1 -0
  202. package/lib/{localValues.d.ts → localValues.d.mts} +4 -3
  203. package/lib/localValues.d.mts.map +1 -0
  204. package/lib/{localValues.js → localValues.mjs} +2 -2
  205. package/lib/localValues.mjs.map +1 -0
  206. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +2 -2
  207. package/lib/packageVersion.d.mts.map +1 -0
  208. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  209. package/lib/packageVersion.mjs.map +1 -0
  210. package/lib/revertibles.d.mts +86 -0
  211. package/lib/revertibles.d.mts.map +1 -0
  212. package/lib/revertibles.mjs +416 -0
  213. package/lib/revertibles.mjs.map +1 -0
  214. package/lib/sequence-alpha.d.mts +1277 -0
  215. package/lib/sequence-beta.d.mts +231 -0
  216. package/lib/sequence-public.d.mts +231 -0
  217. package/lib/sequence-untrimmed.d.mts +1765 -0
  218. package/lib/{sequence.d.ts → sequence.d.mts} +128 -51
  219. package/lib/sequence.d.mts.map +1 -0
  220. package/lib/{sequence.js → sequence.mjs} +229 -152
  221. package/lib/sequence.mjs.map +1 -0
  222. package/lib/{sequenceDeltaEvent.d.ts → sequenceDeltaEvent.d.mts} +25 -8
  223. package/lib/sequenceDeltaEvent.d.mts.map +1 -0
  224. package/lib/{sequenceDeltaEvent.js → sequenceDeltaEvent.mjs} +20 -8
  225. package/lib/sequenceDeltaEvent.mjs.map +1 -0
  226. package/lib/sequenceFactory.d.mts +22 -0
  227. package/lib/sequenceFactory.d.mts.map +1 -0
  228. package/lib/sequenceFactory.mjs +51 -0
  229. package/lib/sequenceFactory.mjs.map +1 -0
  230. package/lib/{sharedIntervalCollection.d.ts → sharedIntervalCollection.d.mts} +13 -13
  231. package/lib/sharedIntervalCollection.d.mts.map +1 -0
  232. package/lib/{sharedIntervalCollection.js → sharedIntervalCollection.mjs} +16 -21
  233. package/lib/sharedIntervalCollection.mjs.map +1 -0
  234. package/lib/{sharedSequence.d.ts → sharedSequence.d.mts} +16 -4
  235. package/lib/sharedSequence.d.mts.map +1 -0
  236. package/lib/{sharedSequence.js → sharedSequence.mjs} +30 -23
  237. package/lib/sharedSequence.mjs.map +1 -0
  238. package/lib/{sharedString.d.ts → sharedString.d.mts} +52 -29
  239. package/lib/sharedString.d.mts.map +1 -0
  240. package/lib/sharedString.mjs +269 -0
  241. package/lib/sharedString.mjs.map +1 -0
  242. package/package.json +168 -75
  243. package/prettier.config.cjs +8 -0
  244. package/src/defaultMap.ts +419 -403
  245. package/src/defaultMapInterfaces.ts +164 -117
  246. package/src/index.ts +86 -26
  247. package/src/intervalCollection.ts +2042 -1563
  248. package/src/intervalIndex/endpointInRangeIndex.ts +116 -0
  249. package/src/intervalIndex/endpointIndex.ts +91 -0
  250. package/src/intervalIndex/idIntervalIndex.ts +64 -0
  251. package/src/intervalIndex/index.ts +25 -0
  252. package/src/intervalIndex/intervalIndex.ts +32 -0
  253. package/src/intervalIndex/intervalIndexUtils.ts +27 -0
  254. package/src/intervalIndex/overlappingIntervalsIndex.ts +187 -0
  255. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +80 -0
  256. package/src/intervalIndex/sequenceIntervalIndexes.ts +34 -0
  257. package/src/intervalIndex/startpointInRangeIndex.ts +114 -0
  258. package/src/intervalTree.ts +98 -0
  259. package/src/intervals/index.ts +26 -0
  260. package/src/intervals/interval.ts +238 -0
  261. package/src/intervals/intervalUtils.ts +298 -0
  262. package/src/intervals/sequenceInterval.ts +616 -0
  263. package/src/localValues.ts +68 -73
  264. package/src/packageVersion.ts +1 -1
  265. package/src/revertibles.ts +693 -0
  266. package/src/sequence.ts +850 -690
  267. package/src/sequenceDeltaEvent.ts +164 -131
  268. package/src/sequenceFactory.ts +58 -214
  269. package/src/sharedIntervalCollection.ts +161 -152
  270. package/src/sharedSequence.ts +181 -167
  271. package/src/sharedString.ts +367 -234
  272. package/tsc-multi.test.json +10 -0
  273. package/tsconfig.json +11 -13
  274. package/.editorconfig +0 -7
  275. package/.vscode/launch.json +0 -15
  276. package/dist/defaultMap.js.map +0 -1
  277. package/dist/defaultMapInterfaces.js.map +0 -1
  278. package/dist/index.js +0 -44
  279. package/dist/index.js.map +0 -1
  280. package/dist/intervalCollection.js +0 -1250
  281. package/dist/intervalCollection.js.map +0 -1
  282. package/dist/localValues.js.map +0 -1
  283. package/dist/packageVersion.js.map +0 -1
  284. package/dist/sequence.js.map +0 -1
  285. package/dist/sequenceDeltaEvent.js.map +0 -1
  286. package/dist/sequenceFactory.js +0 -192
  287. package/dist/sequenceFactory.js.map +0 -1
  288. package/dist/sharedIntervalCollection.js.map +0 -1
  289. package/dist/sharedNumberSequence.d.ts +0 -50
  290. package/dist/sharedNumberSequence.d.ts.map +0 -1
  291. package/dist/sharedNumberSequence.js +0 -61
  292. package/dist/sharedNumberSequence.js.map +0 -1
  293. package/dist/sharedObjectSequence.d.ts +0 -50
  294. package/dist/sharedObjectSequence.d.ts.map +0 -1
  295. package/dist/sharedObjectSequence.js +0 -61
  296. package/dist/sharedObjectSequence.js.map +0 -1
  297. package/dist/sharedSequence.js.map +0 -1
  298. package/dist/sharedString.js +0 -187
  299. package/dist/sharedString.js.map +0 -1
  300. package/dist/sparsematrix.d.ts +0 -139
  301. package/dist/sparsematrix.d.ts.map +0 -1
  302. package/dist/sparsematrix.js +0 -332
  303. package/dist/sparsematrix.js.map +0 -1
  304. package/lib/defaultMap.d.ts.map +0 -1
  305. package/lib/defaultMap.js.map +0 -1
  306. package/lib/defaultMapInterfaces.d.ts.map +0 -1
  307. package/lib/defaultMapInterfaces.js.map +0 -1
  308. package/lib/index.d.ts +0 -27
  309. package/lib/index.d.ts.map +0 -1
  310. package/lib/index.js +0 -26
  311. package/lib/index.js.map +0 -1
  312. package/lib/intervalCollection.d.ts +0 -270
  313. package/lib/intervalCollection.d.ts.map +0 -1
  314. package/lib/intervalCollection.js +0 -1238
  315. package/lib/intervalCollection.js.map +0 -1
  316. package/lib/localValues.d.ts.map +0 -1
  317. package/lib/localValues.js.map +0 -1
  318. package/lib/packageVersion.d.ts.map +0 -1
  319. package/lib/packageVersion.js.map +0 -1
  320. package/lib/sequence.d.ts.map +0 -1
  321. package/lib/sequence.js.map +0 -1
  322. package/lib/sequenceDeltaEvent.d.ts.map +0 -1
  323. package/lib/sequenceDeltaEvent.js.map +0 -1
  324. package/lib/sequenceFactory.d.ts +0 -108
  325. package/lib/sequenceFactory.d.ts.map +0 -1
  326. package/lib/sequenceFactory.js +0 -186
  327. package/lib/sequenceFactory.js.map +0 -1
  328. package/lib/sharedIntervalCollection.d.ts.map +0 -1
  329. package/lib/sharedIntervalCollection.js.map +0 -1
  330. package/lib/sharedNumberSequence.d.ts +0 -50
  331. package/lib/sharedNumberSequence.d.ts.map +0 -1
  332. package/lib/sharedNumberSequence.js +0 -57
  333. package/lib/sharedNumberSequence.js.map +0 -1
  334. package/lib/sharedObjectSequence.d.ts +0 -50
  335. package/lib/sharedObjectSequence.d.ts.map +0 -1
  336. package/lib/sharedObjectSequence.js +0 -57
  337. package/lib/sharedObjectSequence.js.map +0 -1
  338. package/lib/sharedSequence.d.ts.map +0 -1
  339. package/lib/sharedSequence.js.map +0 -1
  340. package/lib/sharedString.d.ts.map +0 -1
  341. package/lib/sharedString.js +0 -183
  342. package/lib/sharedString.js.map +0 -1
  343. package/lib/sparsematrix.d.ts +0 -139
  344. package/lib/sparsematrix.d.ts.map +0 -1
  345. package/lib/sparsematrix.js +0 -323
  346. package/lib/sparsematrix.js.map +0 -1
  347. package/src/sharedNumberSequence.ts +0 -62
  348. package/src/sharedObjectSequence.ts +0 -62
  349. package/src/sparsematrix.ts +0 -421
  350. package/tsconfig.esnext.json +0 -7
@@ -0,0 +1,116 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable import/no-deprecated */
6
+
7
+ import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree";
8
+ import {
9
+ IIntervalHelpers,
10
+ ISerializableInterval,
11
+ IntervalType,
12
+ SequenceInterval,
13
+ sequenceIntervalHelpers,
14
+ } from "../intervals";
15
+ import { SharedString } from "../sharedString";
16
+ import { IntervalIndex } from "./intervalIndex";
17
+ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
18
+
19
+ /**
20
+ * Collection of intervals.
21
+ *
22
+ * Provide additional APIs to support efficiently querying a collection of intervals whose endpoints fall within a specified range.
23
+ * @internal
24
+ */
25
+ export interface IEndpointInRangeIndex<TInterval extends ISerializableInterval>
26
+ extends IntervalIndex<TInterval> {
27
+ /**
28
+ * @returns an array of all intervals contained in this collection whose endpoints locate in the range [start, end] (includes both ends)
29
+ */
30
+ findIntervalsWithEndpointInRange(start: number, end: number): TInterval[];
31
+ }
32
+
33
+ export class EndpointInRangeIndex<TInterval extends ISerializableInterval>
34
+ implements IEndpointInRangeIndex<TInterval>
35
+ {
36
+ private readonly intervalTree;
37
+
38
+ constructor(
39
+ private readonly client: Client,
40
+ private readonly helpers: IIntervalHelpers<TInterval>,
41
+ ) {
42
+ this.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {
43
+ const compareEndsResult = a.compareEnd(b);
44
+ if (compareEndsResult !== 0) {
45
+ return compareEndsResult;
46
+ }
47
+
48
+ const overrideablesComparison = compareOverrideables(
49
+ a as Partial<HasComparisonOverride>,
50
+ b as Partial<HasComparisonOverride>,
51
+ );
52
+ if (overrideablesComparison !== 0) {
53
+ return overrideablesComparison;
54
+ }
55
+
56
+ const aId = a.getIntervalId();
57
+ const bId = b.getIntervalId();
58
+ if (aId !== undefined && bId !== undefined) {
59
+ return aId.localeCompare(bId);
60
+ }
61
+ return 0;
62
+ });
63
+ }
64
+
65
+ public add(interval: TInterval): void {
66
+ this.intervalTree.put(interval, interval);
67
+ }
68
+
69
+ public remove(interval: TInterval): void {
70
+ this.intervalTree.remove(interval);
71
+ }
72
+
73
+ public findIntervalsWithEndpointInRange(start: number, end: number): TInterval[] {
74
+ if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
75
+ return [];
76
+ }
77
+ const results: TInterval[] = [];
78
+ const action: PropertyAction<TInterval, TInterval> = (node) => {
79
+ results.push(node.data);
80
+ return true;
81
+ };
82
+
83
+ const transientStartInterval = this.helpers.create(
84
+ "transient",
85
+ start,
86
+ start,
87
+ this.client,
88
+ IntervalType.Transient,
89
+ );
90
+
91
+ const transientEndInterval = this.helpers.create(
92
+ "transient",
93
+ end,
94
+ end,
95
+ this.client,
96
+ IntervalType.Transient,
97
+ );
98
+
99
+ // Add comparison overrides to the transient intervals
100
+ (transientStartInterval as Partial<HasComparisonOverride>)[forceCompare] = -1;
101
+ (transientEndInterval as Partial<HasComparisonOverride>)[forceCompare] = 1;
102
+
103
+ this.intervalTree.mapRange(action, results, transientStartInterval, transientEndInterval);
104
+ return results;
105
+ }
106
+ }
107
+
108
+ /**
109
+ * @internal
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);
116
+ }
@@ -0,0 +1,91 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable import/no-deprecated */
6
+
7
+ import { Client, RedBlackTree } from "@fluidframework/merge-tree";
8
+ import {
9
+ IIntervalHelpers,
10
+ ISerializableInterval,
11
+ IntervalType,
12
+ SequenceInterval,
13
+ sequenceIntervalHelpers,
14
+ } from "../intervals";
15
+ import { SharedString } from "../sharedString";
16
+ import { IntervalIndex } from "./intervalIndex";
17
+
18
+ /**
19
+ * @internal
20
+ */
21
+ export interface IEndpointIndex<TInterval extends ISerializableInterval>
22
+ extends IntervalIndex<TInterval> {
23
+ /**
24
+ * @returns the previous interval based on the given position number.
25
+ * If no such interval exists in this index, returns `undefined`
26
+ */
27
+ previousInterval(pos: number): TInterval | undefined;
28
+
29
+ /**
30
+ * @returns the next interval based on the given position number.
31
+ * If no such interval exists in this index, returns `undefined`
32
+ */
33
+ nextInterval(pos: number): TInterval | undefined;
34
+ }
35
+
36
+ export class EndpointIndex<TInterval extends ISerializableInterval>
37
+ implements IEndpointIndex<TInterval>
38
+ {
39
+ private readonly endIntervalTree: RedBlackTree<TInterval, TInterval>;
40
+
41
+ constructor(
42
+ private readonly client: Client,
43
+ private readonly helpers: IIntervalHelpers<TInterval>,
44
+ ) {
45
+ this.endIntervalTree = new RedBlackTree<TInterval, TInterval>((a, b) => a.compareEnd(b));
46
+ }
47
+
48
+ public previousInterval(pos: number): TInterval | undefined {
49
+ const transientInterval = this.helpers.create(
50
+ "transient",
51
+ pos,
52
+ pos,
53
+ this.client,
54
+ IntervalType.Transient,
55
+ );
56
+ const rbNode = this.endIntervalTree.floor(transientInterval);
57
+ if (rbNode) {
58
+ return rbNode.data;
59
+ }
60
+ }
61
+
62
+ public nextInterval(pos: number): TInterval | undefined {
63
+ const transientInterval = this.helpers.create(
64
+ "transient",
65
+ pos,
66
+ pos,
67
+ this.client,
68
+ IntervalType.Transient,
69
+ );
70
+ const rbNode = this.endIntervalTree.ceil(transientInterval);
71
+ if (rbNode) {
72
+ return rbNode.data;
73
+ }
74
+ }
75
+
76
+ public add(interval: TInterval): void {
77
+ this.endIntervalTree.put(interval, interval);
78
+ }
79
+
80
+ public remove(interval: TInterval): void {
81
+ this.endIntervalTree.remove(interval);
82
+ }
83
+ }
84
+
85
+ /**
86
+ * @internal
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);
91
+ }
@@ -0,0 +1,64 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { assert } from "@fluidframework/core-utils";
7
+ import { ISerializableInterval } from "../intervals";
8
+ import { IntervalIndex } from "./intervalIndex";
9
+
10
+ const reservedIntervalIdKey = "intervalId";
11
+
12
+ /**
13
+ * @internal
14
+ */
15
+ export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
16
+ extends IntervalIndex<TInterval>,
17
+ Iterable<TInterval> {
18
+ getIntervalById(id: string): TInterval | undefined;
19
+
20
+ [Symbol.iterator](): Iterator<TInterval>;
21
+ }
22
+ class IdIntervalIndex<TInterval extends ISerializableInterval>
23
+ implements IIdIntervalIndex<TInterval>, Iterable<TInterval>
24
+ {
25
+ private readonly intervalIdMap = new Map<string, TInterval>();
26
+
27
+ public add(interval: TInterval) {
28
+ const id = interval.getIntervalId();
29
+ assert(
30
+ id !== undefined,
31
+ 0x2c0 /* "ID must be created before adding interval to collection" */,
32
+ );
33
+ // Make the ID immutable.
34
+ Object.defineProperty(interval.properties, reservedIntervalIdKey, {
35
+ configurable: false,
36
+ enumerable: true,
37
+ writable: false,
38
+ });
39
+ this.intervalIdMap.set(id, interval);
40
+ }
41
+
42
+ public remove(interval: TInterval) {
43
+ const id = interval.getIntervalId();
44
+ assert(id !== undefined, 0x311 /* expected id to exist on interval */);
45
+ this.intervalIdMap.delete(id);
46
+ }
47
+
48
+ public getIntervalById(id: string): TInterval | undefined {
49
+ return this.intervalIdMap.get(id);
50
+ }
51
+
52
+ public [Symbol.iterator](): IterableIterator<TInterval> {
53
+ return this.intervalIdMap.values();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @internal
59
+ */
60
+ export function createIdIntervalIndex<
61
+ TInterval extends ISerializableInterval,
62
+ >(): IIdIntervalIndex<TInterval> {
63
+ return new IdIntervalIndex<TInterval>();
64
+ }
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ export { IntervalIndex } from "./intervalIndex";
7
+ export { IIdIntervalIndex, createIdIntervalIndex } from "./idIntervalIndex";
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";
19
+ export { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
20
+ export {
21
+ IOverlappingIntervalsIndex,
22
+ createOverlappingIntervalsIndex,
23
+ OverlappingIntervalsIndex,
24
+ } from "./overlappingIntervalsIndex";
25
+ export { createOverlappingSequenceIntervalsIndex } from "./overlappingSequenceIntervalsIndex";
@@ -0,0 +1,32 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ISerializableInterval } from "../intervals";
7
+
8
+ /**
9
+ * Collection of intervals.
10
+ *
11
+ * Implementers of this interface will typically implement additional APIs to support efficiently querying a collection
12
+ * of intervals in some manner, for example:
13
+ * - "find all intervals with start endpoint between these two points"
14
+ * - "find all intervals which overlap this range"
15
+ * etc.
16
+ * @alpha
17
+ */
18
+ export interface IntervalIndex<TInterval extends ISerializableInterval> {
19
+ /**
20
+ * Adds an interval to the index.
21
+ * @remarks Application code should never need to invoke this method on their index for production scenarios:
22
+ * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.
23
+ */
24
+ add(interval: TInterval): void;
25
+
26
+ /**
27
+ * Removes an interval from the index.
28
+ * @remarks Application code should never need to invoke this method on their index for production scenarios:
29
+ * Fluid handles adding and removing intervals from an index in response to sequence or interval changes.
30
+ */
31
+ remove(interval: TInterval): void;
32
+ }
@@ -0,0 +1,27 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ /**
7
+ * Interface for intervals that have comparison override properties.
8
+ */
9
+ export const forceCompare = Symbol();
10
+
11
+ export interface HasComparisonOverride {
12
+ [forceCompare]: number;
13
+ }
14
+
15
+ /**
16
+ * Compares two objects based on their comparison override properties.
17
+ * @returns A number indicating the order of the intervals (negative for a is lower than b, 0 for tie, positive for a is greater than b).
18
+ */
19
+ export function compareOverrideables(
20
+ a: Partial<HasComparisonOverride>,
21
+ b: Partial<HasComparisonOverride>,
22
+ ): number {
23
+ const forceCompareA = a[forceCompare] ?? 0;
24
+ const forceCompareB = b[forceCompare] ?? 0;
25
+
26
+ return forceCompareA - forceCompareB;
27
+ }
@@ -0,0 +1,187 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable import/no-deprecated */
6
+
7
+ import { Client } from "@fluidframework/merge-tree";
8
+ import {
9
+ IntervalType,
10
+ IIntervalHelpers,
11
+ ISerializableInterval,
12
+ sequenceIntervalHelpers,
13
+ SequenceInterval,
14
+ } from "../intervals";
15
+ import { IntervalNode, IntervalTree } from "../intervalTree";
16
+ import { SharedString } from "../sharedString";
17
+ import { SequencePlace, endpointPosAndSide } from "../intervalCollection";
18
+ import { IntervalIndex } from "./intervalIndex";
19
+
20
+ /**
21
+ * @internal
22
+ */
23
+ export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
24
+ extends IntervalIndex<TInterval> {
25
+ /**
26
+ * @returns an array of all intervals contained in this collection that overlap the range
27
+ * `[start end]`.
28
+ */
29
+ findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[];
30
+
31
+ /**
32
+ * Gathers the interval results based on specified parameters.
33
+ */
34
+ gatherIterationResults(
35
+ results: TInterval[],
36
+ iteratesForward: boolean,
37
+ start?: SequencePlace,
38
+ end?: SequencePlace,
39
+ ): void;
40
+ }
41
+
42
+ /**
43
+ * @public
44
+ */
45
+ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
46
+ implements IOverlappingIntervalsIndex<TInterval>
47
+ {
48
+ protected readonly intervalTree = new IntervalTree<TInterval>();
49
+ protected readonly client: Client;
50
+ protected readonly helpers: IIntervalHelpers<TInterval>;
51
+
52
+ constructor(client: Client, helpers: IIntervalHelpers<TInterval>) {
53
+ this.client = client;
54
+ this.helpers = helpers;
55
+ }
56
+
57
+ public map(fn: (interval: TInterval) => void) {
58
+ this.intervalTree.map(fn);
59
+ }
60
+
61
+ public mapUntil(fn: (interval: TInterval) => boolean) {
62
+ this.intervalTree.mapUntil(fn);
63
+ }
64
+
65
+ public gatherIterationResults(
66
+ results: TInterval[],
67
+ iteratesForward: boolean,
68
+ start?: SequencePlace,
69
+ end?: SequencePlace,
70
+ ): void {
71
+ if (this.intervalTree.intervals.isEmpty()) {
72
+ return;
73
+ }
74
+
75
+ if (start === undefined && end === undefined) {
76
+ // No start/end provided. Gather the whole tree in the specified order.
77
+ if (iteratesForward) {
78
+ this.intervalTree.map((interval: TInterval) => {
79
+ results.push(interval);
80
+ });
81
+ } else {
82
+ this.intervalTree.mapBackward((interval: TInterval) => {
83
+ results.push(interval);
84
+ });
85
+ }
86
+ } else {
87
+ const transientInterval: TInterval = this.helpers.create(
88
+ "transient",
89
+ start ?? "start",
90
+ end ?? "end",
91
+ this.client,
92
+ IntervalType.Transient,
93
+ );
94
+
95
+ if (start === undefined) {
96
+ // Only end position provided. Since the tree is not sorted by end position,
97
+ // walk the whole tree in the specified order, gathering intervals that match the end.
98
+ if (iteratesForward) {
99
+ this.intervalTree.map((interval: TInterval) => {
100
+ if (transientInterval.compareEnd(interval) === 0) {
101
+ results.push(interval);
102
+ }
103
+ });
104
+ } else {
105
+ this.intervalTree.mapBackward((interval: TInterval) => {
106
+ if (transientInterval.compareEnd(interval) === 0) {
107
+ results.push(interval);
108
+ }
109
+ });
110
+ }
111
+ } else {
112
+ // Start and (possibly) end provided. Walk the subtrees that may contain
113
+ // this start position.
114
+ const compareFn =
115
+ end === undefined
116
+ ? (node: IntervalNode<TInterval>) => {
117
+ return transientInterval.compareStart(node.key);
118
+ }
119
+ : (node: IntervalNode<TInterval>) => {
120
+ return transientInterval.compare(node.key);
121
+ };
122
+ const continueLeftFn = (cmpResult: number) => cmpResult <= 0;
123
+ const continueRightFn = (cmpResult: number) => cmpResult >= 0;
124
+ const actionFn = (node: IntervalNode<TInterval>) => {
125
+ results.push(node.key);
126
+ };
127
+
128
+ if (iteratesForward) {
129
+ this.intervalTree.intervals.walkExactMatchesForward(
130
+ compareFn,
131
+ actionFn,
132
+ continueLeftFn,
133
+ continueRightFn,
134
+ );
135
+ } else {
136
+ this.intervalTree.intervals.walkExactMatchesBackward(
137
+ compareFn,
138
+ actionFn,
139
+ continueLeftFn,
140
+ continueRightFn,
141
+ );
142
+ }
143
+ }
144
+ }
145
+ }
146
+
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
+ ) {
156
+ return [];
157
+ }
158
+ const transientInterval = this.helpers.create(
159
+ "transient",
160
+ start,
161
+ end,
162
+ this.client,
163
+ IntervalType.Transient,
164
+ );
165
+
166
+ const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
167
+ return overlappingIntervalNodes.map((node) => node.key);
168
+ }
169
+
170
+ public remove(interval: TInterval) {
171
+ this.intervalTree.removeExisting(interval);
172
+ }
173
+
174
+ public add(interval: TInterval) {
175
+ this.intervalTree.put(interval);
176
+ }
177
+ }
178
+
179
+ /**
180
+ * @internal
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);
187
+ }
@@ -0,0 +1,80 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /* eslint-disable import/no-deprecated */
6
+
7
+ import {
8
+ Client,
9
+ ISegment,
10
+ ReferenceType,
11
+ compareReferencePositions,
12
+ reservedRangeLabelsKey,
13
+ } from "@fluidframework/merge-tree";
14
+ import {
15
+ sequenceIntervalHelpers,
16
+ IntervalType,
17
+ SequenceInterval,
18
+ createPositionReferenceFromSegoff,
19
+ } from "../intervals";
20
+ import { SharedString } from "../sharedString";
21
+ import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
22
+ import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
23
+
24
+ /**
25
+ * @public
26
+ */
27
+ class OverlappingSequenceIntervalsIndex
28
+ extends OverlappingIntervalsIndex<SequenceInterval>
29
+ implements SequenceIntervalIndexes.Overlapping
30
+ {
31
+ constructor(client: Client) {
32
+ super(client, sequenceIntervalHelpers);
33
+ }
34
+
35
+ public findOverlappingIntervalsBySegoff(
36
+ startSegoff: { segment: ISegment | undefined; offset: number | undefined },
37
+ endSegoff: { segment: ISegment | undefined; offset: number | undefined },
38
+ ): Iterable<SequenceInterval> {
39
+ if (this.intervalTree.intervals.isEmpty()) {
40
+ return [];
41
+ }
42
+
43
+ const startLref = createPositionReferenceFromSegoff(
44
+ this.client,
45
+ startSegoff,
46
+ ReferenceType.Transient,
47
+ );
48
+
49
+ const endLref = createPositionReferenceFromSegoff(
50
+ this.client,
51
+ endSegoff,
52
+ ReferenceType.Transient,
53
+ );
54
+
55
+ if (compareReferencePositions(startLref, endLref) > 0) {
56
+ return [];
57
+ }
58
+
59
+ const transientInterval = new SequenceInterval(
60
+ this.client,
61
+ startLref,
62
+ endLref,
63
+ IntervalType.Transient,
64
+ { [reservedRangeLabelsKey]: ["transient"] },
65
+ );
66
+
67
+ const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
68
+ return overlappingIntervalNodes.map((node) => node.key);
69
+ }
70
+ }
71
+
72
+ /**
73
+ * @internal
74
+ */
75
+ export function createOverlappingSequenceIntervalsIndex(
76
+ sharedString: SharedString,
77
+ ): SequenceIntervalIndexes.Overlapping {
78
+ const client = (sharedString as unknown as { client: Client }).client;
79
+ return new OverlappingSequenceIntervalsIndex(client);
80
+ }
@@ -0,0 +1,34 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ISegment } from "@fluidframework/merge-tree";
7
+ import { SequenceInterval } from "../intervals";
8
+ import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
9
+
10
+ /**
11
+ * This namespace contains specialiazations of indexes which support spatial queries
12
+ * specifically for `SequenceInterval`s.
13
+ * @internal
14
+ */
15
+ // eslint-disable-next-line @typescript-eslint/no-namespace
16
+ export namespace SequenceIntervalIndexes {
17
+ /**
18
+ * Collection of intervals.
19
+ *
20
+ * Provides additional APIs to support efficiently querying a collection of intervals based on segments and offset.
21
+ * @internal
22
+ */
23
+ export interface Overlapping extends IOverlappingIntervalsIndex<SequenceInterval> {
24
+ /**
25
+ * Finds overlapping intervals within the specified range.
26
+ *
27
+ * @returns an array of all intervals that overlap with the specified SegOff range (includes both ends)
28
+ */
29
+ findOverlappingIntervalsBySegoff(
30
+ startSegoff: { segment: ISegment | undefined; offset: number | undefined },
31
+ endSegoff: { segment: ISegment | undefined; offset: number | undefined },
32
+ ): Iterable<SequenceInterval>;
33
+ }
34
+ }