@fluidframework/merge-tree 1.2.7 → 2.0.0-dev.1.3.0.96595

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 (244) hide show
  1. package/.mocharc.js +12 -0
  2. package/README.md +2 -2
  3. package/dist/MergeTreeTextHelper.d.ts +23 -0
  4. package/dist/MergeTreeTextHelper.d.ts.map +1 -0
  5. package/dist/MergeTreeTextHelper.js +133 -0
  6. package/dist/MergeTreeTextHelper.js.map +1 -0
  7. package/dist/base.d.ts +2 -26
  8. package/dist/base.d.ts.map +1 -1
  9. package/dist/base.js.map +1 -1
  10. package/dist/client.d.ts +27 -16
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +81 -101
  13. package/dist/client.js.map +1 -1
  14. package/dist/collections/heap.d.ts +28 -0
  15. package/dist/collections/heap.d.ts.map +1 -0
  16. package/dist/collections/heap.js +65 -0
  17. package/dist/collections/heap.js.map +1 -0
  18. package/dist/collections/index.d.ts +11 -0
  19. package/dist/collections/index.d.ts.map +1 -0
  20. package/dist/collections/index.js +23 -0
  21. package/dist/collections/index.js.map +1 -0
  22. package/dist/collections/intervalTree.d.ts +60 -0
  23. package/dist/collections/intervalTree.d.ts.map +1 -0
  24. package/dist/collections/intervalTree.js +99 -0
  25. package/dist/collections/intervalTree.js.map +1 -0
  26. package/dist/collections/list.d.ts +39 -0
  27. package/dist/collections/list.d.ts.map +1 -0
  28. package/dist/collections/list.js +155 -0
  29. package/dist/collections/list.js.map +1 -0
  30. package/dist/collections/rbTree.d.ts +154 -0
  31. package/dist/collections/rbTree.d.ts.map +1 -0
  32. package/dist/{collections.js → collections/rbTree.js} +15 -478
  33. package/dist/collections/rbTree.js.map +1 -0
  34. package/dist/collections/stack.d.ts +16 -0
  35. package/dist/collections/stack.d.ts.map +1 -0
  36. package/dist/collections/stack.js +30 -0
  37. package/dist/collections/stack.js.map +1 -0
  38. package/dist/collections/tst.d.ts +55 -0
  39. package/dist/collections/tst.d.ts.map +1 -0
  40. package/dist/collections/tst.js +171 -0
  41. package/dist/collections/tst.js.map +1 -0
  42. package/dist/index.d.ts +3 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +4 -2
  45. package/dist/index.js.map +1 -1
  46. package/dist/localReference.d.ts +48 -99
  47. package/dist/localReference.d.ts.map +1 -1
  48. package/dist/localReference.js +132 -169
  49. package/dist/localReference.js.map +1 -1
  50. package/dist/mergeTree.d.ts +71 -302
  51. package/dist/mergeTree.d.ts.map +1 -1
  52. package/dist/mergeTree.js +395 -642
  53. package/dist/mergeTree.js.map +1 -1
  54. package/dist/mergeTreeDeltaCallback.d.ts +1 -1
  55. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  56. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  57. package/dist/mergeTreeNodes.d.ts +344 -0
  58. package/dist/mergeTreeNodes.d.ts.map +1 -0
  59. package/dist/mergeTreeNodes.js +383 -0
  60. package/dist/mergeTreeNodes.js.map +1 -0
  61. package/dist/mergeTreeTracking.d.ts +1 -1
  62. package/dist/mergeTreeTracking.d.ts.map +1 -1
  63. package/dist/mergeTreeTracking.js.map +1 -1
  64. package/dist/opBuilder.d.ts +1 -1
  65. package/dist/opBuilder.d.ts.map +1 -1
  66. package/dist/opBuilder.js.map +1 -1
  67. package/dist/partialLengths.d.ts +188 -18
  68. package/dist/partialLengths.d.ts.map +1 -1
  69. package/dist/partialLengths.js +495 -253
  70. package/dist/partialLengths.js.map +1 -1
  71. package/dist/properties.d.ts.map +1 -1
  72. package/dist/properties.js.map +1 -1
  73. package/dist/referencePositions.d.ts +6 -26
  74. package/dist/referencePositions.d.ts.map +1 -1
  75. package/dist/referencePositions.js +3 -20
  76. package/dist/referencePositions.js.map +1 -1
  77. package/dist/segmentGroupCollection.d.ts +3 -1
  78. package/dist/segmentGroupCollection.d.ts.map +1 -1
  79. package/dist/segmentGroupCollection.js +14 -1
  80. package/dist/segmentGroupCollection.js.map +1 -1
  81. package/dist/segmentPropertiesManager.d.ts +10 -1
  82. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  83. package/dist/segmentPropertiesManager.js +42 -13
  84. package/dist/segmentPropertiesManager.js.map +1 -1
  85. package/dist/snapshotChunks.d.ts +2 -1
  86. package/dist/snapshotChunks.d.ts.map +1 -1
  87. package/dist/snapshotChunks.js.map +1 -1
  88. package/dist/snapshotLoader.d.ts.map +1 -1
  89. package/dist/snapshotLoader.js.map +1 -1
  90. package/dist/snapshotV1.d.ts +1 -1
  91. package/dist/snapshotV1.d.ts.map +1 -1
  92. package/dist/snapshotV1.js +1 -1
  93. package/dist/snapshotV1.js.map +1 -1
  94. package/dist/snapshotlegacy.d.ts +5 -1
  95. package/dist/snapshotlegacy.d.ts.map +1 -1
  96. package/dist/snapshotlegacy.js +4 -0
  97. package/dist/snapshotlegacy.js.map +1 -1
  98. package/dist/sortedSegmentSet.d.ts +1 -1
  99. package/dist/sortedSegmentSet.d.ts.map +1 -1
  100. package/dist/sortedSegmentSet.js.map +1 -1
  101. package/dist/textSegment.d.ts +7 -7
  102. package/dist/textSegment.d.ts.map +1 -1
  103. package/dist/textSegment.js +3 -125
  104. package/dist/textSegment.js.map +1 -1
  105. package/{DEV.md → docs/DEV.md} +2 -2
  106. package/docs/Obliterate.md +639 -0
  107. package/{REFERENCEPOSITIONS.md → docs/REFERENCEPOSITIONS.md} +2 -2
  108. package/lib/MergeTreeTextHelper.d.ts +23 -0
  109. package/lib/MergeTreeTextHelper.d.ts.map +1 -0
  110. package/lib/MergeTreeTextHelper.js +129 -0
  111. package/lib/MergeTreeTextHelper.js.map +1 -0
  112. package/lib/base.d.ts +2 -26
  113. package/lib/base.d.ts.map +1 -1
  114. package/lib/base.js.map +1 -1
  115. package/lib/client.d.ts +27 -16
  116. package/lib/client.d.ts.map +1 -1
  117. package/lib/client.js +79 -99
  118. package/lib/client.js.map +1 -1
  119. package/lib/collections/heap.d.ts +28 -0
  120. package/lib/collections/heap.d.ts.map +1 -0
  121. package/lib/collections/heap.js +61 -0
  122. package/lib/collections/heap.js.map +1 -0
  123. package/lib/collections/index.d.ts +11 -0
  124. package/lib/collections/index.d.ts.map +1 -0
  125. package/lib/collections/index.js +11 -0
  126. package/lib/collections/index.js.map +1 -0
  127. package/lib/collections/intervalTree.d.ts +60 -0
  128. package/lib/collections/intervalTree.d.ts.map +1 -0
  129. package/lib/collections/intervalTree.js +94 -0
  130. package/lib/collections/intervalTree.js.map +1 -0
  131. package/lib/collections/list.d.ts +39 -0
  132. package/lib/collections/list.d.ts.map +1 -0
  133. package/lib/collections/list.js +149 -0
  134. package/lib/collections/list.js.map +1 -0
  135. package/lib/collections/rbTree.d.ts +154 -0
  136. package/lib/collections/rbTree.d.ts.map +1 -0
  137. package/lib/{collections.js → collections/rbTree.js} +14 -469
  138. package/lib/collections/rbTree.js.map +1 -0
  139. package/lib/collections/stack.d.ts +16 -0
  140. package/lib/collections/stack.d.ts.map +1 -0
  141. package/lib/collections/stack.js +26 -0
  142. package/lib/collections/stack.js.map +1 -0
  143. package/lib/collections/tst.d.ts +55 -0
  144. package/lib/collections/tst.d.ts.map +1 -0
  145. package/lib/collections/tst.js +167 -0
  146. package/lib/collections/tst.js.map +1 -0
  147. package/lib/index.d.ts +3 -1
  148. package/lib/index.d.ts.map +1 -1
  149. package/lib/index.js +3 -1
  150. package/lib/index.js.map +1 -1
  151. package/lib/localReference.d.ts +48 -99
  152. package/lib/localReference.d.ts.map +1 -1
  153. package/lib/localReference.js +132 -170
  154. package/lib/localReference.js.map +1 -1
  155. package/lib/mergeTree.d.ts +71 -302
  156. package/lib/mergeTree.d.ts.map +1 -1
  157. package/lib/mergeTree.js +371 -607
  158. package/lib/mergeTree.js.map +1 -1
  159. package/lib/mergeTreeDeltaCallback.d.ts +1 -1
  160. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  161. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  162. package/lib/mergeTreeNodes.d.ts +344 -0
  163. package/lib/mergeTreeNodes.d.ts.map +1 -0
  164. package/lib/mergeTreeNodes.js +369 -0
  165. package/lib/mergeTreeNodes.js.map +1 -0
  166. package/lib/mergeTreeTracking.d.ts +1 -1
  167. package/lib/mergeTreeTracking.d.ts.map +1 -1
  168. package/lib/mergeTreeTracking.js.map +1 -1
  169. package/lib/opBuilder.d.ts +1 -1
  170. package/lib/opBuilder.d.ts.map +1 -1
  171. package/lib/opBuilder.js.map +1 -1
  172. package/lib/partialLengths.d.ts +188 -18
  173. package/lib/partialLengths.d.ts.map +1 -1
  174. package/lib/partialLengths.js +491 -249
  175. package/lib/partialLengths.js.map +1 -1
  176. package/lib/properties.d.ts.map +1 -1
  177. package/lib/properties.js.map +1 -1
  178. package/lib/referencePositions.d.ts +6 -26
  179. package/lib/referencePositions.d.ts.map +1 -1
  180. package/lib/referencePositions.js +3 -20
  181. package/lib/referencePositions.js.map +1 -1
  182. package/lib/segmentGroupCollection.d.ts +3 -1
  183. package/lib/segmentGroupCollection.d.ts.map +1 -1
  184. package/lib/segmentGroupCollection.js +14 -1
  185. package/lib/segmentGroupCollection.js.map +1 -1
  186. package/lib/segmentPropertiesManager.d.ts +10 -1
  187. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  188. package/lib/segmentPropertiesManager.js +42 -13
  189. package/lib/segmentPropertiesManager.js.map +1 -1
  190. package/lib/snapshotChunks.d.ts +2 -1
  191. package/lib/snapshotChunks.d.ts.map +1 -1
  192. package/lib/snapshotChunks.js.map +1 -1
  193. package/lib/snapshotLoader.d.ts.map +1 -1
  194. package/lib/snapshotLoader.js.map +1 -1
  195. package/lib/snapshotV1.d.ts +1 -1
  196. package/lib/snapshotV1.d.ts.map +1 -1
  197. package/lib/snapshotV1.js +1 -1
  198. package/lib/snapshotV1.js.map +1 -1
  199. package/lib/snapshotlegacy.d.ts +5 -1
  200. package/lib/snapshotlegacy.d.ts.map +1 -1
  201. package/lib/snapshotlegacy.js +4 -0
  202. package/lib/snapshotlegacy.js.map +1 -1
  203. package/lib/sortedSegmentSet.d.ts +1 -1
  204. package/lib/sortedSegmentSet.d.ts.map +1 -1
  205. package/lib/sortedSegmentSet.js.map +1 -1
  206. package/lib/textSegment.d.ts +7 -7
  207. package/lib/textSegment.d.ts.map +1 -1
  208. package/lib/textSegment.js +1 -122
  209. package/lib/textSegment.js.map +1 -1
  210. package/package.json +99 -20
  211. package/src/MergeTreeTextHelper.ts +170 -0
  212. package/src/base.ts +2 -35
  213. package/src/client.ts +91 -111
  214. package/src/collections/heap.ts +75 -0
  215. package/src/collections/index.ts +11 -0
  216. package/src/collections/intervalTree.ts +146 -0
  217. package/src/collections/list.ts +165 -0
  218. package/src/{collections.ts → collections/rbTree.ts} +84 -563
  219. package/src/collections/stack.ts +27 -0
  220. package/src/collections/tst.ts +212 -0
  221. package/src/index.ts +8 -2
  222. package/src/localReference.ts +152 -203
  223. package/src/mergeTree.ts +578 -996
  224. package/src/mergeTreeDeltaCallback.ts +1 -1
  225. package/src/mergeTreeNodes.ts +752 -0
  226. package/src/mergeTreeTracking.ts +1 -1
  227. package/src/opBuilder.ts +1 -1
  228. package/src/partialLengths.ts +631 -258
  229. package/src/properties.ts +1 -0
  230. package/src/referencePositions.ts +10 -44
  231. package/src/segmentGroupCollection.ts +17 -2
  232. package/src/segmentPropertiesManager.ts +46 -12
  233. package/src/snapshotChunks.ts +2 -1
  234. package/src/snapshotLoader.ts +2 -1
  235. package/src/snapshotV1.ts +3 -3
  236. package/src/snapshotlegacy.ts +6 -2
  237. package/src/sortedSegmentSet.ts +1 -1
  238. package/src/textSegment.ts +10 -157
  239. package/dist/collections.d.ts +0 -197
  240. package/dist/collections.d.ts.map +0 -1
  241. package/dist/collections.js.map +0 -1
  242. package/lib/collections.d.ts +0 -197
  243. package/lib/collections.d.ts.map +0 -1
  244. package/lib/collections.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/common-utils\";\nimport { Property } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n MergeTree,\n toRemovalInfo,\n} from \"./mergeTree\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\nexport interface PartialSequenceLength {\n seq: number;\n len: number;\n seglen: number;\n clientId?: number;\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\n/**\n * Keep track of partial sums of segment lengths for all sequence numbers\n * in the current collaboration window (if any). Only used during active\n * collaboration.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n public static combine(mergeTree: MergeTree, block: IMergeBlock, collabWindow: CollaborationWindow, recur = false) {\n return PartialSequenceLengths.combineBranch(mergeTree, block, collabWindow, recur);\n }\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node; it is assumed that each interior node child of this block\n * has its partials up to date\n * @param collabWindow - segment window of the segment tree containing textSegmentBlock\n */\n private static combineBranch(\n mergeTree: MergeTree,\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false) {\n let combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n PartialSequenceLengths.fromLeaves(combinedPartialLengths, block, collabWindow);\n let prevPartial: PartialSequenceLength | undefined;\n\n function cloneOverlapRemoveClients(oldTree: RedBlackTree<number, IOverlapClient> | undefined) {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n }\n\n function combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n }\n\n function addNext(partialLength: PartialSequenceLength) {\n const seq = partialLength.seq;\n let pLen = 0;\n\n if (prevPartial) {\n if (prevPartial.seq === partialLength.seq) {\n prevPartial.seglen += partialLength.seglen;\n prevPartial.len += partialLength.seglen;\n combineOverlapClients(prevPartial, partialLength);\n return;\n } else {\n pLen = prevPartial.len;\n // Previous sequence number is finished\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n prevPartial = {\n clientId: partialLength.clientId,\n len: pLen + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n seglen: partialLength.seglen,\n seq,\n };\n combinedPartialLengths.partialLengths.push(prevPartial);\n }\n\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n if (recur) {\n childBlock.partialLengths =\n PartialSequenceLengths.combine(mergeTree, childBlock, collabWindow, true);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(childBlock.partialLengths!);\n }\n }\n let childPartialsLen = childPartials.length;\n if (childPartialsLen !== 0) {\n // Some children are interior nodes\n if (combinedPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(combinedPartialLengths);\n childPartialsLen++;\n combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq);\n }\n const indices = new Array<number>(childPartialsLen);\n const childPartialsCounts = new Array<number>(childPartialsLen);\n for (let i = 0; i < childPartialsLen; i++) {\n indices[i] = 0;\n childPartialsCounts[i] = childPartials[i].partialLengths.length;\n combinedPartialLengths.minLength += childPartials[i].minLength;\n combinedPartialLengths.segmentCount += childPartials[i].segmentCount;\n }\n let outerIndexOfEarliest = 0;\n let earliestPartialLength: PartialSequenceLength;\n while (outerIndexOfEarliest >= 0) {\n outerIndexOfEarliest = -1;\n for (let k = 0; k < childPartialsLen; k++) {\n // Find next earliest sequence number\n if (indices[k] < childPartialsCounts[k]) {\n const cpLen = childPartials[k].partialLengths[indices[k]];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((outerIndexOfEarliest < 0) || (cpLen.seq < earliestPartialLength!.seq)) {\n outerIndexOfEarliest = k;\n earliestPartialLength = cpLen;\n }\n }\n }\n if (outerIndexOfEarliest >= 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n addNext(earliestPartialLength!);\n indices[outerIndexOfEarliest]++;\n }\n }\n // Add client entry for last partial, if any\n if (prevPartial) {\n combinedPartialLengths.addClientSeqNumberFromPartial(prevPartial);\n }\n }\n // TODO: incremental zamboni during build\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n\n return combinedPartialLengths;\n }\n\n private static fromLeaves(\n combinedPartialLengths: PartialSequenceLengths,\n block: IMergeBlock, collabWindow: CollaborationWindow) {\n combinedPartialLengths.minLength = 0;\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number | undefined, minSeq: number) {\n return seq !== undefined && seq !== UnassignedSequenceNumber && seq <= minSeq;\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n if (seqLTE(segment.seq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n if (segment.seq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n }\n const removalInfo = toRemovalInfo(segment);\n if (seqLTE(removalInfo?.removedSeq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else {\n if (removalInfo !== undefined\n && removalInfo.removedSeq !== UnassignedSequenceNumber) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n if (PartialSequenceLengths.options.verify) {\n combinedPartialLengths.verify();\n }\n }\n\n private static getOverlapClients(overlapClientIds: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientIds) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!overlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n overlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seq = segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n seq = removalInfo.removedSeq;\n segmentLen = -segmentLen;\n // this code still assume removed client id and\n // overlap clients are separate. so we need to pull\n // then apart first.\n clientId = removalInfo.removedClientIds[0];\n removeClientOverlap = removalInfo.removedClientIds.length > 1\n ? removalInfo.removedClientIds.slice(1)\n : undefined;\n }\n\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < seqPartialsLen; indexFirstGTE++) {\n if (seqPartials[indexFirstGTE].seq >= seq) {\n break;\n }\n }\n if ((indexFirstGTE < seqPartialsLen) && (seqPartials[indexFirstGTE].seq === seq)) {\n seqPartials[indexFirstGTE].seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n seqPartials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n let pLen: PartialSequenceLength;\n if (removeClientOverlap) {\n const overlapClients = PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen);\n pLen = { seq, clientId, len: 0, seglen: segmentLen, overlapRemoveClients: overlapClients };\n } else {\n pLen = { seq, clientId, len: 0, seglen: segmentLen };\n }\n\n if (indexFirstGTE < seqPartialsLen) {\n // Shift entries with greater sequence numbers\n // TODO: investigate performance improvement using BST\n for (let k = seqPartialsLen; k > indexFirstGTE; k--) {\n seqPartials[k] = seqPartials[k - 1];\n }\n seqPartials[indexFirstGTE] = pLen;\n } else {\n seqPartials.push(pLen);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n if (seqPartialLen === undefined) {\n // len will be assigned below, making this assertion true.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n seqPartialLen = {\n clientId,\n seglen: seqSeglen,\n seq,\n } as PartialSequenceLength;\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n // Assert client id matches\n }\n if (penultPartialLen !== undefined) {\n seqPartialLen.len = seqPartialLen.seglen + penultPartialLen.len;\n } else {\n seqPartialLen.len = seqPartialLen.seglen;\n }\n }\n public minLength = 0;\n public segmentCount = 0;\n public partialLengths: PartialSequenceLength[] = [];\n public clientSeqNumbers: PartialSequenceLength[][] = [];\n\n constructor(public minSeq: number) {\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree\n // TODO: assert client id matches\n public update(\n mergeTree: MergeTree,\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo = toRemovalInfo(segment);\n\n if (segment.seq === seq) {\n if (removalInfo?.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo?.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n this.verify();\n }\n }\n\n public getPartialLength(refSeq: number, clientId: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestIndex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n // Add the partial length up to refSeq\n pLen += this.partialLengths[seqIndex].len;\n\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n // RefSeq is before any of the partial lengths\n // so just add in all local edits of that client (which should all be after the refSeq)\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n pLen += cliLatest.len;\n }\n }\n return pLen;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n if (glc) {\n buf += `${glc(+clientId)}`;\n } else {\n buf += `${clientId}`;\n }\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs) {\n return latestLEQ(cliSeqs, refSeq);\n } else {\n return -1;\n }\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n if (cliSeqs && (cliSeqs.length > 0)) {\n return cliSeqs.length - 1;\n } else {\n return -1;\n }\n }\n\n // Debug only\n private verifyPartialLengths(partialLengths: PartialSequenceLength[], clientPartials: boolean) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(this.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (this.minLength + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one\n count += partialLength.overlapRemoveClients.size();\n }\n }\n return count;\n }\n\n private verify() {\n if (this.clientSeqNumbers) {\n let cliCount = 0;\n for (const cliSeq of this.clientSeqNumbers) {\n if (cliSeq) {\n cliCount += this.verifyPartialLengths(cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!this.partialLengths, 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = this.verifyPartialLengths(this.partialLengths, false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!this.partialLengths, 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.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 { assert } from \"@fluidframework/common-utils\";\nimport { Property, RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber } from \"./constants\";\nimport {\n CollaborationWindow,\n compareNumbers,\n IMergeBlock,\n IRemovalInfo,\n ISegment,\n toRemovalInfo,\n} from \"./mergeTreeNodes\";\n\ninterface IOverlapClient {\n clientId: number;\n seglen: number;\n}\n\n/**\n * Returns the partial length whose sequence number is\n * the greatest sequence number within a that is\n * less than or equal to key.\n * @param a - array of partial segment lengths\n * @param key - sequence number\n */\nfunction latestLEQ(a: PartialSequenceLength[], key: number) {\n let best = -1;\n let lo = 0;\n let hi = a.length - 1;\n while (lo <= hi) {\n const mid = lo + Math.floor((hi - lo) / 2);\n if (a[mid].seq <= key) {\n if ((best < 0) || (a[best].seq < a[mid].seq)) {\n best = mid;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\n/**\n * Tracks length information for a part of a MergeTree (block) at a given time (seq).\n * These objects are associated with internal nodes (i.e. blocks).\n */\nexport interface PartialSequenceLength {\n /**\n * Sequence number\n */\n seq: number;\n /**\n * The length of the associated block.\n */\n len: number;\n /**\n * The delta between the current length of the associated block and its length at the previous seq number.\n */\n seglen: number;\n /**\n * clientId for the client that submitted the op with sequence number `seq`.\n */\n clientId?: number;\n /**\n * This field maps each client to the size of the intersection between segments deleted at this seq\n * and segments concurrently deleted by that client.\n *\n * For example, this PartialSequenceLength:\n * ```typescript\n * {\n * seq: 5,\n * len: 100,\n * seglen: -10,\n * clientId: 0,\n * overlapRemoveClients: <RedBlack tree with key-values expressed by>{\n * 1: { clientId: 1, seglen: -5 },\n * 3: { clientId: 3, seglen: -10 }\n * }\n * }\n * ```\n *\n * corresponds to an op submitted by client 0 which:\n * - reduces the length of this block by 10 (it may have deleted a single segment of length 10,\n * several segments totalling length 10, or even delete and add content for a total reduction of 10 length)\n * - was concurrent to an op submitted by client 1 that also removed some of the same segments,\n * whose length totalled 5\n * - was concurrent to an op submitted by client 3 that removed some of the same segments,\n * whose length totalled 10\n */\n overlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n}\n\ninterface UnsequencedPartialLengthInfo {\n /**\n * Contains entries for all local operations.\n * The \"seq\" field of each entry actually corresponds to the delta at that localSeq on the local client.\n */\n partialLengths: PartialSequenceLength[];\n\n /**\n * Only contains entries for segments (or aggregates thereof) which were concurrently deleted\n * by another client. Ordered by `seq` of the removing client.\n *\n * The \"length\" field of these entries is not populated. This is because pre-computing the lengths\n * of segments doesn't help given the usage pattern.\n *\n * These entries need both `seq` and `localSeq`, because a given segment remove is double-counted iff\n * the refSeq exceeds the seq of the remote remove AND the localSeq exceeds the localSeq of the local remove.\n */\n overlappingRemoves: LocalPartialSequenceLength[];\n\n /**\n * Cached keyed on refSeq which stores length information for the total overlap of removed segments at\n * that refSeq.\n * This information is derivable from the entries of `overlappingRemoves`.\n *\n * Like the `partialLengths` field, `seq` on each entry is actually the local seq.\n * See `computeOverlappingLocalRemoves` for more information.\n */\n cachedOverlappingByRefSeq: Map<number, PartialSequenceLength[]>;\n}\n\ninterface LocalPartialSequenceLength extends PartialSequenceLength {\n /**\n * Local sequence number\n */\n localSeq: number;\n}\n\n/**\n * Keeps track of partial sums of segment lengths for all sequence numbers in the current collaboration window.\n * Only used during active collaboration.\n *\n * This class is associated with an internal node (block) of a MergeTree. It efficiently answers queries of the form\n * \"What is the length of `block` from the perspective of some particular seq and clientId?\".\n *\n * It also supports incremental updating of state for newly-sequenced ops that don't affect the structure of the\n * MergeTree.\n *\n * To answer these queries, it pre-builds several lists which track the length of the block at a per-sequence-number\n * level. These lists are:\n *\n * 1. (`partialLengths`): Stores the total length of the block.\n * 2. (`clientSeqNumbers[clientId]`): Stores only the total lengths of segments submitted by `clientId`. [see footnote]\n *\n * The reason both lists are necessary is that resolving the length of the block from the perspective of\n * (clientId, refSeq) requires including both of the following types of segments:\n * 1. Segments sequenced before `refSeq`\n * 2. Segments submitted by `clientId`\n *\n * This is possible with the above bookkeeping, using:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (clientSeqNumbers total length at most recent op)\n * - (clientSeqNumbers total length at refSeq)\n *\n * where the subtraction avoids double-counting segments submitted by clientId sequenced within the collab window.\n *\n * To enable reconnect, if constructed with `computeLocalPartials === true` it also supports querying for the length of\n * the block from the perspective of the local client at a particular `refSeq` and `localSeq`. This computation is\n * similar to the above:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (unsequenced edits' total length submitted before localSeq)\n * - (overlapping remove of the unsequenced edits' total length at refSeq)\n *\n * This algorithm scales roughly linearly with number of editing clients and the size of the collab window.\n * (certain unlikely sequences of operations may introduce log factors on those variables)\n *\n * Note: there is some slight complication with clientSeqNumbers resulting from the possibility of different clients\n * concurrently removing the same segment. See the field's documentation for more details.\n */\nexport class PartialSequenceLengths {\n public static options = {\n verify: false,\n zamboni: true,\n };\n\n /**\n * Combine the partial lengths of block's children\n * @param block - an interior node. If `recur` is false, it is assumed that each interior node child of this block\n * has its partials up to date.\n * @param collabWindow - segment window of the segment tree containing `block`.\n * @param recur - whether to recursively compute partial lengths for internal children of `block`.\n * This incurs more work, but gives correct bookkeeping in the case that a descendant in the merge tree has been\n * modified without bubbling up the resulting partial length change to this block's partials.\n * @param computeLocalPartials - whether to compute partial length information about local unsequenced ops.\n * This enables querying for the length of the block at a given localSeq, but incurs extra work.\n * Local partial information doesn't support `update`.\n */\n public static combine(\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n recur = false,\n computeLocalPartials = false,\n ): PartialSequenceLengths {\n const leafPartialLengths = PartialSequenceLengths.fromLeaves(block, collabWindow, computeLocalPartials);\n\n let hasInternalChild = false;\n const childPartials: PartialSequenceLengths[] = [];\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (!child.isLeaf()) {\n hasInternalChild = true;\n if (recur) {\n child.partialLengths =\n PartialSequenceLengths.combine(child, collabWindow, true, computeLocalPartials);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n childPartials.push(child.partialLengths!);\n }\n }\n\n // If there are no internal children, the PartialSequenceLengths returns from `fromLeaves` is exactly correct.\n // Otherwise, we must additively combine all of the children partial lengths to get this block's totals.\n const combinedPartialLengths = hasInternalChild ?\n new PartialSequenceLengths(collabWindow.minSeq, computeLocalPartials) : leafPartialLengths;\n if (hasInternalChild) {\n if (leafPartialLengths.partialLengths.length > 0) {\n // Some children were leaves; add combined partials from these segments\n childPartials.push(leafPartialLengths);\n }\n\n const childPartialsLen = childPartials.length;\n\n const childPartialLengths: PartialSequenceLength[][] = [];\n const childUnsequencedPartialLengths: PartialSequenceLength[][] = [];\n const childOverlapRemoves: LocalPartialSequenceLength[][] = [];\n for (let i = 0; i < childPartialsLen; i++) {\n const { segmentCount, minLength, partialLengths, unsequencedRecords } = childPartials[i];\n combinedPartialLengths.segmentCount += segmentCount;\n combinedPartialLengths.minLength += minLength;\n childPartialLengths.push(partialLengths);\n if (unsequencedRecords) {\n childUnsequencedPartialLengths.push(unsequencedRecords.partialLengths);\n childOverlapRemoves.push(unsequencedRecords.overlappingRemoves);\n }\n }\n\n combinedPartialLengths.partialLengths.push(...mergePartialLengths(childPartialLengths));\n if (computeLocalPartials) {\n combinedPartialLengths.unsequencedRecords = {\n partialLengths: mergePartialLengths(childUnsequencedPartialLengths),\n overlappingRemoves: Array.from(mergeSortedListsBySeq(childOverlapRemoves)),\n cachedOverlappingByRefSeq: new Map(),\n };\n }\n\n for (const partial of combinedPartialLengths.partialLengths) {\n combinedPartialLengths.addClientSeqNumberFromPartial(partial);\n }\n }\n // TODO: incremental zamboni during build\n if (PartialSequenceLengths.options.zamboni) {\n combinedPartialLengths.zamboni(collabWindow);\n }\n\n if (PartialSequenceLengths.options.verify) {\n verify(combinedPartialLengths);\n }\n\n return combinedPartialLengths;\n }\n\n /**\n * @returns a PartialSequenceLengths structure which tracks only lengths of leaf children of the provided\n * IMergeBlock.\n */\n private static fromLeaves(\n block: IMergeBlock,\n collabWindow: CollaborationWindow,\n computeLocalPartials: boolean,\n ): PartialSequenceLengths {\n const combinedPartialLengths = new PartialSequenceLengths(collabWindow.minSeq, computeLocalPartials);\n combinedPartialLengths.segmentCount = block.childCount;\n\n function seqLTE(seq: number | undefined, minSeq: number) {\n return seq !== undefined && seq !== UnassignedSequenceNumber && seq <= minSeq;\n }\n\n for (let i = 0; i < block.childCount; i++) {\n const child = block.children[i];\n if (child.isLeaf()) {\n // Leaf segment\n const segment = child;\n if (seqLTE(segment.seq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength += segment.cachedLength;\n } else {\n PartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n }\n const removalInfo = toRemovalInfo(segment);\n if (seqLTE(removalInfo?.removedSeq, collabWindow.minSeq)) {\n combinedPartialLengths.minLength -= segment.cachedLength;\n } else if (removalInfo !== undefined) {\n PartialSequenceLengths.insertSegment(\n combinedPartialLengths,\n segment,\n removalInfo);\n }\n }\n }\n // Post-process correctly-ordered partials computing sums and creating\n // lists for each present client id\n const seqPartials = combinedPartialLengths.partialLengths;\n const seqPartialsLen = seqPartials.length;\n\n let prevLen = 0;\n for (let i = 0; i < seqPartialsLen; i++) {\n seqPartials[i].len = prevLen + seqPartials[i].seglen;\n prevLen = seqPartials[i].len;\n combinedPartialLengths.addClientSeqNumberFromPartial(seqPartials[i]);\n }\n prevLen = 0;\n\n if (combinedPartialLengths.unsequencedRecords !== undefined) {\n const localPartials = combinedPartialLengths.unsequencedRecords.partialLengths;\n for (const partial of localPartials) {\n partial.len = prevLen + partial.seglen;\n prevLen = partial.len;\n }\n }\n\n if (PartialSequenceLengths.options.verify) {\n verify(combinedPartialLengths);\n }\n return combinedPartialLengths;\n }\n\n private static getOverlapClients(overlapClientIds: number[], seglen: number) {\n const bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n for (const clientId of overlapClientIds) {\n bst.put(clientId, { clientId, seglen });\n }\n return bst;\n }\n\n private static accumulateRemoveClientOverlap(\n partialLength: PartialSequenceLength,\n overlapRemoveClientIds: number[],\n seglen: number) {\n if (partialLength.overlapRemoveClients) {\n for (const clientId of overlapRemoveClientIds) {\n const overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n if (!overlapClientNode) {\n partialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n } else {\n overlapClientNode.data.seglen += seglen;\n }\n }\n } else {\n partialLength.overlapRemoveClients =\n PartialSequenceLengths.getOverlapClients(overlapRemoveClientIds, seglen);\n }\n }\n\n /**\n * Inserts length information about the insertion of `segment` into `combinedPartialLengths.partialLengths`.\n * Does not update the clientSeqNumbers field to account for this segment.\n * If `removalInfo` is defined, this operation updates the bookkeeping to account for the removal of this\n * segment at the removedSeq instead.\n * When the insertion or removal of the segment is un-acked and `combinedPartialLengths` is meant to compute\n * such records, this does the analogous addition to the bookkeeping for the local segment in\n * `combinedPartialLengths.unsequencedRecords`.\n */\n private static insertSegment(\n combinedPartialLengths: PartialSequenceLengths,\n segment: ISegment,\n removalInfo?: IRemovalInfo) {\n const isLocal = (removalInfo === undefined && segment.seq === UnassignedSequenceNumber)\n || (removalInfo !== undefined && segment.removedSeq === UnassignedSequenceNumber);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq!;\n let segmentLen = segment.cachedLength;\n let clientId = segment.clientId;\n let removeClientOverlap: number[] | undefined;\n\n if (removalInfo) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seqOrLocalSeq = isLocal ? removalInfo.localRemovedSeq! : removalInfo.removedSeq;\n segmentLen = -segmentLen;\n // The client who performed the remove is always stored\n // in the first position of removalInfo.\n clientId = removalInfo.removedClientIds[0];\n const hasOverlap = removalInfo.removedClientIds.length > 1;\n removeClientOverlap = hasOverlap ? removalInfo.removedClientIds : undefined;\n }\n\n const partials = isLocal ?\n combinedPartialLengths.unsequencedRecords?.partialLengths : combinedPartialLengths.partialLengths;\n if (partials === undefined) {\n // Local partial but its computation isn't required\n return;\n }\n const partialsLen = partials.length;\n // Find the first entry with sequence number greater or equal to seq\n let indexFirstGTE = 0;\n for (; indexFirstGTE < partialsLen; indexFirstGTE++) {\n if (partials[indexFirstGTE].seq >= seqOrLocalSeq) {\n break;\n }\n }\n\n let partialLengthEntry: PartialSequenceLength;\n if (partials[indexFirstGTE]?.seq === seqOrLocalSeq) {\n partialLengthEntry = partials[indexFirstGTE];\n // Existing entry at this seq--this occurs for ops that insert/delete more than one segment.\n partialLengthEntry.seglen += segmentLen;\n if (removeClientOverlap) {\n PartialSequenceLengths.accumulateRemoveClientOverlap(\n partials[indexFirstGTE],\n removeClientOverlap,\n segmentLen);\n }\n } else {\n partialLengthEntry = {\n seq: seqOrLocalSeq,\n clientId,\n len: 0,\n seglen: segmentLen,\n overlapRemoveClients: removeClientOverlap\n ? PartialSequenceLengths.getOverlapClients(removeClientOverlap, segmentLen)\n : undefined,\n };\n\n // TODO: investigate performance improvement using BST\n insertIntoList(partials, indexFirstGTE, partialLengthEntry);\n }\n\n const { unsequencedRecords } = combinedPartialLengths;\n if (unsequencedRecords && removeClientOverlap && segment.localRemovedSeq !== undefined) {\n const localSeq = segment.localRemovedSeq;\n const localPartialLengthEntry: LocalPartialSequenceLength = {\n seq: seqOrLocalSeq,\n localSeq,\n clientId,\n len: 0,\n seglen: segmentLen,\n };\n let localIndexFirstGTE = 0;\n for (; localIndexFirstGTE < unsequencedRecords.overlappingRemoves.length; localIndexFirstGTE++) {\n if (unsequencedRecords.overlappingRemoves[localIndexFirstGTE].seq >= seqOrLocalSeq) {\n break;\n }\n }\n\n insertIntoList(unsequencedRecords.overlappingRemoves, localIndexFirstGTE, localPartialLengthEntry);\n\n localIndexFirstGTE = 0;\n for (; localIndexFirstGTE < unsequencedRecords.partialLengths.length; localIndexFirstGTE++) {\n if (unsequencedRecords.partialLengths[localIndexFirstGTE].seq >= localSeq) {\n break;\n }\n }\n\n const tweakedLocalPartialEntry = {\n ...localPartialLengthEntry,\n seq: localSeq,\n };\n\n if (unsequencedRecords.partialLengths[localIndexFirstGTE]?.seq === localSeq) {\n unsequencedRecords.partialLengths[localIndexFirstGTE].seglen += localPartialLengthEntry.seglen;\n } else {\n insertIntoList(unsequencedRecords.partialLengths, localIndexFirstGTE, tweakedLocalPartialEntry);\n }\n }\n }\n\n private static addSeq(partialLengths: PartialSequenceLength[], seq: number, seqSeglen: number, clientId?: number) {\n let seqPartialLen: PartialSequenceLength | undefined;\n let penultPartialLen: PartialSequenceLength | undefined;\n let leqIndex = latestLEQ(partialLengths, seq);\n if (leqIndex >= 0) {\n const pLen = partialLengths[leqIndex];\n if (pLen.seq === seq) {\n seqPartialLen = pLen;\n leqIndex = latestLEQ(partialLengths, seq - 1);\n if (leqIndex >= 0) {\n penultPartialLen = partialLengths[leqIndex];\n }\n } else {\n penultPartialLen = pLen;\n }\n }\n const len = penultPartialLen !== undefined ? penultPartialLen.len + seqSeglen : seqSeglen;\n if (seqPartialLen === undefined) {\n seqPartialLen = {\n clientId,\n len,\n seglen: seqSeglen,\n seq,\n };\n partialLengths.push(seqPartialLen);\n } else {\n seqPartialLen.seglen = seqSeglen;\n seqPartialLen.len = len;\n // Assert client id matches\n }\n }\n\n /**\n * Length of the block this PartialSequenceLength corresponds to when viewed at `minSeq`.\n */\n private minLength = 0;\n\n /**\n * Total number of segments in the subtree rooted at the block this PartialSequenceLength corresponds to.\n */\n private segmentCount = 0;\n\n /**\n * List of PartialSequenceLength objects--ordered by increasing seq--giving length information about\n * the block associated with this PartialSequenceLengths object.\n *\n * `partialLengths[i].len` contains the length of this block considering only sequenced segments with\n * `sequenceNumber <= partialLengths[i].seq`.\n */\n private readonly partialLengths: PartialSequenceLength[] = [];\n\n /**\n * clientSeqNumbers[clientId] is a list of partial lengths for sequenced ops which either:\n * - were submitted by `clientId`.\n * - deleted a range containing segments that were concurrently deleted by `clientId`\n *\n * The second case is referred to as the \"overlapping delete\" case. It is necessary to avoid double-counting\n * the removal of those segments in queries including clientId.\n */\n private readonly clientSeqNumbers: PartialSequenceLength[][] = [];\n\n /**\n * Contains information required to answer queries for the length of this segment from the perspective of\n * the local client but not including all local segments (i.e., `localSeq !== collabWindow.localSeq`).\n * This field is only computed if requested in the constructor (i.e. `computeLocalPartials === true`).\n */\n private unsequencedRecords: UnsequencedPartialLengthInfo | undefined;\n\n constructor(\n /**\n * The minimumSequenceNumber as defined by the collab window used in the last call to `update`,\n * or if no such calls have been made, the one used on construction.\n */\n public minSeq: number,\n computeLocalPartials: boolean) {\n if (computeLocalPartials) {\n this.unsequencedRecords = {\n partialLengths: [],\n overlappingRemoves: [],\n cachedOverlappingByRefSeq: new Map(),\n };\n }\n }\n\n // Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n // with sequence number seq has been added within the sub-tree (and `update` has been called\n // on all descendant PartialSequenceLengths)\n // TODO: assert client id matches\n public update(\n node: IMergeBlock,\n seq: number,\n clientId: number,\n collabWindow: CollaborationWindow) {\n let seqSeglen = 0;\n let segCount = 0;\n // Compute length for seq across children\n for (let i = 0; i < node.childCount; i++) {\n const child = node.children[i];\n if (!child.isLeaf()) {\n const childBlock = child;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const branchPartialLengths = childBlock.partialLengths!;\n const partialLengths = branchPartialLengths.partialLengths;\n const seqIndex = latestLEQ(partialLengths, seq);\n if (seqIndex >= 0) {\n const leqPartial = partialLengths[seqIndex];\n if (leqPartial.seq === seq) {\n seqSeglen += leqPartial.seglen;\n }\n }\n segCount += branchPartialLengths.segmentCount;\n } else {\n const segment = child;\n const removalInfo = toRemovalInfo(segment);\n\n if (segment.seq === seq) {\n if (removalInfo?.removedSeq !== seq) {\n seqSeglen += segment.cachedLength;\n }\n } else {\n if (removalInfo?.removedSeq === seq) {\n seqSeglen -= segment.cachedLength;\n }\n }\n segCount++;\n }\n }\n this.segmentCount = segCount;\n this.unsequencedRecords = undefined;\n\n PartialSequenceLengths.addSeq(this.partialLengths, seq, seqSeglen, clientId);\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n PartialSequenceLengths.addSeq(this.clientSeqNumbers[clientId], seq, seqSeglen);\n if (PartialSequenceLengths.options.zamboni) {\n this.zamboni(collabWindow);\n }\n if (PartialSequenceLengths.options.verify) {\n verify(this);\n }\n }\n\n /**\n * Returns the length of this block as viewed from the perspective of `clientId` at `refSeq`.\n * This is the total length of all segments sequenced at or before refSeq OR submitted by `clientId`.\n * If `clientId` is the local client, `localSeq` can also be provided. In that case, it is the total\n * length of all segments submitted at or before `refSeq` in addition to any local, unacked segments\n * with `segment.localSeq <= localSeq`.\n *\n * Note: the local case (where `localSeq !== undefined`) is only supported on a PartialSequenceLength object\n * constructed with `computeLocalPartials` set to true and not subsequently updated with `update`.\n */\n public getPartialLength(refSeq: number, clientId: number, localSeq?: number) {\n let pLen = this.minLength;\n const seqIndex = latestLEQ(this.partialLengths, refSeq);\n const cliLatestIndex = this.cliLatest(clientId);\n const cliSeq = this.clientSeqNumbers[clientId];\n if (seqIndex >= 0) {\n pLen += this.partialLengths[seqIndex].len;\n }\n\n if (localSeq === undefined) {\n if (cliLatestIndex >= 0) {\n const cliLatest = cliSeq[cliLatestIndex];\n if (cliLatest.seq > refSeq) {\n // The client has local edits after refSeq, add in the length adjustments\n pLen += cliLatest.len;\n const precedingCliIndex = this.cliLatestLEQ(clientId, refSeq);\n if (precedingCliIndex >= 0) {\n // Subtract out double-counted lengths: segments still in the collab window but before\n // the refSeq submitted by the client we're querying for were counted in each addition above.\n pLen -= cliSeq[precedingCliIndex].len;\n }\n }\n }\n } else {\n assert(this.unsequencedRecords !== undefined,\n 0x39f /* Local getPartialLength invoked without computing local partials. */);\n const unsequencedPartialLengths = this.unsequencedRecords.partialLengths;\n // Local segments at or before localSeq should also be included\n const localIndex = latestLEQ(unsequencedPartialLengths, localSeq);\n if (localIndex >= 0) {\n pLen += unsequencedPartialLengths[localIndex].len;\n\n // Lastly, we must subtract out any double-counted removes, which occur if a currently un-acked local\n // remove overlaps with a remote client's remove that occurred at sequence number <=refSeq.\n pLen -= this.computeOverlappingLocalRemoves(refSeq, localSeq);\n }\n }\n return pLen;\n }\n\n /**\n * Computes the seglen for the double-counted removed overlap at (refSeq, localSeq). This logic is equivalent\n * to the following:\n *\n * ```typescript\n * let total = 0;\n * for (const partialLength of this.unsequencedRecords!.overlappingRemoves) {\n * if (partialLength.seq > refSeq) {\n * break;\n * }\n *\n * if (partialLength.localSeq <= localSeq) {\n * total += partialLength.seglen;\n * }\n * }\n *\n * return total;\n * ```\n *\n * Reconnect happens to only need to compute these lengths for two refSeq values: before and\n * after the rebase. Since these lists potentially scale with O(collab window * number of local edits)\n * and potentially need to be queried for each local op that gets rebased,\n * we cache the results for a given refSeq in `this.unsequencedRecords.cachedOverlappingByRefSeq` so\n * that they can be binary-searched the same way the usual partialLengths lists are.\n */\n private computeOverlappingLocalRemoves(refSeq: number, localSeq: number): number {\n if (this.unsequencedRecords === undefined) {\n return 0;\n }\n\n let cachedOverlapPartials = this.unsequencedRecords.cachedOverlappingByRefSeq.get(refSeq);\n if (!cachedOverlapPartials) {\n const partials: PartialSequenceLength[] = [];\n for (const partial of this.unsequencedRecords.overlappingRemoves) {\n if (partial.seq > refSeq) {\n break;\n }\n\n partials.push({ ...partial, seq: partial.localSeq, len: 0 });\n }\n partials.sort((a, b) => a.seq - b.seq);\n // This coalesces entries with the same localSeq as well as computes overall lengths.\n cachedOverlapPartials = mergePartialLengths([partials]);\n this.unsequencedRecords.cachedOverlappingByRefSeq.set(refSeq, cachedOverlapPartials);\n }\n\n const overlapIndex = latestLEQ(cachedOverlapPartials, localSeq);\n return overlapIndex >= 0 ? cachedOverlapPartials[overlapIndex].len : 0;\n }\n\n public toString(glc?: (id: number) => string, indentCount = 0) {\n let buf = \"\";\n for (const partial of this.partialLengths) {\n buf += `(${partial.seq},${partial.len}) `;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n if (this.clientSeqNumbers[clientId].length > 0) {\n buf += `Client `;\n buf += glc ? `${glc(+clientId)}` : `${clientId}`;\n buf += \"[\";\n for (const partial of this.clientSeqNumbers[clientId]) {\n buf += `(${partial.seq},${partial.len})`;\n }\n buf += \"]\";\n }\n }\n buf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n return buf;\n }\n\n // Clear away partial sums for sequence numbers earlier than the current window\n private zamboni(segmentWindow: CollaborationWindow) {\n function copyDown(partialLengths: PartialSequenceLength[]) {\n const mindex = latestLEQ(partialLengths, segmentWindow.minSeq);\n let minLength = 0;\n if (mindex >= 0) {\n minLength = partialLengths[mindex].len;\n const seqCount = partialLengths.length;\n if (mindex <= (seqCount - 1)) {\n // Still some entries remaining\n const remainingCount = (seqCount - mindex) - 1;\n // Copy down\n for (let i = 0; i < remainingCount; i++) {\n partialLengths[i] = partialLengths[i + mindex + 1];\n partialLengths[i].len -= minLength;\n }\n partialLengths.length = remainingCount;\n }\n }\n return minLength;\n }\n this.minLength += copyDown(this.partialLengths);\n this.minSeq = segmentWindow.minSeq;\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n for (const clientId in this.clientSeqNumbers) {\n const cliPartials = this.clientSeqNumbers[clientId];\n if (cliPartials) {\n copyDown(cliPartials);\n }\n }\n }\n\n private addClientSeqNumber(clientId: number, seq: number, seglen: number) {\n if (this.clientSeqNumbers[clientId] === undefined) {\n this.clientSeqNumbers[clientId] = [];\n }\n const cli = this.clientSeqNumbers[clientId];\n let pLen = seglen;\n if (cli.length > 0) {\n pLen += cli[cli.length - 1].len;\n }\n cli.push({ seq, len: pLen, seglen });\n }\n\n // Assumes sequence number already coalesced and that this is called in increasing `seq` order.\n private addClientSeqNumberFromPartial(partialLength: PartialSequenceLength) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.addClientSeqNumber(partialLength.clientId!, partialLength.seq, partialLength.seglen);\n if (partialLength.overlapRemoveClients) {\n partialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n // Original client entry was handled above\n if (partialLength.clientId !== oc.data.clientId) {\n this.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n }\n return true;\n });\n }\n }\n\n private cliLatestLEQ(clientId: number, refSeq: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n return cliSeqs ? latestLEQ(cliSeqs, refSeq) : -1;\n }\n\n private cliLatest(clientId: number) {\n const cliSeqs = this.clientSeqNumbers[clientId];\n return cliSeqs && (cliSeqs.length > 0) ? cliSeqs.length - 1 : -1;\n }\n}\n\n/* eslint-disable @typescript-eslint/dot-notation */\nfunction verifyPartialLengths(\n partialSeqLengths: PartialSequenceLengths,\n partialLengths: PartialSequenceLength[],\n clientPartials: boolean,\n) {\n if (partialLengths.length === 0) { return 0; }\n\n let lastSeqNum = 0;\n let accumSegLen = 0;\n let count = 0;\n\n for (const partialLength of partialLengths) {\n // Count total number of partial length\n count++;\n\n // Sequence number should be larger or equal to minseq\n assert(partialSeqLengths.minSeq <= partialLength.seq, 0x054 /* \"Sequence number less than minSeq!\" */);\n\n // Sequence number should be sorted\n assert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n lastSeqNum = partialLength.seq;\n\n // Len is a accumulation of all the seglen adjustments\n accumSegLen += partialLength.seglen;\n if (accumSegLen !== partialLength.len) {\n assert(false, 0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */);\n }\n\n if (clientPartials) {\n // Client partials used to track local edits so we can account for them some refSeq.\n // But the information we keep track of are since minSeq, so we keep track of more history\n // then needed, and some of them doesn't make sense to be used for length calculations\n // e.g. if you have this sequence, where the minSeq is #5 because of other clients\n // seq 10: client 1: insert seg #1\n // seq 11: client 2: delete seg #2 refseq: 10\n // minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n // So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n // However, that combination is invalid, since we should never see any ops with refseq < 10 for\n // client 2 after seq 11.\n } else {\n // Len adjustment should not make length negative\n if (partialSeqLengths[\"minLength\"] + partialLength.len < 0) {\n assert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n }\n }\n\n if (partialLength.overlapRemoveClients) {\n // Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n assert(!clientPartials, 0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */);\n\n // Each overlap client count as one, but the first remove to sequence was already counted.\n // (this aligns with the logic to omit the removing client in `addClientSeqNumberFromPartial`)\n count += partialLength.overlapRemoveClients.size() - 1;\n }\n }\n return count;\n}\n\nfunction verify(partialSeqLengths: PartialSequenceLengths) {\n if (partialSeqLengths[\"clientSeqNumbers\"]) {\n let cliCount = 0;\n for (const cliSeq of partialSeqLengths[\"clientSeqNumbers\"]) {\n if (cliSeq) {\n cliCount += verifyPartialLengths(partialSeqLengths, cliSeq, true);\n }\n }\n\n // If we have client view, we should have the flat view\n assert(!!partialSeqLengths[\"partialLengths\"], 0x059 /* \"Client view exists but flat view does not!\" */);\n const flatCount = verifyPartialLengths(partialSeqLengths, partialSeqLengths[\"partialLengths\"], false);\n\n // The number of partial lengths on the client view and flat view should be the same\n assert(flatCount === cliCount,\n 0x05a /* \"Mismatch between number of partial lengths on client and flat views!\" */);\n } else {\n // If we don't have a client view, we shouldn't have the flat view either\n assert(!partialSeqLengths[\"partialLengths\"], 0x05b /* \"Flat view exists but client view does not!\" */);\n }\n}\n/* eslint-enable @typescript-eslint/dot-notation */\n\n/**\n * Clones an `overlapRemoveClients` red-black tree.\n */\nfunction cloneOverlapRemoveClients(\n oldTree: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n if (!oldTree) { return undefined; }\n const newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n oldTree.map((bProp: Property<number, IOverlapClient>) => {\n newTree.put(bProp.data.clientId, { ...bProp.data });\n return true;\n });\n return newTree;\n}\n\n/**\n * Combines the `overlapRemoveClients` field of two `PartialSequenceLength` objects,\n * modifying the first PartialSequenceLength's bookkeeping in-place.\n *\n * Combination is performed additively on `seglen` on a per-client basis.\n */\nfunction combineOverlapClients(a: PartialSequenceLength, b: PartialSequenceLength) {\n const overlapRemoveClientsA = a.overlapRemoveClients;\n if (overlapRemoveClientsA) {\n if (b.overlapRemoveClients) {\n b.overlapRemoveClients.map((bProp: Property<number, IOverlapClient>) => {\n const aProp = overlapRemoveClientsA.get(bProp.key);\n if (aProp) {\n aProp.data.seglen += bProp.data.seglen;\n } else {\n overlapRemoveClientsA.put(bProp.data.clientId, { ...bProp.data });\n }\n return true;\n });\n }\n } else {\n a.overlapRemoveClients = cloneOverlapRemoveClients(b.overlapRemoveClients);\n }\n}\n\n/**\n * Given a number of seq-sorted `partialLength` lists, merges them into a combined seq-sorted `partialLength`\n * list. This merge includes coalescing `PartialSequenceLength` entries at the same seq.\n *\n * Ex: merging the following two lists (some information omitted on each PartialSequenceLength):\n * ```typescript\n * [{ seq: 1, seglen: 5 }, { seq: 3, seglen: -1 }]\n * [{ seq: 1, seglen: -3 }, { seq: 2: seglen: 4 }]\n * ```\n * would produce\n * ```typescript\n * [{ seq: 1, seglen: 2 }, { seq: 2, seglen: 4 }, { seq: 3, seglen: -1 }]\n * ```\n */\nfunction mergePartialLengths<T extends PartialSequenceLength>(childPartialLengths: T[][]): T[] {\n const mergedLengths: T[] = [];\n // All child PartialSequenceLengths are now sorted temporally (i.e. by seq). Since\n // a given MergeTree operation can affect multiple segments, there may be multiple entries\n // for a given seq. We run through them in order, coalescing all length information for a given\n // seq together into `combinedPartialLengths`.\n let currentPartial: T | undefined;\n for (const partialLength of mergeSortedListsBySeq(childPartialLengths)) {\n if (!currentPartial || currentPartial.seq !== partialLength.seq) {\n // Start a new seq entry.\n currentPartial = {\n ...partialLength,\n len: (currentPartial?.len ?? 0) + partialLength.seglen,\n overlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n };\n mergedLengths.push(currentPartial);\n } else {\n // Update existing entry\n currentPartial.seglen += partialLength.seglen;\n currentPartial.len += partialLength.seglen;\n combineOverlapClients(currentPartial, partialLength);\n }\n }\n return mergedLengths;\n}\n\n/**\n * Given a collection of PartialSequenceLength lists--each sorted by sequence number--returns an iterable that yields\n * each PartialSequenceLength in sequence order.\n *\n * This is equivalent to flattening the input list and sorting it by sequence number. If the number of lists to merge is\n * a constant, however, this approach is advantageous asymptotically.\n */\nfunction mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): Iterable<T> {\n class PartialSequenceLengthIterator {\n /**\n * nextSmallestIndex[i] is the next element of sublists[i] to check.\n * In other words, the iterator has already yielded elements of sublists[i] *up through*\n * sublists[i][nextSmallestIndex[i] - 1].\n */\n private readonly nextSmallestIndex: number[];\n\n constructor(private readonly sublists: T[][]) {\n this.nextSmallestIndex = new Array(sublists.length);\n for (let i = 0; i < sublists.length; i++) {\n this.nextSmallestIndex[i] = 0;\n }\n }\n\n public next(): { value: T; done: false; } | { value: undefined; done: true; } {\n const len = this.sublists.length;\n let currentMin: T | undefined;\n let currentMinIndex: number | undefined;\n for (let i = 0; i < len; i++) {\n const candidateIndex = this.nextSmallestIndex[i];\n if (candidateIndex < this.sublists[i].length) {\n const candidate = this.sublists[i][candidateIndex];\n if (!currentMin || candidate.seq < currentMin.seq) {\n currentMin = candidate;\n currentMinIndex = i;\n }\n }\n }\n\n if (currentMin) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.nextSmallestIndex[currentMinIndex!]++;\n return { value: currentMin, done: false };\n } else {\n return { value: undefined, done: true };\n }\n }\n }\n\n return { [Symbol.iterator]: () => new PartialSequenceLengthIterator(lists) };\n}\n\nfunction insertIntoList<T>(list: T[], index: number, elem: T): void {\n if (index < list.length) {\n for (let k = list.length; k > index; k--) {\n list[k] = list[k - 1];\n }\n list[index] = elem;\n } else {\n list.push(elem);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACtB;AAKD,oBAAY,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,OAwClG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WAiCrF;AAED,wBAAgB,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EACjC,WAAW,CAAC,EAAE,YAAY,EAC1B,GAAG,CAAC,EAAE,MAAM,cAmBf;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,eAQf;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAGD,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACtB;AAKD,oBAAY,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,OAwClG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC,EAAE,WAAW,GAAG,SAAS,WAkCrF;AAED,wBAAgB,MAAM,CAAC,CAAC,EACpB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EACjC,WAAW,CAAC,EAAE,YAAY,EAC1B,GAAG,CAAC,EAAE,MAAM,cAmBf;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,0BAazD;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,eAQf;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,cAUvF;AAGD,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.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 { ICombiningOp } from \"./ops\";\n\nexport interface MapLike<T> {\n [index: string]: T;\n}\n\n// We use any because when you include custom methods\n// such as toJSON(), JSON.stringify accepts most types other\n// than functions\nexport type PropertySet = MapLike<any>;\n\n// Assume these are created with Object.create(null)\n\nexport interface IConsensusValue {\n seq: number;\n value: any;\n}\n\nexport function combine(combiningInfo: ICombiningOp, currentValue: any, newValue: any, seq?: number) {\n let _currentValue = currentValue;\n\n if (_currentValue === undefined) {\n _currentValue = combiningInfo.defaultValue;\n }\n // Fixed set of operations for now\n\n switch (combiningInfo.name) {\n case \"incr\":\n _currentValue += newValue as number;\n if (combiningInfo.minValue) {\n if (_currentValue < combiningInfo.minValue) {\n _currentValue = combiningInfo.minValue;\n }\n }\n break;\n case \"consensus\":\n if (_currentValue === undefined) {\n const cv: IConsensusValue = {\n value: newValue,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq: seq!,\n };\n\n _currentValue = cv;\n } else {\n const cv = _currentValue as IConsensusValue;\n if (cv.seq === -1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n cv.seq = seq!;\n }\n }\n break;\n default:\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return _currentValue;\n}\n\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n if (a) {\n if (!b) {\n return false;\n } else {\n // For now, straightforward; later use hashing\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in a) {\n if (b[key] === undefined) {\n return false;\n } else if (typeof b[key] === \"object\") {\n if (!matchProperties(a[key], b[key])) {\n return false;\n }\n } else if (b[key] !== a[key]) {\n return false;\n }\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in b) {\n if (a[key] === undefined) {\n return false;\n }\n }\n }\n } else {\n if (b) {\n return false;\n }\n }\n return true;\n}\n\nexport function extend<T>(\n base: MapLike<T>,\n extension: MapLike<T> | undefined,\n combiningOp?: ICombiningOp,\n seq?: number,\n) {\n if (extension !== undefined) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete base[key];\n } else {\n if (combiningOp && (combiningOp.name !== \"rewrite\")) {\n base[key] = combine(combiningOp, base[key], v, seq);\n } else {\n base[key] = v;\n }\n }\n }\n }\n return base;\n}\n\nexport function clone<T>(extension: MapLike<T> | undefined) {\n if (extension === undefined) {\n return undefined;\n }\n const cloneMap = createMap<T>();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v !== null) {\n cloneMap[key] = v;\n }\n }\n return cloneMap;\n}\n\nexport function addProperties(\n oldProps: PropertySet | undefined,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n) {\n let _oldProps = oldProps;\n if ((!_oldProps) || (op && (op.name === \"rewrite\"))) {\n _oldProps = createMap<any>();\n }\n extend(_oldProps, newProps, op, seq);\n return _oldProps;\n}\n\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n if (extension !== undefined) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in extension) {\n if (base[key] === undefined) {\n base[key] = extension[key];\n }\n }\n }\n return base;\n}\n\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n return Object.create(null) as MapLike<T>;\n}\n"]}
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.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 { ICombiningOp } from \"./ops\";\n\nexport interface MapLike<T> {\n [index: string]: T;\n}\n\n// We use any because when you include custom methods\n// such as toJSON(), JSON.stringify accepts most types other\n// than functions\nexport type PropertySet = MapLike<any>;\n\n// Assume these are created with Object.create(null)\n\nexport interface IConsensusValue {\n seq: number;\n value: any;\n}\n\nexport function combine(combiningInfo: ICombiningOp, currentValue: any, newValue: any, seq?: number) {\n let _currentValue = currentValue;\n\n if (_currentValue === undefined) {\n _currentValue = combiningInfo.defaultValue;\n }\n // Fixed set of operations for now\n\n switch (combiningInfo.name) {\n case \"incr\":\n _currentValue += newValue as number;\n if (combiningInfo.minValue) {\n if (_currentValue < combiningInfo.minValue) {\n _currentValue = combiningInfo.minValue;\n }\n }\n break;\n case \"consensus\":\n if (_currentValue === undefined) {\n const cv: IConsensusValue = {\n value: newValue,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n seq: seq!,\n };\n\n _currentValue = cv;\n } else {\n const cv = _currentValue as IConsensusValue;\n if (cv.seq === -1) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n cv.seq = seq!;\n }\n }\n break;\n default:\n break;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return _currentValue;\n}\n\nexport function matchProperties(a: PropertySet | undefined, b: PropertySet | undefined) {\n if (a) {\n if (!b) {\n return false;\n } else {\n // For now, straightforward; later use hashing\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in a) {\n if (b[key] === undefined) {\n return false;\n } else if (typeof b[key] === \"object\") {\n if (!matchProperties(a[key], b[key])) {\n return false;\n }\n } else if (b[key] !== a[key]) {\n return false;\n }\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in b) {\n if (a[key] === undefined) {\n return false;\n }\n }\n }\n } else {\n if (b) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function extend<T>(\n base: MapLike<T>,\n extension: MapLike<T> | undefined,\n combiningOp?: ICombiningOp,\n seq?: number,\n) {\n if (extension !== undefined) {\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete base[key];\n } else {\n if (combiningOp && (combiningOp.name !== \"rewrite\")) {\n base[key] = combine(combiningOp, base[key], v, seq);\n } else {\n base[key] = v;\n }\n }\n }\n }\n return base;\n}\n\nexport function clone<T>(extension: MapLike<T> | undefined) {\n if (extension === undefined) {\n return undefined;\n }\n const cloneMap = createMap<T>();\n // eslint-disable-next-line guard-for-in, no-restricted-syntax\n for (const key in extension) {\n const v = extension[key];\n if (v !== null) {\n cloneMap[key] = v;\n }\n }\n return cloneMap;\n}\n\nexport function addProperties(\n oldProps: PropertySet | undefined,\n newProps: PropertySet,\n op?: ICombiningOp,\n seq?: number,\n) {\n let _oldProps = oldProps;\n if ((!_oldProps) || (op && (op.name === \"rewrite\"))) {\n _oldProps = createMap<any>();\n }\n extend(_oldProps, newProps, op, seq);\n return _oldProps;\n}\n\nexport function extendIfUndefined<T>(base: MapLike<T>, extension: MapLike<T> | undefined) {\n if (extension !== undefined) {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in extension) {\n if (base[key] === undefined) {\n base[key] = extension[key];\n }\n }\n }\n return base;\n}\n\n// Create a MapLike with good performance.\nexport function createMap<T>(): MapLike<T> {\n return Object.create(null) as MapLike<T>;\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { Stack } from "./collections";
6
- import { ISegment } from "./mergeTree";
6
+ import { ISegment } from "./mergeTreeNodes";
7
7
  import { ReferenceType, ICombiningOp } from "./ops";
8
8
  import { PropertySet, MapLike } from "./properties";
9
9
  export declare const reservedTileLabelsKey = "referenceTileLabels";
@@ -21,32 +21,12 @@ export interface ReferencePosition {
21
21
  getSegment(): ISegment | undefined;
22
22
  getOffset(): number;
23
23
  addProperties(newProps: PropertySet, op?: ICombiningOp): void;
24
- isLeaf(): boolean;
25
- /**
26
- * @deprecated - use refHasTileLabels
27
- */
28
- hasTileLabels(): boolean;
29
- /**
30
- * @deprecated - use refHasRangeLabels
31
- */
32
- hasRangeLabels(): boolean;
33
- /**
34
- * @deprecated - use refHasTileLabel
35
- */
36
- hasTileLabel(label: string): boolean;
37
- /**
38
- * @deprecated - use refHasRangeLabel
39
- */
40
- hasRangeLabel(label: string): boolean;
41
- /**
42
- * @deprecated - use refGetTileLabels
43
- */
44
- getTileLabels(): string[] | undefined;
45
- /**
46
- * @deprecated - use refGetRangeLabels
47
- */
48
- getRangeLabels(): string[] | undefined;
24
+ isLeaf(): this is ISegment;
49
25
  }
26
+ /**
27
+ * @deprecated for internal use only. public export will be removed.
28
+ * @internal
29
+ */
50
30
  export declare type RangeStackMap = MapLike<Stack<ReferencePosition>>;
51
31
  export declare const DetachedReferencePosition = -1;
52
32
  export declare function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T;
@@ -1 +1 @@
1
- {"version":3,"file":"referencePositions.d.ts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAIlH;AAED,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAEuB,CAAC;AAEhG,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUlF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IAEvB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9D,MAAM,IAAI,OAAO,CAAC;IAElB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC;IACzB;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC;IAC1B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1C;AAED,oBAAY,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAM/E;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAc5F"}
1
+ {"version":3,"file":"referencePositions.d.ts","sourceRoot":"","sources":["../src/referencePositions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAIlH;AAED,eAAO,MAAM,gBAAgB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAEuB,CAAC;AAEhG,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,KAAG,MAAM,EAAE,GAAG,SAGuB,CAAC;AAEjG,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUjF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAUlF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEnE;AACD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IAEvB,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9D,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC;CAC9B;AAED;;;GAGG;AACH,oBAAY,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAE9D,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAE/E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAE/E;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAQ5F"}
@@ -46,20 +46,10 @@ export function refHasRangeLabels(refPos) {
46
46
  }
47
47
  export const DetachedReferencePosition = -1;
48
48
  export function minReferencePosition(a, b) {
49
- if (compareReferencePositions(a, b) < 0) {
50
- return a;
51
- }
52
- else {
53
- return b;
54
- }
49
+ return compareReferencePositions(a, b) < 0 ? a : b;
55
50
  }
56
51
  export function maxReferencePosition(a, b) {
57
- if (compareReferencePositions(a, b) > 0) {
58
- return a;
59
- }
60
- else {
61
- return b;
62
- }
52
+ return compareReferencePositions(a, b) > 0 ? a : b;
63
53
  }
64
54
  export function compareReferencePositions(a, b) {
65
55
  const aSeg = a.getSegment();
@@ -68,14 +58,7 @@ export function compareReferencePositions(a, b) {
68
58
  return a.getOffset() - b.getOffset();
69
59
  }
70
60
  else {
71
- if (aSeg === undefined
72
- || (bSeg !== undefined &&
73
- aSeg.ordinal < bSeg.ordinal)) {
74
- return -1;
75
- }
76
- else {
77
- return 1;
78
- }
61
+ return aSeg === undefined || (bSeg !== undefined && aSeg.ordinal < bSeg.ordinal) ? -1 : 1;
79
62
  }
80
63
  }
81
64
  //# sourceMappingURL=referencePositions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"referencePositions.js","sourceRoot":"","sources":["../src/referencePositions.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 { Stack } from \"./collections\";\nimport { ISegment } from \"./mergeTree\";\nimport { ReferenceType, ICombiningOp } from \"./ops\";\nimport { PropertySet, MapLike } from \"./properties\";\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\nexport function refTypeIncludesFlag(refPosOrType: ReferencePosition | ReferenceType, flags: ReferenceType): boolean {\n const refType = typeof refPosOrType === \"number\" ? refPosOrType : refPosOrType.refType;\n // eslint-disable-next-line no-bitwise\n return (refType & flags) !== 0;\n}\n\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n refTypeIncludesFlag(refPos, ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n const tileLabels = refGetTileLabels(refPos);\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string): boolean {\n const rangeLabels = refGetRangeLabels(refPos);\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n return refGetTileLabels(refPos) !== undefined;\n}\nexport function refHasRangeLabels(refPos: ReferencePosition): boolean {\n return refGetRangeLabels(refPos) !== undefined;\n}\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n isLeaf(): boolean;\n\n /**\n * @deprecated - use refHasTileLabels\n */\n hasTileLabels(): boolean;\n /**\n * @deprecated - use refHasRangeLabels\n */\n hasRangeLabels(): boolean;\n /**\n * @deprecated - use refHasTileLabel\n */\n hasTileLabel(label: string): boolean;\n /**\n * @deprecated - use refHasRangeLabel\n */\n hasRangeLabel(label: string): boolean;\n /**\n * @deprecated - use refGetTileLabels\n */\n getTileLabels(): string[] | undefined;\n /**\n * @deprecated - use refGetRangeLabels\n */\n getRangeLabels(): string[] | undefined;\n}\n\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\nexport const DetachedReferencePosition = -1;\n\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) < 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n if (compareReferencePositions(a, b) > 0) {\n return a;\n } else {\n return b;\n }\n}\n\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n const aSeg = a.getSegment();\n const bSeg = b.getSegment();\n if (aSeg === bSeg) {\n return a.getOffset() - b.getOffset();\n } else {\n if (aSeg === undefined\n || (bSeg !== undefined &&\n aSeg.ordinal < bSeg.ordinal)) {\n return -1;\n } else {\n return 1;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"referencePositions.js","sourceRoot":"","sources":["../src/referencePositions.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 { Stack } from \"./collections\";\nimport { ISegment } from \"./mergeTreeNodes\";\nimport { ReferenceType, ICombiningOp } from \"./ops\";\nimport { PropertySet, MapLike } from \"./properties\";\n\nexport const reservedTileLabelsKey = \"referenceTileLabels\";\nexport const reservedRangeLabelsKey = \"referenceRangeLabels\";\n\nexport function refTypeIncludesFlag(refPosOrType: ReferencePosition | ReferenceType, flags: ReferenceType): boolean {\n const refType = typeof refPosOrType === \"number\" ? refPosOrType : refPosOrType.refType;\n // eslint-disable-next-line no-bitwise\n return (refType & flags) !== 0;\n}\n\nexport const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>\n refTypeIncludesFlag(refPos, ReferenceType.Tile)\n && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;\n\nexport const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>\n // eslint-disable-next-line no-bitwise\n (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))\n && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;\n\nexport function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {\n const tileLabels = refGetTileLabels(refPos);\n if (tileLabels) {\n for (const refLabel of tileLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function refHasRangeLabel(refPos: ReferencePosition, label: string): boolean {\n const rangeLabels = refGetRangeLabels(refPos);\n if (rangeLabels) {\n for (const refLabel of rangeLabels) {\n if (label === refLabel) {\n return true;\n }\n }\n }\n return false;\n}\nexport function refHasTileLabels(refPos: ReferencePosition): boolean {\n return refGetTileLabels(refPos) !== undefined;\n}\nexport function refHasRangeLabels(refPos: ReferencePosition): boolean {\n return refGetRangeLabels(refPos) !== undefined;\n}\n\nexport interface ReferencePosition {\n properties?: PropertySet;\n refType: ReferenceType;\n\n getSegment(): ISegment | undefined;\n getOffset(): number;\n addProperties(newProps: PropertySet, op?: ICombiningOp): void;\n isLeaf(): this is ISegment;\n}\n\n/**\n * @deprecated for internal use only. public export will be removed.\n * @internal\n */\nexport type RangeStackMap = MapLike<Stack<ReferencePosition>>;\n\nexport const DetachedReferencePosition = -1;\n\nexport function minReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n return compareReferencePositions(a, b) < 0 ? a : b;\n}\n\nexport function maxReferencePosition<T extends ReferencePosition>(a: T, b: T): T {\n return compareReferencePositions(a, b) > 0 ? a : b;\n}\n\nexport function compareReferencePositions(a: ReferencePosition, b: ReferencePosition): number {\n const aSeg = a.getSegment();\n const bSeg = b.getSegment();\n if (aSeg === bSeg) {\n return a.getOffset() - b.getOffset();\n } else {\n return aSeg === undefined || (bSeg !== undefined && aSeg.ordinal < bSeg.ordinal) ? -1 : 1;\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { ISegment, SegmentGroup } from "./mergeTree";
5
+ import { ISegment, SegmentGroup } from "./mergeTreeNodes";
6
6
  export declare class SegmentGroupCollection {
7
7
  private readonly segment;
8
8
  private readonly segmentGroups;
@@ -11,7 +11,9 @@ export declare class SegmentGroupCollection {
11
11
  get empty(): boolean;
12
12
  enqueue(segmentGroup: SegmentGroup): void;
13
13
  dequeue(): SegmentGroup | undefined;
14
+ pop?(): SegmentGroup | undefined;
14
15
  clear(): void;
15
16
  copyTo(segment: ISegment): void;
17
+ private enqueueOnCopy;
16
18
  }
17
19
  //# sourceMappingURL=segmentGroupCollection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"segmentGroupCollection.d.ts","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErD,qBAAa,sBAAsB;IAGnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEtB,OAAO,EAAE,QAAQ;IAI9C,IAAW,IAAI,WAEd;IAED,IAAW,KAAK,YAEf;IAEM,OAAO,CAAC,YAAY,EAAE,YAAY;IAKlC,OAAO,IAAI,YAAY,GAAG,SAAS;IAInC,KAAK;IAIL,MAAM,CAAC,OAAO,EAAE,QAAQ;CAGlC"}
1
+ {"version":3,"file":"segmentGroupCollection.d.ts","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,qBAAa,sBAAsB;IAGnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEtB,OAAO,EAAE,QAAQ;IAI9C,IAAW,IAAI,WAEd;IAED,IAAW,KAAK,YAEf;IAEM,OAAO,CAAC,YAAY,EAAE,YAAY;IAKlC,OAAO,IAAI,YAAY,GAAG,SAAS;IAInC,GAAG,CAAC,IAAI,YAAY,GAAG,SAAS;IAIhC,KAAK;IAIL,MAAM,CAAC,OAAO,EAAE,QAAQ;IAI/B,OAAO,CAAC,aAAa;CAUxB"}
@@ -21,11 +21,24 @@ export class SegmentGroupCollection {
21
21
  dequeue() {
22
22
  return this.segmentGroups.dequeue();
23
23
  }
24
+ pop() {
25
+ return this.segmentGroups.pop ? this.segmentGroups.pop() : undefined;
26
+ }
24
27
  clear() {
25
28
  this.segmentGroups.clear();
26
29
  }
27
30
  copyTo(segment) {
28
- this.segmentGroups.walk((sg) => segment.segmentGroups.enqueue(sg));
31
+ this.segmentGroups.walk((sg) => segment.segmentGroups.enqueueOnCopy(sg, this.segment));
32
+ }
33
+ enqueueOnCopy(segmentGroup, sourceSegment) {
34
+ this.enqueue(segmentGroup);
35
+ if (segmentGroup.previousProps) {
36
+ // duplicate the previousProps for this segment
37
+ const index = segmentGroup.segments.indexOf(sourceSegment);
38
+ if (index !== -1) {
39
+ segmentGroup.previousProps.push(segmentGroup.previousProps[index]);
40
+ }
41
+ }
29
42
  }
30
43
  }
31
44
  //# sourceMappingURL=segmentGroupCollection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"segmentGroupCollection.js","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,YAAY,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,OAAO,sBAAsB;IAG/B,YAA6B,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QAC1C,IAAI,CAAC,aAAa,GAAG,YAAY,EAAgB,CAAC;IACtD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,OAAO,CAAC,YAA0B;QACrC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { List, ListMakeHead } from \"./collections\";\nimport { ISegment, SegmentGroup } from \"./mergeTree\";\n\nexport class SegmentGroupCollection {\n private readonly segmentGroups: List<SegmentGroup>;\n\n constructor(private readonly segment: ISegment) {\n this.segmentGroups = ListMakeHead<SegmentGroup>();\n }\n\n public get size() {\n return this.segmentGroups.count();\n }\n\n public get empty() {\n return this.segmentGroups.empty();\n }\n\n public enqueue(segmentGroup: SegmentGroup) {\n this.segmentGroups.enqueue(segmentGroup);\n segmentGroup.segments.push(this.segment);\n }\n\n public dequeue(): SegmentGroup | undefined {\n return this.segmentGroups.dequeue();\n }\n\n public clear() {\n this.segmentGroups.clear();\n }\n\n public copyTo(segment: ISegment) {\n this.segmentGroups.walk((sg) => segment.segmentGroups.enqueue(sg));\n }\n}\n"]}
1
+ {"version":3,"file":"segmentGroupCollection.js","sourceRoot":"","sources":["../src/segmentGroupCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,YAAY,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,OAAO,sBAAsB;IAG/B,YAA6B,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QAC1C,IAAI,CAAC,aAAa,GAAG,YAAY,EAAgB,CAAC;IACtD,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,OAAO,CAAC,YAA0B;QACrC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAEM,GAAG;QACN,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,OAAiB;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3F,CAAC;IAEO,aAAa,CAAC,YAA0B,EAAE,aAAuB;QACrE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,YAAY,CAAC,aAAa,EAAE;YAC5B,+CAA+C;YAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBACd,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;aACtE;SACJ;IACL,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { List, ListMakeHead } from \"./collections\";\nimport { ISegment, SegmentGroup } from \"./mergeTreeNodes\";\n\nexport class SegmentGroupCollection {\n private readonly segmentGroups: List<SegmentGroup>;\n\n constructor(private readonly segment: ISegment) {\n this.segmentGroups = ListMakeHead<SegmentGroup>();\n }\n\n public get size() {\n return this.segmentGroups.count();\n }\n\n public get empty() {\n return this.segmentGroups.empty();\n }\n\n public enqueue(segmentGroup: SegmentGroup) {\n this.segmentGroups.enqueue(segmentGroup);\n segmentGroup.segments.push(this.segment);\n }\n\n public dequeue(): SegmentGroup | undefined {\n return this.segmentGroups.dequeue();\n }\n\n public pop?(): SegmentGroup | undefined {\n return this.segmentGroups.pop ? this.segmentGroups.pop() : undefined;\n }\n\n public clear() {\n this.segmentGroups.clear();\n }\n\n public copyTo(segment: ISegment) {\n this.segmentGroups.walk((sg) => segment.segmentGroups.enqueueOnCopy(sg, this.segment));\n }\n\n private enqueueOnCopy(segmentGroup: SegmentGroup, sourceSegment: ISegment) {\n this.enqueue(segmentGroup);\n if (segmentGroup.previousProps) {\n // duplicate the previousProps for this segment\n const index = segmentGroup.segments.indexOf(sourceSegment);\n if (index !== -1) {\n segmentGroup.previousProps.push(segmentGroup.previousProps[index]);\n }\n }\n }\n}\n"]}
@@ -4,12 +4,21 @@
4
4
  */
5
5
  import { ICombiningOp, IMergeTreeAnnotateMsg } from "./ops";
6
6
  import { PropertySet } from "./properties";
7
+ export declare enum PropertiesRollback {
8
+ /** Not in a rollback */
9
+ None = 0,
10
+ /** Rollback */
11
+ Rollback = 1,
12
+ /** Rollback of a rewrite */
13
+ Rewrite = 2
14
+ }
7
15
  export declare class PropertiesManager {
8
16
  private pendingKeyUpdateCount;
9
17
  private pendingRewriteCount;
10
18
  constructor();
11
19
  ackPendingProperties(annotateOp: IMergeTreeAnnotateMsg): void;
12
- addProperties(oldProps: PropertySet, newProps: PropertySet, op?: ICombiningOp, seq?: number, collaborating?: boolean): PropertySet | undefined;
20
+ private decrementPendingCounts;
21
+ addProperties(oldProps: PropertySet, newProps: PropertySet, op?: ICombiningOp, seq?: number, collaborating?: boolean, rollback?: PropertiesRollback): PropertySet | undefined;
13
22
  copyTo(oldProps: PropertySet, newProps: PropertySet | undefined, newManager: PropertiesManager): PropertySet | undefined;
14
23
  hasPendingProperties(): boolean;
15
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAIH,WAAW,EACd,MAAM,cAAc,CAAC;AAEtB,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAAS;;IAM7B,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAiBtD,aAAa,CAChB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,GAAG,WAAW,GAAG,SAAS;IAuErD,MAAM,CACT,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC9B,WAAW,GAAG,SAAS;IAqBnB,oBAAoB;CAG9B"}
1
+ {"version":3,"file":"segmentPropertiesManager.d.ts","sourceRoot":"","sources":["../src/segmentPropertiesManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAIH,WAAW,EACd,MAAM,cAAc,CAAC;AAEtB,oBAAY,kBAAkB;IAC1B,wBAAwB;IACxB,IAAI,IAAA;IAEJ,eAAe;IACf,QAAQ,IAAA;IAER,4BAA4B;IAC5B,OAAO,IAAA;CACV;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,mBAAmB,CAAS;;IAM7B,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;IAK7D,OAAO,CAAC,sBAAsB;IAqBvB,aAAa,CAChB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,CAAC,EAAE,YAAY,EACjB,GAAG,CAAC,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,EAC9B,QAAQ,GAAE,kBAA4C,GAAG,WAAW,GAAG,SAAS;IAoF7E,MAAM,CACT,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,UAAU,EAAE,iBAAiB,GAC9B,WAAW,GAAG,SAAS;IAqBnB,oBAAoB;CAG9B"}