@fluidframework/sequence 2.0.0-dev-rc.1.0.0.232845 → 2.0.0-dev-rc.2.0.0.246488

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 (388) hide show
  1. package/.eslintrc.cjs +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/README.md +2 -2
  5. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/sequence.api.md +14 -27
  8. package/dist/{localValues.d.ts → IntervalCollectionValues.d.ts} +13 -12
  9. package/dist/IntervalCollectionValues.d.ts.map +1 -0
  10. package/dist/{localValues.js → IntervalCollectionValues.js} +4 -4
  11. package/dist/IntervalCollectionValues.js.map +1 -0
  12. package/dist/index.d.ts +11 -11
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +42 -42
  15. package/dist/index.js.map +1 -1
  16. package/dist/intervalCollection.d.ts +15 -22
  17. package/dist/intervalCollection.d.ts.map +1 -1
  18. package/dist/intervalCollection.js +53 -108
  19. package/dist/intervalCollection.js.map +1 -1
  20. package/dist/{defaultMap.d.ts → intervalCollectionMap.d.ts} +18 -57
  21. package/dist/intervalCollectionMap.d.ts.map +1 -0
  22. package/dist/{defaultMap.js → intervalCollectionMap.js} +77 -129
  23. package/dist/intervalCollectionMap.js.map +1 -0
  24. package/{lib/defaultMapInterfaces.d.mts → dist/intervalCollectionMapInterfaces.d.ts} +16 -22
  25. package/dist/intervalCollectionMapInterfaces.d.ts.map +1 -0
  26. package/dist/{defaultMapInterfaces.js → intervalCollectionMapInterfaces.js} +1 -1
  27. package/dist/intervalCollectionMapInterfaces.js.map +1 -0
  28. package/dist/intervalIndex/endpointInRangeIndex.d.ts +3 -3
  29. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  30. package/dist/intervalIndex/endpointInRangeIndex.js +9 -9
  31. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  32. package/dist/intervalIndex/endpointIndex.d.ts +3 -3
  33. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  34. package/dist/intervalIndex/endpointIndex.js +5 -5
  35. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  36. package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
  37. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  38. package/dist/intervalIndex/idIntervalIndex.js +2 -2
  39. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  40. package/dist/intervalIndex/index.d.ts +8 -8
  41. package/dist/intervalIndex/index.d.ts.map +1 -1
  42. package/dist/intervalIndex/index.js +16 -16
  43. package/dist/intervalIndex/index.js.map +1 -1
  44. package/dist/intervalIndex/intervalIndex.d.ts +1 -1
  45. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  46. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  47. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +7 -10
  48. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  49. package/dist/intervalIndex/overlappingIntervalsIndex.js +12 -14
  50. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  51. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
  52. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  53. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +8 -8
  54. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  55. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  56. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  57. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  58. package/dist/intervalIndex/startpointInRangeIndex.d.ts +3 -3
  59. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  60. package/dist/intervalIndex/startpointInRangeIndex.js +9 -9
  61. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  62. package/dist/intervalTree.d.ts +1 -1
  63. package/dist/intervalTree.d.ts.map +1 -1
  64. package/dist/intervalTree.js.map +1 -1
  65. package/dist/intervals/index.d.ts +3 -3
  66. package/dist/intervals/index.d.ts.map +1 -1
  67. package/dist/intervals/index.js +16 -16
  68. package/dist/intervals/index.js.map +1 -1
  69. package/dist/intervals/interval.d.ts +2 -2
  70. package/dist/intervals/interval.d.ts.map +1 -1
  71. package/dist/intervals/interval.js +3 -3
  72. package/dist/intervals/interval.js.map +1 -1
  73. package/dist/intervals/intervalUtils.d.ts +3 -3
  74. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  75. package/dist/intervals/intervalUtils.js +1 -1
  76. package/dist/intervals/intervalUtils.js.map +1 -1
  77. package/dist/intervals/sequenceInterval.d.ts +2 -2
  78. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  79. package/dist/intervals/sequenceInterval.js +22 -23
  80. package/dist/intervals/sequenceInterval.js.map +1 -1
  81. package/dist/package.json +3 -0
  82. package/dist/packageVersion.d.ts +1 -1
  83. package/dist/packageVersion.js +1 -1
  84. package/dist/packageVersion.js.map +1 -1
  85. package/dist/revertibles.d.ts +12 -12
  86. package/dist/revertibles.d.ts.map +1 -1
  87. package/dist/revertibles.js +26 -26
  88. package/dist/revertibles.js.map +1 -1
  89. package/dist/sequence-alpha.d.ts +149 -13
  90. package/dist/sequence-beta.d.ts +2 -0
  91. package/dist/sequence-public.d.ts +2 -0
  92. package/dist/sequence-untrimmed.d.ts +50 -14
  93. package/dist/sequence.d.ts +38 -5
  94. package/dist/sequence.d.ts.map +1 -1
  95. package/dist/sequence.js +79 -35
  96. package/dist/sequence.js.map +1 -1
  97. package/dist/sequenceFactory.d.ts +4 -1
  98. package/dist/sequenceFactory.d.ts.map +1 -1
  99. package/dist/sequenceFactory.js +8 -5
  100. package/dist/sequenceFactory.js.map +1 -1
  101. package/dist/sharedIntervalCollection.d.ts +2 -2
  102. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  103. package/dist/sharedIntervalCollection.js +5 -5
  104. package/dist/sharedIntervalCollection.js.map +1 -1
  105. package/dist/sharedSequence.d.ts +1 -1
  106. package/dist/sharedSequence.d.ts.map +1 -1
  107. package/dist/sharedSequence.js +2 -2
  108. package/dist/sharedSequence.js.map +1 -1
  109. package/dist/sharedString.d.ts +2 -2
  110. package/dist/sharedString.d.ts.map +1 -1
  111. package/dist/sharedString.js +6 -6
  112. package/dist/sharedString.js.map +1 -1
  113. package/dist/tsdoc-metadata.json +1 -1
  114. package/lib/{localValues.d.mts → IntervalCollectionValues.d.ts} +13 -12
  115. package/lib/IntervalCollectionValues.d.ts.map +1 -0
  116. package/lib/{localValues.mjs → IntervalCollectionValues.js} +2 -2
  117. package/lib/IntervalCollectionValues.js.map +1 -0
  118. package/lib/{index.d.mts → index.d.ts} +24 -12
  119. package/lib/index.d.ts.map +1 -0
  120. package/lib/{index.mjs → index.js} +11 -11
  121. package/lib/index.js.map +1 -0
  122. package/lib/{intervalCollection.d.mts → intervalCollection.d.ts} +16 -23
  123. package/lib/intervalCollection.d.ts.map +1 -0
  124. package/lib/{intervalCollection.mjs → intervalCollection.js} +17 -72
  125. package/lib/intervalCollection.js.map +1 -0
  126. package/lib/{defaultMap.d.mts → intervalCollectionMap.d.ts} +18 -57
  127. package/lib/intervalCollectionMap.d.ts.map +1 -0
  128. package/lib/{defaultMap.mjs → intervalCollectionMap.js} +75 -127
  129. package/lib/intervalCollectionMap.js.map +1 -0
  130. package/{dist/defaultMapInterfaces.d.ts → lib/intervalCollectionMapInterfaces.d.ts} +16 -22
  131. package/lib/intervalCollectionMapInterfaces.d.ts.map +1 -0
  132. package/lib/{intervalIndex/sequenceIntervalIndexes.mjs → intervalCollectionMapInterfaces.js} +1 -1
  133. package/lib/intervalCollectionMapInterfaces.js.map +1 -0
  134. package/lib/intervalIndex/{endpointInRangeIndex.d.mts → endpointInRangeIndex.d.ts} +4 -4
  135. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  136. package/lib/intervalIndex/{endpointInRangeIndex.mjs → endpointInRangeIndex.js} +3 -3
  137. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
  138. package/lib/intervalIndex/{endpointIndex.d.mts → endpointIndex.d.ts} +4 -4
  139. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
  140. package/lib/intervalIndex/{endpointIndex.mjs → endpointIndex.js} +2 -2
  141. package/lib/intervalIndex/endpointIndex.js.map +1 -0
  142. package/lib/intervalIndex/{idIntervalIndex.d.mts → idIntervalIndex.d.ts} +3 -3
  143. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  144. package/lib/intervalIndex/{idIntervalIndex.mjs → idIntervalIndex.js} +2 -2
  145. package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
  146. package/lib/intervalIndex/{index.d.mts → index.d.ts} +9 -9
  147. package/lib/intervalIndex/index.d.ts.map +1 -0
  148. package/lib/intervalIndex/{index.mjs → index.js} +7 -7
  149. package/lib/intervalIndex/index.js.map +1 -0
  150. package/lib/intervalIndex/{intervalIndex.d.mts → intervalIndex.d.ts} +2 -2
  151. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
  152. package/lib/intervalIndex/{intervalIndex.mjs → intervalIndex.js} +1 -1
  153. package/lib/intervalIndex/intervalIndex.js.map +1 -0
  154. package/lib/intervalIndex/{intervalIndexUtils.d.mts → intervalIndexUtils.d.ts} +1 -1
  155. package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  156. package/lib/intervalIndex/{intervalIndexUtils.mjs → intervalIndexUtils.js} +1 -1
  157. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
  158. package/lib/intervalIndex/{overlappingIntervalsIndex.d.mts → overlappingIntervalsIndex.d.ts} +8 -11
  159. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  160. package/lib/intervalIndex/{overlappingIntervalsIndex.mjs → overlappingIntervalsIndex.js} +8 -10
  161. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  162. package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.d.mts → overlappingSequenceIntervalsIndex.d.ts} +3 -3
  163. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  164. package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.mjs → overlappingSequenceIntervalsIndex.js} +3 -3
  165. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  166. package/lib/intervalIndex/{sequenceIntervalIndexes.d.mts → sequenceIntervalIndexes.d.ts} +3 -3
  167. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  168. package/lib/{defaultMapInterfaces.mjs → intervalIndex/sequenceIntervalIndexes.js} +1 -1
  169. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  170. package/lib/intervalIndex/{startpointInRangeIndex.d.mts → startpointInRangeIndex.d.ts} +4 -4
  171. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  172. package/lib/intervalIndex/{startpointInRangeIndex.mjs → startpointInRangeIndex.js} +3 -3
  173. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
  174. package/lib/{intervalTree.d.mts → intervalTree.d.ts} +2 -2
  175. package/lib/intervalTree.d.ts.map +1 -0
  176. package/lib/{intervalTree.mjs → intervalTree.js} +1 -1
  177. package/lib/intervalTree.js.map +1 -0
  178. package/lib/intervals/{index.d.mts → index.d.ts} +4 -4
  179. package/lib/intervals/index.d.ts.map +1 -0
  180. package/lib/intervals/{index.mjs → index.js} +4 -4
  181. package/lib/intervals/index.js.map +1 -0
  182. package/lib/intervals/{interval.d.mts → interval.d.ts} +3 -3
  183. package/lib/intervals/{interval.d.mts.map → interval.d.ts.map} +1 -1
  184. package/lib/intervals/{interval.mjs → interval.js} +2 -2
  185. package/lib/intervals/interval.js.map +1 -0
  186. package/lib/intervals/{intervalUtils.d.mts → intervalUtils.d.ts} +4 -4
  187. package/lib/intervals/intervalUtils.d.ts.map +1 -0
  188. package/lib/intervals/{intervalUtils.mjs → intervalUtils.js} +3 -2
  189. package/lib/intervals/intervalUtils.js.map +1 -0
  190. package/lib/intervals/{sequenceInterval.d.mts → sequenceInterval.d.ts} +3 -3
  191. package/lib/intervals/sequenceInterval.d.ts.map +1 -0
  192. package/lib/intervals/{sequenceInterval.mjs → sequenceInterval.js} +5 -4
  193. package/lib/intervals/{sequenceInterval.mjs.map → sequenceInterval.js.map} +1 -1
  194. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  195. package/lib/packageVersion.d.ts.map +1 -0
  196. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  197. package/lib/packageVersion.js.map +1 -0
  198. package/lib/{revertibles.d.mts → revertibles.d.ts} +13 -13
  199. package/lib/revertibles.d.ts.map +1 -0
  200. package/lib/{revertibles.mjs → revertibles.js} +11 -10
  201. package/lib/revertibles.js.map +1 -0
  202. package/lib/{sequence-alpha.d.mts → sequence-alpha.d.ts} +162 -13
  203. package/lib/{sequence-beta.d.mts → sequence-beta.d.ts} +15 -0
  204. package/lib/{sequence-public.d.mts → sequence-public.d.ts} +15 -0
  205. package/lib/{sequence-untrimmed.d.mts → sequence-untrimmed.d.ts} +63 -14
  206. package/lib/{sequence.d.mts → sequence.d.ts} +39 -6
  207. package/lib/sequence.d.ts.map +1 -0
  208. package/lib/{sequence.mjs → sequence.js} +78 -34
  209. package/lib/sequence.js.map +1 -0
  210. package/lib/{sequenceDeltaEvent.d.mts → sequenceDeltaEvent.d.ts} +1 -1
  211. package/lib/sequenceDeltaEvent.d.ts.map +1 -0
  212. package/lib/{sequenceDeltaEvent.mjs → sequenceDeltaEvent.js} +1 -1
  213. package/lib/sequenceDeltaEvent.js.map +1 -0
  214. package/lib/{sequenceFactory.d.mts → sequenceFactory.d.ts} +5 -2
  215. package/lib/sequenceFactory.d.ts.map +1 -0
  216. package/lib/{sequenceFactory.mjs → sequenceFactory.js} +6 -3
  217. package/lib/sequenceFactory.js.map +1 -0
  218. package/lib/{sharedIntervalCollection.d.mts → sharedIntervalCollection.d.ts} +3 -3
  219. package/lib/sharedIntervalCollection.d.ts.map +1 -0
  220. package/lib/{sharedIntervalCollection.mjs → sharedIntervalCollection.js} +5 -5
  221. package/lib/sharedIntervalCollection.js.map +1 -0
  222. package/lib/{sharedSequence.d.mts → sharedSequence.d.ts} +2 -2
  223. package/lib/sharedSequence.d.ts.map +1 -0
  224. package/lib/{sharedSequence.mjs → sharedSequence.js} +2 -2
  225. package/lib/sharedSequence.js.map +1 -0
  226. package/lib/{sharedString.d.mts → sharedString.d.ts} +3 -3
  227. package/lib/sharedString.d.ts.map +1 -0
  228. package/lib/{sharedString.mjs → sharedString.js} +3 -3
  229. package/lib/sharedString.js.map +1 -0
  230. package/lib/test/collections.intervalTree.js +73 -0
  231. package/lib/test/collections.intervalTree.js.map +1 -0
  232. package/lib/test/createSnapshotFiles.js +15 -0
  233. package/lib/test/createSnapshotFiles.js.map +1 -0
  234. package/lib/test/dirname.cjs +16 -0
  235. package/lib/test/dirname.cjs.map +1 -0
  236. package/lib/test/endpointInRangeIndex.spec.js +182 -0
  237. package/lib/test/endpointInRangeIndex.spec.js.map +1 -0
  238. package/lib/test/fuzz/fuzzUtils.js +362 -0
  239. package/lib/test/fuzz/fuzzUtils.js.map +1 -0
  240. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +87 -0
  241. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -0
  242. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +128 -0
  243. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -0
  244. package/lib/test/fuzz/sharedString.fuzz.spec.js +91 -0
  245. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -0
  246. package/lib/test/generateSharedStrings.js +138 -0
  247. package/lib/test/generateSharedStrings.js.map +1 -0
  248. package/lib/test/intervalCollection.detached.spec.js +128 -0
  249. package/lib/test/intervalCollection.detached.spec.js.map +1 -0
  250. package/lib/test/intervalCollection.events.spec.js +491 -0
  251. package/lib/test/intervalCollection.events.spec.js.map +1 -0
  252. package/lib/test/intervalCollection.perf.spec.js +88 -0
  253. package/lib/test/intervalCollection.perf.spec.js.map +1 -0
  254. package/lib/test/intervalCollection.snapshot.spec.js +171 -0
  255. package/lib/test/intervalCollection.snapshot.spec.js.map +1 -0
  256. package/lib/test/intervalCollection.spec.js +1660 -0
  257. package/lib/test/intervalCollection.spec.js.map +1 -0
  258. package/lib/test/intervalIndexTestUtils.js +49 -0
  259. package/lib/test/intervalIndexTestUtils.js.map +1 -0
  260. package/lib/test/intervalRebasing.spec.js +589 -0
  261. package/lib/test/intervalRebasing.spec.js.map +1 -0
  262. package/lib/test/intervalStashedOps.spec.js +142 -0
  263. package/lib/test/intervalStashedOps.spec.js.map +1 -0
  264. package/lib/test/intervalTestUtils.js +81 -0
  265. package/lib/test/intervalTestUtils.js.map +1 -0
  266. package/lib/test/marshalling.spec.js +55 -0
  267. package/lib/test/marshalling.spec.js.map +1 -0
  268. package/lib/test/memory/sharedSequence.spec.js +82 -0
  269. package/lib/test/memory/sharedSequence.spec.js.map +1 -0
  270. package/lib/test/memory/sharedString.spec.js +134 -0
  271. package/lib/test/memory/sharedString.spec.js.map +1 -0
  272. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +348 -0
  273. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -0
  274. package/lib/test/partialLoad.spec.js +211 -0
  275. package/lib/test/partialLoad.spec.js.map +1 -0
  276. package/lib/test/rebasing.spec.js +81 -0
  277. package/lib/test/rebasing.spec.js.map +1 -0
  278. package/lib/test/reentrancy.spec.js +174 -0
  279. package/lib/test/reentrancy.spec.js.map +1 -0
  280. package/lib/test/revertibles.spec.js +1019 -0
  281. package/lib/test/revertibles.spec.js.map +1 -0
  282. package/lib/test/sequenceDeltaEvent.spec.js +2144 -0
  283. package/lib/test/sequenceDeltaEvent.spec.js.map +1 -0
  284. package/lib/test/sharedIntervalCollection.spec.js +159 -0
  285. package/lib/test/sharedIntervalCollection.spec.js.map +1 -0
  286. package/lib/test/sharedString.spec.js +532 -0
  287. package/lib/test/sharedString.spec.js.map +1 -0
  288. package/lib/test/snapshotEmptyProps.spec.js +45 -0
  289. package/lib/test/snapshotEmptyProps.spec.js.map +1 -0
  290. package/lib/test/snapshotVersion.spec.js +149 -0
  291. package/lib/test/snapshotVersion.spec.js.map +1 -0
  292. package/lib/test/startpointInRangeIndex.spec.js +182 -0
  293. package/lib/test/startpointInRangeIndex.spec.js.map +1 -0
  294. package/lib/test/subSequence.spec.js +92 -0
  295. package/lib/test/subSequence.spec.js.map +1 -0
  296. package/lib/test/types/validateSequencePrevious.generated.js +162 -0
  297. package/lib/test/types/validateSequencePrevious.generated.js.map +1 -0
  298. package/lib/test/v1IntervalCollectionHelpers.js +93 -0
  299. package/lib/test/v1IntervalCollectionHelpers.js.map +1 -0
  300. package/package.json +64 -60
  301. package/src/{localValues.ts → IntervalCollectionValues.ts} +23 -17
  302. package/src/index.ts +15 -11
  303. package/src/intervalCollection.ts +37 -104
  304. package/src/{defaultMap.ts → intervalCollectionMap.ts} +120 -211
  305. package/src/{defaultMapInterfaces.ts → intervalCollectionMapInterfaces.ts} +24 -23
  306. package/src/intervalIndex/endpointInRangeIndex.ts +5 -4
  307. package/src/intervalIndex/endpointIndex.ts +4 -3
  308. package/src/intervalIndex/idIntervalIndex.ts +3 -4
  309. package/src/intervalIndex/index.ts +8 -8
  310. package/src/intervalIndex/intervalIndex.ts +1 -1
  311. package/src/intervalIndex/overlappingIntervalsIndex.ts +11 -11
  312. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +5 -4
  313. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
  314. package/src/intervalIndex/startpointInRangeIndex.ts +5 -4
  315. package/src/intervalTree.ts +1 -1
  316. package/src/intervals/index.ts +3 -3
  317. package/src/intervals/interval.ts +3 -4
  318. package/src/intervals/intervalUtils.ts +3 -3
  319. package/src/intervals/sequenceInterval.ts +3 -4
  320. package/src/packageVersion.ts +1 -1
  321. package/src/revertibles.ts +13 -13
  322. package/src/sequence.ts +101 -55
  323. package/src/sequenceFactory.ts +5 -2
  324. package/src/sharedIntervalCollection.ts +7 -11
  325. package/src/sharedSequence.ts +1 -1
  326. package/src/sharedString.ts +2 -2
  327. package/tsconfig.cjs.json +7 -0
  328. package/tsconfig.json +2 -5
  329. package/dist/defaultMap.d.ts.map +0 -1
  330. package/dist/defaultMap.js.map +0 -1
  331. package/dist/defaultMapInterfaces.d.ts.map +0 -1
  332. package/dist/defaultMapInterfaces.js.map +0 -1
  333. package/dist/localValues.d.ts.map +0 -1
  334. package/dist/localValues.js.map +0 -1
  335. package/lib/defaultMap.d.mts.map +0 -1
  336. package/lib/defaultMap.mjs.map +0 -1
  337. package/lib/defaultMapInterfaces.d.mts.map +0 -1
  338. package/lib/defaultMapInterfaces.mjs.map +0 -1
  339. package/lib/index.d.mts.map +0 -1
  340. package/lib/index.mjs.map +0 -1
  341. package/lib/intervalCollection.d.mts.map +0 -1
  342. package/lib/intervalCollection.mjs.map +0 -1
  343. package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +0 -1
  344. package/lib/intervalIndex/endpointInRangeIndex.mjs.map +0 -1
  345. package/lib/intervalIndex/endpointIndex.d.mts.map +0 -1
  346. package/lib/intervalIndex/endpointIndex.mjs.map +0 -1
  347. package/lib/intervalIndex/idIntervalIndex.d.mts.map +0 -1
  348. package/lib/intervalIndex/idIntervalIndex.mjs.map +0 -1
  349. package/lib/intervalIndex/index.d.mts.map +0 -1
  350. package/lib/intervalIndex/index.mjs.map +0 -1
  351. package/lib/intervalIndex/intervalIndex.d.mts.map +0 -1
  352. package/lib/intervalIndex/intervalIndex.mjs.map +0 -1
  353. package/lib/intervalIndex/intervalIndexUtils.d.mts.map +0 -1
  354. package/lib/intervalIndex/intervalIndexUtils.mjs.map +0 -1
  355. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +0 -1
  356. package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +0 -1
  357. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +0 -1
  358. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +0 -1
  359. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +0 -1
  360. package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +0 -1
  361. package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +0 -1
  362. package/lib/intervalIndex/startpointInRangeIndex.mjs.map +0 -1
  363. package/lib/intervalTree.d.mts.map +0 -1
  364. package/lib/intervalTree.mjs.map +0 -1
  365. package/lib/intervals/index.d.mts.map +0 -1
  366. package/lib/intervals/index.mjs.map +0 -1
  367. package/lib/intervals/interval.mjs.map +0 -1
  368. package/lib/intervals/intervalUtils.d.mts.map +0 -1
  369. package/lib/intervals/intervalUtils.mjs.map +0 -1
  370. package/lib/intervals/sequenceInterval.d.mts.map +0 -1
  371. package/lib/localValues.d.mts.map +0 -1
  372. package/lib/localValues.mjs.map +0 -1
  373. package/lib/packageVersion.d.mts.map +0 -1
  374. package/lib/packageVersion.mjs.map +0 -1
  375. package/lib/revertibles.d.mts.map +0 -1
  376. package/lib/revertibles.mjs.map +0 -1
  377. package/lib/sequence.d.mts.map +0 -1
  378. package/lib/sequence.mjs.map +0 -1
  379. package/lib/sequenceDeltaEvent.d.mts.map +0 -1
  380. package/lib/sequenceDeltaEvent.mjs.map +0 -1
  381. package/lib/sequenceFactory.d.mts.map +0 -1
  382. package/lib/sequenceFactory.mjs.map +0 -1
  383. package/lib/sharedIntervalCollection.d.mts.map +0 -1
  384. package/lib/sharedIntervalCollection.mjs.map +0 -1
  385. package/lib/sharedSequence.d.mts.map +0 -1
  386. package/lib/sharedSequence.mjs.map +0 -1
  387. package/lib/sharedString.d.mts.map +0 -1
  388. package/lib/sharedString.mjs.map +0 -1
@@ -4,8 +4,8 @@
4
4
  */
5
5
  import { IRelativePosition, ISegment, Marker, PropertySet, ReferenceType, TextSegment } from "@fluidframework/merge-tree";
6
6
  import { IFluidDataStoreRuntime, IChannelAttributes } from "@fluidframework/datastore-definitions";
7
- import { SharedSegmentSequence } from "./sequence.mjs";
8
- import { SharedStringFactory } from "./sequenceFactory.mjs";
7
+ import { SharedSegmentSequence } from "./sequence.js";
8
+ import { SharedStringFactory } from "./sequenceFactory.js";
9
9
  /**
10
10
  * Fluid object interface describing access methods on a SharedString
11
11
  * @alpha
@@ -154,4 +154,4 @@ export declare function getTextAndMarkers(sharedString: SharedString, label: str
154
154
  parallelText: string[];
155
155
  parallelMarkers: Marker[];
156
156
  };
157
- //# sourceMappingURL=sharedString.d.mts.map
157
+ //# sourceMappingURL=sharedString.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedString.d.ts","sourceRoot":"","sources":["../src/sharedString.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { Marker, refHasTileLabel, TextSegment, } from "@fluidframework/merge-tree";
6
- import { SharedSegmentSequence } from "./sequence.mjs";
7
- import { SharedStringFactory } from "./sequenceFactory.mjs";
6
+ import { SharedSegmentSequence } from "./sequence.js";
7
+ import { SharedStringFactory } from "./sequenceFactory.js";
8
8
  /**
9
9
  * The Shared String is a specialized data structure for handling collaborative
10
10
  * text. It is based on a more general Sequence data structure but has
@@ -266,4 +266,4 @@ const gatherTextAndMarkers = (segment, pos, refSeq, clientId, start, end, accumT
266
266
  }
267
267
  return true;
268
268
  };
269
- //# sourceMappingURL=sharedString.mjs.map
269
+ //# sourceMappingURL=sharedString.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedString.js","sourceRoot":"","sources":["../src/sharedString.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIMergeTreeTextHelper,\n\tIRelativePosition,\n\tISegment,\n\tISegmentAction,\n\tMarker,\n\tPropertySet,\n\tReferenceType,\n\trefHasTileLabel,\n\tTextSegment,\n} from \"@fluidframework/merge-tree\";\nimport { IFluidDataStoreRuntime, IChannelAttributes } from \"@fluidframework/datastore-definitions\";\nimport { SharedSegmentSequence } from \"./sequence.js\";\nimport { SharedStringFactory } from \"./sequenceFactory.js\";\n\n/**\n * Fluid object interface describing access methods on a SharedString\n * @alpha\n */\nexport interface ISharedString extends SharedSegmentSequence<SharedStringSegment> {\n\t/**\n\t * Inserts the text at the position.\n\t * @param pos - The position to insert the text at\n\t * @param text - The text to insert\n\t * @param props - The properties of the text\n\t */\n\tinsertText(pos: number, text: string, props?: PropertySet): void;\n\n\t/**\n\t * Inserts a marker at the position.\n\t * @param pos - The position to insert the marker at\n\t * @param refType - The reference type of the marker\n\t * @param props - The properties of the marker\n\t */\n\tinsertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void;\n\n\t/**\n\t * {@inheritDoc SharedSegmentSequence.posFromRelativePos}\n\t */\n\tposFromRelativePos(relativePos: IRelativePosition): number;\n}\n\n/**\n * @alpha\n */\nexport type SharedStringSegment = TextSegment | Marker;\n\n/**\n * The Shared String is a specialized data structure for handling collaborative\n * text. It is based on a more general Sequence data structure but has\n * additional features that make working with text easier.\n *\n * In addition to text, a Shared String can also contain markers. Markers can be\n * used to store metadata at positions within the text, like the details of an\n * image or Fluid object that should be rendered with the text.\n * @alpha\n */\nexport class SharedString\n\textends SharedSegmentSequence<SharedStringSegment>\n\timplements ISharedString\n{\n\t/**\n\t * Create a new shared string.\n\t * @param runtime - data store runtime the new shared string belongs to\n\t * @param id - optional name of the shared string\n\t * @returns newly create shared string (but not attached yet)\n\t */\n\tpublic static create(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, SharedStringFactory.Type) as SharedString;\n\t}\n\n\t/**\n\t * Get a factory for SharedString to register with the data store.\n\t * @returns a factory that creates and load SharedString\n\t */\n\tpublic static getFactory() {\n\t\treturn new SharedStringFactory();\n\t}\n\n\tpublic get ISharedString(): ISharedString {\n\t\treturn this;\n\t}\n\n\tprivate readonly mergeTreeTextHelper: IMergeTreeTextHelper;\n\n\tconstructor(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tpublic id: string,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(document, id, attributes, SharedStringFactory.segmentFromSpec as any);\n\t\tthis.mergeTreeTextHelper = this.client.createTextHelper();\n\t}\n\n\t/**\n\t * Inserts a marker at a relative position.\n\t * @param relativePos1 - The relative position to insert the marker at\n\t * @param refType - The reference type of the marker\n\t * @param props - The properties of the marker\n\t */\n\tpublic insertMarkerRelative(\n\t\trelativePos1: IRelativePosition,\n\t\trefType: ReferenceType,\n\t\tprops?: PropertySet,\n\t): void {\n\t\tconst segment = new Marker(refType);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tconst pos = this.posFromRelativePos(relativePos1);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * {@inheritDoc ISharedString.insertMarker}\n\t */\n\tpublic insertMarker(pos: number, refType: ReferenceType, props?: PropertySet): void {\n\t\tconst segment = new Marker(refType);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * Inserts the text at the position.\n\t * @param relativePos1 - The relative position to insert the text at\n\t * @param text - The text to insert\n\t * @param props - The properties of text\n\t */\n\tpublic insertTextRelative(\n\t\trelativePos1: IRelativePosition,\n\t\ttext: string,\n\t\tprops?: PropertySet,\n\t): void {\n\t\tconst segment = new TextSegment(text);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tconst pos = this.posFromRelativePos(relativePos1);\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * {@inheritDoc ISharedString.insertText}\n\t */\n\tpublic insertText(pos: number, text: string, props?: PropertySet): void {\n\t\tconst segment = new TextSegment(text);\n\t\tif (props) {\n\t\t\tsegment.addProperties(props);\n\t\t}\n\n\t\tthis.guardReentrancy(() => this.client.insertSegmentLocal(pos, segment));\n\t}\n\n\t/**\n\t * Replaces a range with the provided text.\n\t * @param start - The inclusive start of the range to replace\n\t * @param end - The exclusive end of the range to replace\n\t * @param text - The text to replace the range with\n\t * @param props - Optional. The properties of the replacement text\n\t */\n\tpublic replaceText(start: number, end: number, text: string, props?: PropertySet): void {\n\t\tthis.replaceRange(start, end, TextSegment.make(text, props));\n\t}\n\n\t/**\n\t * Removes the text in the given range.\n\t * @param start - The inclusive start of the range to remove\n\t * @param end - The exclusive end of the range to replace\n\t * @returns the message sent.\n\t */\n\tpublic removeText(start: number, end: number): void {\n\t\tthis.removeRange(start, end);\n\t}\n\n\t/**\n\t * Annotates the marker with the provided properties.\n\t * @param marker - The marker to annotate\n\t * @param props - The properties to annotate the marker with\n\t */\n\tpublic annotateMarker(marker: Marker, props: PropertySet) {\n\t\tthis.guardReentrancy(() => this.client.annotateMarker(marker, props));\n\t}\n\n\t/**\n\t * Searches a string for the nearest marker in either direction to a given start position.\n\t * The search will include the start position, so markers at the start position are valid\n\t * results of the search.\n\t * @param startPos - Position at which to start the search\n\t * @param markerLabel - Label of the marker to search for\n\t * @param forwards - Whether the desired marker comes before (false) or after (true) `startPos`\n\t */\n\tpublic searchForMarker(\n\t\tstartPos: number,\n\t\tmarkerLabel: string,\n\t\tforwards = true,\n\t): Marker | undefined {\n\t\treturn this.client.searchForMarker(startPos, markerLabel, forwards);\n\t}\n\n\t/**\n\t * Retrieve text from the SharedString in string format.\n\t * @param start - The starting index of the text to retrieve, or 0 if omitted.\n\t * @param end - The ending index of the text to retrieve, or the end of the string if omitted\n\t * @returns The requested text content as a string.\n\t */\n\tpublic getText(start?: number, end?: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\"\",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\t/**\n\t * Adds spaces for markers and handles, so that position calculations account for them.\n\t */\n\tpublic getTextWithPlaceholders(start?: number, end?: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\" \",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\tpublic getTextRangeWithMarkers(start: number, end: number) {\n\t\tconst segmentWindow = this.client.getCollabWindow();\n\t\treturn this.mergeTreeTextHelper.getText(\n\t\t\tsegmentWindow.currentSeq,\n\t\t\tsegmentWindow.clientId,\n\t\t\t\"*\",\n\t\t\tstart,\n\t\t\tend,\n\t\t);\n\t}\n\n\t/**\n\t * Looks up and returns a `Marker` using its id. Returns `undefined` if there is no marker with the provided\n\t * id in this `SharedString`.\n\t */\n\tpublic getMarkerFromId(id: string): ISegment | undefined {\n\t\treturn this.client.getMarkerFromId(id);\n\t}\n\n\t/**\n\t * Revert an op\n\t */\n\tprotected rollback(content: any, localOpMetadata: unknown): void {\n\t\tif (this.client.rollback !== undefined) {\n\t\t\tthis.client.rollback(content, localOpMetadata);\n\t\t} else {\n\t\t\tsuper.rollback(content, localOpMetadata);\n\t\t}\n\t}\n}\n\ninterface ITextAndMarkerAccumulator {\n\tparallelText: string[];\n\tparallelMarkers: Marker[];\n\tparallelMarkerLabel: string;\n\tplaceholder?: string;\n\ttagsInProgress: string[];\n\ttextSegment: TextSegment;\n}\n\n/**\n * Splits the text into regions ending with markers with the given `label`.\n * @param sharedString - String to retrieve text and markers from\n * @param label - label to split on\n * @returns Two parallel lists of text and markers, split by markers with the provided `label`.\n * For example:\n * ```typescript\n * // Say sharedstring has contents \"hello<paragraph marker 1>world<paragraph marker 2>missing\".\n * const { parallelText, parallelMarkers } = getTextAndMarkers(sharedString, \"paragraph\");\n * // parallelText === [\"hello\", \"world\"]\n * // parallelMarkers === [<paragraph marker 1 object>, <paragraph marker 2 object>]\n * // Note parallelText does not include \"missing\".\n * ```\n * @internal\n */\nexport function getTextAndMarkers(\n\tsharedString: SharedString,\n\tlabel: string,\n\tstart?: number,\n\tend?: number,\n): {\n\tparallelText: string[];\n\tparallelMarkers: Marker[];\n} {\n\tconst accum: ITextAndMarkerAccumulator = {\n\t\tparallelMarkerLabel: label,\n\t\tparallelMarkers: [],\n\t\tparallelText: [],\n\t\ttagsInProgress: [],\n\t\ttextSegment: new TextSegment(\"\"),\n\t};\n\n\tsharedString.walkSegments(gatherTextAndMarkers, start, end, accum);\n\treturn { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n}\n\nconst gatherTextAndMarkers: ISegmentAction<ITextAndMarkerAccumulator> = (\n\tsegment: ISegment,\n\tpos: number,\n\trefSeq: number,\n\tclientId: number,\n\tstart: number,\n\tend: number,\n\taccumText: ITextAndMarkerAccumulator,\n) => {\n\tconst { placeholder, tagsInProgress, textSegment } = accumText;\n\tif (TextSegment.is(segment)) {\n\t\tlet beginTags = \"\";\n\t\tlet endTags = \"\";\n\t\t// TODO: let clients pass in function to get tag\n\t\tconst tags = [] as string[];\n\t\tconst initTags = [] as string[];\n\n\t\tif (segment.properties?.[\"font-weight\"]) {\n\t\t\ttags.push(\"b\");\n\t\t}\n\t\tif (segment.properties?.[\"text-decoration\"]) {\n\t\t\ttags.push(\"u\");\n\t\t}\n\t\tconst remTags = [] as string[];\n\t\tif (tags.length > 0) {\n\t\t\tfor (const tag of tags) {\n\t\t\t\tif (!tagsInProgress.includes(tag)) {\n\t\t\t\t\tbeginTags += `<${tag}>`;\n\t\t\t\t\tinitTags.push(tag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const accumTag of tagsInProgress) {\n\t\t\t\tif (!tags.includes(accumTag)) {\n\t\t\t\t\tendTags += `</${accumTag}>`;\n\t\t\t\t\tremTags.push(accumTag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const initTag of initTags.reverse()) {\n\t\t\t\ttagsInProgress.push(initTag);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const accumTag of tagsInProgress) {\n\t\t\t\tendTags += `</${accumTag}>`;\n\t\t\t\tremTags.push(accumTag);\n\t\t\t}\n\t\t}\n\t\tfor (const remTag of remTags) {\n\t\t\tconst remdex = tagsInProgress.indexOf(remTag);\n\t\t\tif (remdex >= 0) {\n\t\t\t\ttagsInProgress.splice(remdex, 1);\n\t\t\t}\n\t\t}\n\t\ttextSegment.text += endTags;\n\t\ttextSegment.text += beginTags;\n\t\tif (start <= 0 && end >= segment.text.length) {\n\t\t\ttextSegment.text += segment.text;\n\t\t} else {\n\t\t\tconst seglen = segment.text.length;\n\t\t\tconst _start = start < 0 ? 0 : start;\n\t\t\tconst _end = end >= seglen ? undefined : end;\n\t\t\ttextSegment.text += segment.text.substring(_start, _end);\n\t\t}\n\t} else {\n\t\tif (placeholder && placeholder.length > 0) {\n\t\t\tconst placeholderText =\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\t\t\tplaceholder === \"*\" ? `\\n${segment}` : placeholder.repeat(segment.cachedLength);\n\t\t\ttextSegment.text += placeholderText;\n\t\t} else {\n\t\t\tconst marker = segment as Marker;\n\t\t\tif (refHasTileLabel(marker, accumText.parallelMarkerLabel)) {\n\t\t\t\taccumText.parallelMarkers.push(marker);\n\t\t\t\taccumText.parallelText.push(textSegment.text);\n\t\t\t\ttextSegment.text = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n"]}
@@ -0,0 +1,73 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "assert";
6
+ import { IntervalTree } from "../intervalTree.js";
7
+ class TestInterval {
8
+ constructor(start, end) {
9
+ this.start = start;
10
+ this.end = end;
11
+ }
12
+ clone() {
13
+ return new TestInterval(this.start, this.end);
14
+ }
15
+ compare(b) {
16
+ const startResult = this.compareStart(b);
17
+ return startResult === 0 ? this.compareEnd(b) : startResult;
18
+ }
19
+ compareStart(b) {
20
+ return this.start - b.start;
21
+ }
22
+ compareEnd(b) {
23
+ return this.end - b.end;
24
+ }
25
+ overlaps(b) {
26
+ const result = this.start <= b.end && this.end >= b.start;
27
+ return result;
28
+ }
29
+ union(b) {
30
+ return new TestInterval(Math.min(this.start, b.start), Math.max(this.end, b.end));
31
+ }
32
+ modify(label, start, end) {
33
+ const startPos = start ?? this.start;
34
+ const endPos = end ?? this.end;
35
+ if (this.start === startPos && this.end === endPos) {
36
+ // Return undefined to indicate that no change is necessary.
37
+ return;
38
+ }
39
+ return new TestInterval(startPos, endPos);
40
+ }
41
+ }
42
+ describe("Collections.IntervalTree", () => {
43
+ let intervalTree;
44
+ beforeEach(() => {
45
+ intervalTree = new IntervalTree();
46
+ });
47
+ describe(".map", () => {
48
+ it("Should run each node through the given function", () => {
49
+ intervalTree.put(new TestInterval(1, 5));
50
+ intervalTree.put(new TestInterval(4, 8));
51
+ intervalTree.put(new TestInterval(1, 10));
52
+ let range1Pass = false;
53
+ let range2Pass = false;
54
+ let range3Pass = false;
55
+ const map = (interval) => {
56
+ if (interval.start === 1 && interval.end === 5) {
57
+ range1Pass = true;
58
+ }
59
+ else if (interval.start === 4 && interval.end === 8) {
60
+ range2Pass = true;
61
+ }
62
+ else if (interval.start === 1 && interval.end === 10) {
63
+ range3Pass = true;
64
+ }
65
+ return true;
66
+ };
67
+ intervalTree.map(map);
68
+ const fullWalk = range1Pass && range2Pass && range3Pass;
69
+ assert.equal(fullWalk, true, "Full walk of the interval tree did not occur");
70
+ });
71
+ });
72
+ });
73
+ //# sourceMappingURL=collections.intervalTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.intervalTree.js","sourceRoot":"","sources":["../../src/test/collections.intervalTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { IntervalTree } from \"../intervalTree.js\";\nimport { IInterval } from \"../intervals/index.js\";\n\nclass TestInterval implements IInterval {\n\tconstructor(\n\t\tpublic start: number,\n\t\tpublic end: number,\n\t) {}\n\n\tpublic clone() {\n\t\treturn new TestInterval(this.start, this.end);\n\t}\n\n\tpublic compare(b: TestInterval) {\n\t\tconst startResult = this.compareStart(b);\n\t\treturn startResult === 0 ? this.compareEnd(b) : startResult;\n\t}\n\n\tpublic compareStart(b: TestInterval) {\n\t\treturn this.start - b.start;\n\t}\n\n\tpublic compareEnd(b: TestInterval) {\n\t\treturn this.end - b.end;\n\t}\n\n\tpublic overlaps(b: TestInterval) {\n\t\tconst result = this.start <= b.end && this.end >= b.start;\n\t\treturn result;\n\t}\n\n\tpublic union(b: TestInterval) {\n\t\treturn new TestInterval(Math.min(this.start, b.start), Math.max(this.end, b.end));\n\t}\n\n\tpublic modify(label: string, start: number, end: number) {\n\t\tconst startPos = start ?? this.start;\n\t\tconst endPos = end ?? this.end;\n\t\tif (this.start === startPos && this.end === endPos) {\n\t\t\t// Return undefined to indicate that no change is necessary.\n\t\t\treturn;\n\t\t}\n\t\treturn new TestInterval(startPos, endPos);\n\t}\n}\n\ndescribe(\"Collections.IntervalTree\", () => {\n\tlet intervalTree: IntervalTree<TestInterval>;\n\n\tbeforeEach(() => {\n\t\tintervalTree = new IntervalTree<TestInterval>();\n\t});\n\n\tdescribe(\".map\", () => {\n\t\tit(\"Should run each node through the given function\", () => {\n\t\t\tintervalTree.put(new TestInterval(1, 5));\n\t\t\tintervalTree.put(new TestInterval(4, 8));\n\t\t\tintervalTree.put(new TestInterval(1, 10));\n\n\t\t\tlet range1Pass = false;\n\t\t\tlet range2Pass = false;\n\t\t\tlet range3Pass = false;\n\n\t\t\tconst map = (interval: TestInterval) => {\n\t\t\t\tif (interval.start === 1 && interval.end === 5) {\n\t\t\t\t\trange1Pass = true;\n\t\t\t\t} else if (interval.start === 4 && interval.end === 8) {\n\t\t\t\t\trange2Pass = true;\n\t\t\t\t} else if (interval.start === 1 && interval.end === 10) {\n\t\t\t\t\trange3Pass = true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tintervalTree.map(map);\n\n\t\t\tconst fullWalk = range1Pass && range2Pass && range3Pass;\n\t\t\tassert.equal(fullWalk, true, \"Full walk of the interval tree did not occur\");\n\t\t});\n\t});\n});\n"]}
@@ -0,0 +1,15 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import fs from "fs";
6
+ import { convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
7
+ import { generateStrings, LocationBase } from "./generateSharedStrings.js";
8
+ for (const { snapshotPath, expected, snapshotIsNormalized } of generateStrings()) {
9
+ const summaryTree = expected.getAttachSummary().summary;
10
+ const snapshotTree = convertSummaryTreeToITree(summaryTree);
11
+ if (snapshotIsNormalized || snapshotPath === "v1Intervals/withV1Intervals") {
12
+ fs.writeFileSync(`${LocationBase}${snapshotPath}.json`, JSON.stringify(snapshotTree, undefined, 1));
13
+ }
14
+ }
15
+ //# sourceMappingURL=createSnapshotFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSnapshotFiles.js","sourceRoot":"","sources":["../../src/test/createSnapshotFiles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE3E,KAAK,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,eAAe,EAAE,EAAE;IACjF,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC;IACxD,MAAM,YAAY,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,oBAAoB,IAAI,YAAY,KAAK,6BAA6B,EAAE;QAC3E,EAAE,CAAC,aAAa,CACf,GAAG,YAAY,GAAG,YAAY,OAAO,EACrC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAC1C,CAAC;KACF;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\nimport { convertSummaryTreeToITree } from \"@fluidframework/runtime-utils\";\nimport { generateStrings, LocationBase } from \"./generateSharedStrings.js\";\n\nfor (const { snapshotPath, expected, snapshotIsNormalized } of generateStrings()) {\n\tconst summaryTree = expected.getAttachSummary().summary;\n\tconst snapshotTree = convertSummaryTreeToITree(summaryTree);\n\tif (snapshotIsNormalized || snapshotPath === \"v1Intervals/withV1Intervals\") {\n\t\tfs.writeFileSync(\n\t\t\t`${LocationBase}${snapshotPath}.json`,\n\t\t\tJSON.stringify(snapshotTree, undefined, 1),\n\t\t);\n\t}\n}\n"]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports._dirname = void 0;
8
+ // Problem:
9
+ // - `__dirname` is not defined in ESM
10
+ // - `import.meta.url` is not defined in CJS
11
+ // Solution:
12
+ // - Export '__dirname' from a .cjs file in the same directory.
13
+ //
14
+ // Note that *.cjs files are always CommonJS, but can be imported from ESM.
15
+ exports._dirname = __dirname;
16
+ //# sourceMappingURL=dirname.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dirname.cjs","sourceRoot":"","sources":["../../src/test/dirname.cts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,WAAW;AACX,wCAAwC;AACxC,8CAA8C;AAC9C,YAAY;AACZ,iEAAiE;AACjE,EAAE;AACF,2EAA2E;AAC9D,QAAA,QAAQ,GAAG,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// Problem:\n// - `__dirname` is not defined in ESM\n// - `import.meta.url` is not defined in CJS\n// Solution:\n// - Export '__dirname' from a .cjs file in the same directory.\n//\n// Note that *.cjs files are always CommonJS, but can be imported from ESM.\nexport const _dirname = __dirname;\n"]}
@@ -0,0 +1,182 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { strict as assert } from "assert";
6
+ import { makeRandom } from "@fluid-private/stochastic-test-utils";
7
+ import { EndpointInRangeIndex } from "../intervalIndex/index.js";
8
+ import { intervalHelpers } from "../intervals/index.js";
9
+ import { assertPlainNumberIntervals, createTestInterval, generateRandomIntervals, } from "./intervalIndexTestUtils.js";
10
+ class TestEndpointInRangeIndex {
11
+ constructor() {
12
+ this.intervals = [];
13
+ }
14
+ add(interval) {
15
+ this.intervals.push(interval);
16
+ }
17
+ remove(interval) {
18
+ const index = this.intervals.findIndex((i) => i === interval);
19
+ if (index !== -1) {
20
+ this.intervals.splice(index, 1);
21
+ }
22
+ }
23
+ findIntervalsWithEndpointInRange(start, end) {
24
+ return this.intervals.filter((interval) => interval.end >= start && interval.end <= end);
25
+ }
26
+ }
27
+ describe("findIntervalsWithEndpointInRange", () => {
28
+ const helpers = intervalHelpers;
29
+ // sort the query result by the interval endpoint value
30
+ const compareFn = (a, b) => {
31
+ if (a.end === b.end) {
32
+ return a.start - b.start;
33
+ }
34
+ return a.end - b.end;
35
+ };
36
+ let endpointInRangeIndex;
37
+ let results;
38
+ beforeEach(() => {
39
+ endpointInRangeIndex = new EndpointInRangeIndex(undefined, helpers);
40
+ });
41
+ describe("finds no intervals", () => {
42
+ it("when the index is empty", () => {
43
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 1);
44
+ assert.equal(results.length, 0);
45
+ });
46
+ describe("with intervals in the index", () => {
47
+ beforeEach(() => {
48
+ endpointInRangeIndex.add(createTestInterval(1, 2));
49
+ endpointInRangeIndex.add(createTestInterval(2, 3));
50
+ });
51
+ it("when start > end for the query range", () => {
52
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(2, 1);
53
+ assert.equal(results.length, 0);
54
+ });
55
+ it("when start is 0 for the query range", () => {
56
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(0, 1);
57
+ assert.equal(results.length, 0);
58
+ });
59
+ it("when endpoint(s) of the query range are negative", () => {
60
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(-2, -1);
61
+ assert.equal(results.length, 0);
62
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(-1, 1);
63
+ assert.equal(results.length, 0);
64
+ });
65
+ it("when all intervals are above the query range", () => {
66
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 1);
67
+ assert.equal(results.length, 0);
68
+ });
69
+ it("when all intervals are below the query range", () => {
70
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(4, 5);
71
+ assert.equal(results.length, 0);
72
+ });
73
+ });
74
+ });
75
+ describe("finds intervals while performing multiple adding operations on the index", () => {
76
+ beforeEach(() => {
77
+ endpointInRangeIndex.add(createTestInterval(1, 1));
78
+ endpointInRangeIndex.add(createTestInterval(1, 3));
79
+ });
80
+ it("when quering the intervals which the startpoints exactly fall on the range boundary", () => {
81
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 1);
82
+ assertPlainNumberIntervals(results, [{ start: 1, end: 1 }]);
83
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);
84
+ assertPlainNumberIntervals(results, [
85
+ { start: 1, end: 1 },
86
+ { start: 1, end: 3 },
87
+ ]);
88
+ });
89
+ it("when querying various kinds of intervals within the range", () => {
90
+ endpointInRangeIndex.add(createTestInterval(2, 4));
91
+ endpointInRangeIndex.add(createTestInterval(3, 5));
92
+ endpointInRangeIndex.add(createTestInterval(3, 4));
93
+ endpointInRangeIndex.add(createTestInterval(3, 4)); // duplicate interval
94
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(3, 6);
95
+ results.sort(compareFn);
96
+ assertPlainNumberIntervals(results, [
97
+ { start: 1, end: 3 },
98
+ { start: 2, end: 4 },
99
+ { start: 3, end: 4 },
100
+ { start: 3, end: 4 },
101
+ { start: 3, end: 5 },
102
+ ]);
103
+ });
104
+ });
105
+ describe("find intervals while performing removing operations on the index", () => {
106
+ let interval1;
107
+ let interval2;
108
+ beforeEach(() => {
109
+ interval1 = createTestInterval(1, 1);
110
+ interval2 = createTestInterval(1, 3);
111
+ endpointInRangeIndex.add(interval1);
112
+ endpointInRangeIndex.add(interval2);
113
+ });
114
+ it("when removing the interval with duplicate startpoints/endpoints", () => {
115
+ const interval3 = createTestInterval(1, 1);
116
+ endpointInRangeIndex.add(interval3);
117
+ endpointInRangeIndex.remove(interval1);
118
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);
119
+ results.sort(compareFn);
120
+ assertPlainNumberIntervals(results, [
121
+ { start: 1, end: 1 },
122
+ { start: 1, end: 3 },
123
+ ]);
124
+ endpointInRangeIndex.remove(interval3);
125
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);
126
+ assertPlainNumberIntervals(results, [{ start: 1, end: 3 }]);
127
+ });
128
+ it("when removing the interval does not exist in the index", () => {
129
+ const interval3 = createTestInterval(1, 1);
130
+ endpointInRangeIndex.remove(interval3);
131
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);
132
+ results.sort(compareFn);
133
+ assertPlainNumberIntervals(results, [
134
+ { start: 1, end: 1 },
135
+ { start: 1, end: 3 },
136
+ ]);
137
+ });
138
+ it("when removing the interval within the target range", () => {
139
+ endpointInRangeIndex.remove(interval2);
140
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);
141
+ assertPlainNumberIntervals(results, [{ start: 1, end: 1 }]);
142
+ const interval3 = createTestInterval(2, 4);
143
+ endpointInRangeIndex.add(interval3);
144
+ const interval4 = createTestInterval(3, 4);
145
+ endpointInRangeIndex.add(interval4);
146
+ endpointInRangeIndex.remove(interval3);
147
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 5);
148
+ results.sort(compareFn);
149
+ assertPlainNumberIntervals(results, [
150
+ { start: 1, end: 1 },
151
+ { start: 3, end: 4 },
152
+ ]);
153
+ });
154
+ });
155
+ describe("find exactly the same intervals as those obtained by `brute-force` method", () => {
156
+ it("when given massive random inputs", () => {
157
+ const testIndex = new TestEndpointInRangeIndex();
158
+ const random = makeRandom(0);
159
+ const count = 800;
160
+ const min = 1;
161
+ const max = 1500;
162
+ // Generate intervals randomly and add them to both index
163
+ const intervals = generateRandomIntervals({ random, count, min, max });
164
+ for (const interval of intervals) {
165
+ testIndex.add(interval);
166
+ endpointInRangeIndex.add(interval);
167
+ }
168
+ // Test with running 1000 random queries
169
+ for (let i = 0; i < 1000; ++i) {
170
+ const start = random.integer(min, max);
171
+ const end = random.integer(start, max);
172
+ // Query intervals using both index
173
+ results = endpointInRangeIndex.findIntervalsWithEndpointInRange(start, end);
174
+ const expected = testIndex.findIntervalsWithEndpointInRange(start, end);
175
+ results.sort(compareFn);
176
+ expected.sort(compareFn);
177
+ assertPlainNumberIntervals(results, expected);
178
+ }
179
+ });
180
+ });
181
+ });
182
+ //# sourceMappingURL=endpointInRangeIndex.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpointInRangeIndex.spec.js","sourceRoot":"","sources":["../../src/test/endpointInRangeIndex.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { Client } from \"@fluidframework/merge-tree\";\nimport { EndpointInRangeIndex, IEndpointInRangeIndex } from \"../intervalIndex/index.js\";\nimport { Interval, intervalHelpers } from \"../intervals/index.js\";\nimport {\n\tassertPlainNumberIntervals,\n\tcreateTestInterval,\n\tgenerateRandomIntervals,\n} from \"./intervalIndexTestUtils.js\";\n\nclass TestEndpointInRangeIndex implements IEndpointInRangeIndex<Interval> {\n\tprivate readonly intervals: Interval[];\n\n\tconstructor() {\n\t\tthis.intervals = [];\n\t}\n\n\tadd(interval: Interval) {\n\t\tthis.intervals.push(interval);\n\t}\n\n\tremove(interval: Interval) {\n\t\tconst index = this.intervals.findIndex((i) => i === interval);\n\t\tif (index !== -1) {\n\t\t\tthis.intervals.splice(index, 1);\n\t\t}\n\t}\n\n\tfindIntervalsWithEndpointInRange(start: number, end: number): Interval[] {\n\t\treturn this.intervals.filter((interval) => interval.end >= start && interval.end <= end);\n\t}\n}\n\ndescribe(\"findIntervalsWithEndpointInRange\", () => {\n\tconst helpers = intervalHelpers;\n\t// sort the query result by the interval endpoint value\n\tconst compareFn = (a: Interval, b: Interval) => {\n\t\tif (a.end === b.end) {\n\t\t\treturn a.start - b.start;\n\t\t}\n\t\treturn a.end - b.end;\n\t};\n\tlet endpointInRangeIndex;\n\tlet results;\n\n\tbeforeEach(() => {\n\t\tendpointInRangeIndex = new EndpointInRangeIndex(undefined as any as Client, helpers);\n\t});\n\n\tdescribe(\"finds no intervals\", () => {\n\t\tit(\"when the index is empty\", () => {\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 1);\n\t\t\tassert.equal(results.length, 0);\n\t\t});\n\n\t\tdescribe(\"with intervals in the index\", () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\tendpointInRangeIndex.add(createTestInterval(1, 2));\n\t\t\t\tendpointInRangeIndex.add(createTestInterval(2, 3));\n\t\t\t});\n\n\t\t\tit(\"when start > end for the query range\", () => {\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(2, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when start is 0 for the query range\", () => {\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(0, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when endpoint(s) of the query range are negative\", () => {\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(-2, -1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(-1, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when all intervals are above the query range\", () => {\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 1);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\n\t\t\tit(\"when all intervals are below the query range\", () => {\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(4, 5);\n\t\t\t\tassert.equal(results.length, 0);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"finds intervals while performing multiple adding operations on the index\", () => {\n\t\tbeforeEach(() => {\n\t\t\tendpointInRangeIndex.add(createTestInterval(1, 1));\n\t\t\tendpointInRangeIndex.add(createTestInterval(1, 3));\n\t\t});\n\n\t\tit(\"when quering the intervals which the startpoints exactly fall on the range boundary\", () => {\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 1);\n\t\t\tassertPlainNumberIntervals(results, [{ start: 1, end: 1 }]);\n\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when querying various kinds of intervals within the range\", () => {\n\t\t\tendpointInRangeIndex.add(createTestInterval(2, 4));\n\t\t\tendpointInRangeIndex.add(createTestInterval(3, 5));\n\t\t\tendpointInRangeIndex.add(createTestInterval(3, 4));\n\t\t\tendpointInRangeIndex.add(createTestInterval(3, 4)); // duplicate interval\n\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(3, 6);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t\t{ start: 2, end: 4 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t\t{ start: 3, end: 5 },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\"find intervals while performing removing operations on the index\", () => {\n\t\tlet interval1;\n\t\tlet interval2;\n\n\t\tbeforeEach(() => {\n\t\t\tinterval1 = createTestInterval(1, 1);\n\t\t\tinterval2 = createTestInterval(1, 3);\n\t\t\tendpointInRangeIndex.add(interval1);\n\t\t\tendpointInRangeIndex.add(interval2);\n\t\t});\n\n\t\tit(\"when removing the interval with duplicate startpoints/endpoints\", () => {\n\t\t\tconst interval3 = createTestInterval(1, 1);\n\t\t\tendpointInRangeIndex.add(interval3);\n\t\t\tendpointInRangeIndex.remove(interval1);\n\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t]);\n\n\t\t\tendpointInRangeIndex.remove(interval3);\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);\n\t\t\tassertPlainNumberIntervals(results, [{ start: 1, end: 3 }]);\n\t\t});\n\n\t\tit(\"when removing the interval does not exist in the index\", () => {\n\t\t\tconst interval3 = createTestInterval(1, 1);\n\t\t\tendpointInRangeIndex.remove(interval3);\n\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 1, end: 3 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"when removing the interval within the target range\", () => {\n\t\t\tendpointInRangeIndex.remove(interval2);\n\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 3);\n\t\t\tassertPlainNumberIntervals(results, [{ start: 1, end: 1 }]);\n\n\t\t\tconst interval3 = createTestInterval(2, 4);\n\t\t\tendpointInRangeIndex.add(interval3);\n\n\t\t\tconst interval4 = createTestInterval(3, 4);\n\t\t\tendpointInRangeIndex.add(interval4);\n\n\t\t\tendpointInRangeIndex.remove(interval3);\n\n\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(1, 5);\n\t\t\tresults.sort(compareFn);\n\t\t\tassertPlainNumberIntervals(results, [\n\t\t\t\t{ start: 1, end: 1 },\n\t\t\t\t{ start: 3, end: 4 },\n\t\t\t]);\n\t\t});\n\t});\n\n\tdescribe(\"find exactly the same intervals as those obtained by `brute-force` method\", () => {\n\t\tit(\"when given massive random inputs\", () => {\n\t\t\tconst testIndex = new TestEndpointInRangeIndex();\n\t\t\tconst random = makeRandom(0);\n\t\t\tconst count = 800;\n\t\t\tconst min = 1;\n\t\t\tconst max = 1500;\n\n\t\t\t// Generate intervals randomly and add them to both index\n\t\t\tconst intervals = generateRandomIntervals({ random, count, min, max });\n\t\t\tfor (const interval of intervals) {\n\t\t\t\ttestIndex.add(interval);\n\t\t\t\tendpointInRangeIndex.add(interval);\n\t\t\t}\n\n\t\t\t// Test with running 1000 random queries\n\t\t\tfor (let i = 0; i < 1000; ++i) {\n\t\t\t\tconst start = random.integer(min, max);\n\t\t\t\tconst end = random.integer(start, max);\n\t\t\t\t// Query intervals using both index\n\t\t\t\tresults = endpointInRangeIndex.findIntervalsWithEndpointInRange(start, end);\n\t\t\t\tconst expected = testIndex.findIntervalsWithEndpointInRange(start, end);\n\t\t\t\tresults.sort(compareFn);\n\t\t\t\texpected.sort(compareFn);\n\n\t\t\t\tassertPlainNumberIntervals(results, expected);\n\t\t\t}\n\t\t});\n\t});\n});\n"]}