@fluidframework/tree 2.13.0 → 2.20.0

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 (303) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/api-report/tree.alpha.api.md +22 -12
  3. package/api-report/tree.beta.api.md +9 -5
  4. package/api-report/tree.legacy.alpha.api.md +9 -5
  5. package/api-report/tree.legacy.public.api.md +9 -5
  6. package/api-report/tree.public.api.md +9 -5
  7. package/assertTagging.config.mjs +14 -0
  8. package/dist/alpha.d.ts +3 -0
  9. package/dist/core/index.d.ts +2 -2
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +6 -4
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/rebase/index.d.ts +2 -2
  14. package/dist/core/rebase/index.d.ts.map +1 -1
  15. package/dist/core/rebase/index.js +5 -1
  16. package/dist/core/rebase/index.js.map +1 -1
  17. package/dist/core/rebase/types.d.ts +5 -4
  18. package/dist/core/rebase/types.d.ts.map +1 -1
  19. package/dist/core/rebase/types.js +29 -1
  20. package/dist/core/rebase/types.js.map +1 -1
  21. package/dist/core/rebase/utils.d.ts +10 -0
  22. package/dist/core/rebase/utils.d.ts.map +1 -1
  23. package/dist/core/rebase/utils.js +22 -1
  24. package/dist/core/rebase/utils.js.map +1 -1
  25. package/dist/core/tree/delta.d.ts +21 -26
  26. package/dist/core/tree/delta.d.ts.map +1 -1
  27. package/dist/core/tree/delta.js.map +1 -1
  28. package/dist/core/tree/deltaUtil.d.ts +1 -3
  29. package/dist/core/tree/deltaUtil.d.ts.map +1 -1
  30. package/dist/core/tree/deltaUtil.js +2 -14
  31. package/dist/core/tree/deltaUtil.js.map +1 -1
  32. package/dist/core/tree/index.d.ts +1 -1
  33. package/dist/core/tree/index.d.ts.map +1 -1
  34. package/dist/core/tree/index.js +1 -3
  35. package/dist/core/tree/index.js.map +1 -1
  36. package/dist/core/tree/visitDelta.d.ts.map +1 -1
  37. package/dist/core/tree/visitDelta.js +82 -80
  38. package/dist/core/tree/visitDelta.js.map +1 -1
  39. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  40. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  41. package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
  42. package/dist/feature-libraries/deltaUtils.js +13 -0
  43. package/dist/feature-libraries/deltaUtils.js.map +1 -1
  44. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  45. package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  46. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  47. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  48. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  49. package/dist/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  50. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  51. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  52. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  53. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  54. package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  55. package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  56. package/dist/feature-libraries/modular-schema/index.d.ts +2 -2
  57. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  58. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  59. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  60. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  61. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -8
  62. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  63. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  64. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  65. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +105 -199
  66. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  67. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  68. package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  69. package/dist/feature-libraries/modular-schema/modularChangeTypes.js +20 -0
  70. package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  71. package/dist/feature-libraries/optional-field/optionalField.d.ts +3 -3
  72. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  73. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  74. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  75. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  76. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  77. package/dist/feature-libraries/sequence-field/rebase.js +4 -4
  78. package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
  79. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  80. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  81. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  82. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  83. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  84. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  85. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  86. package/dist/feature-libraries/sequence-field/utils.js +36 -4
  87. package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
  88. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  89. package/dist/feature-libraries/treeCursorUtils.js +4 -1
  90. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  91. package/dist/index.d.ts +26 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +4 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/package.json +2 -1
  96. package/dist/packageVersion.d.ts +1 -1
  97. package/dist/packageVersion.js +1 -1
  98. package/dist/packageVersion.js.map +1 -1
  99. package/dist/shared-tree/index.d.ts +1 -1
  100. package/dist/shared-tree/index.d.ts.map +1 -1
  101. package/dist/shared-tree/index.js +4 -2
  102. package/dist/shared-tree/index.js.map +1 -1
  103. package/dist/shared-tree/sharedTree.d.ts +38 -18
  104. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  105. package/dist/shared-tree/sharedTree.js +38 -34
  106. package/dist/shared-tree/sharedTree.js.map +1 -1
  107. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  108. package/dist/shared-tree/treeCheckout.js +12 -8
  109. package/dist/shared-tree/treeCheckout.js.map +1 -1
  110. package/dist/simple-tree/api/treeNodeApi.js +1 -1
  111. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  112. package/dist/simple-tree/arrayNode.js +1 -1
  113. package/dist/simple-tree/arrayNode.js.map +1 -1
  114. package/dist/simple-tree/toMapTree.js +1 -1
  115. package/dist/simple-tree/toMapTree.js.map +1 -1
  116. package/dist/util/bTreeUtils.d.ts +10 -0
  117. package/dist/util/bTreeUtils.d.ts.map +1 -0
  118. package/dist/util/bTreeUtils.js +52 -0
  119. package/dist/util/bTreeUtils.js.map +1 -0
  120. package/dist/util/idAllocator.d.ts +0 -2
  121. package/dist/util/idAllocator.d.ts.map +1 -1
  122. package/dist/util/idAllocator.js +0 -2
  123. package/dist/util/idAllocator.js.map +1 -1
  124. package/dist/util/index.d.ts +2 -1
  125. package/dist/util/index.d.ts.map +1 -1
  126. package/dist/util/index.js +5 -1
  127. package/dist/util/index.js.map +1 -1
  128. package/dist/util/rangeMap.d.ts +52 -30
  129. package/dist/util/rangeMap.d.ts.map +1 -1
  130. package/dist/util/rangeMap.js +161 -117
  131. package/dist/util/rangeMap.js.map +1 -1
  132. package/dist/util/utils.d.ts +4 -1
  133. package/dist/util/utils.d.ts.map +1 -1
  134. package/dist/util/utils.js +7 -1
  135. package/dist/util/utils.js.map +1 -1
  136. package/lib/alpha.d.ts +3 -0
  137. package/lib/core/index.d.ts +2 -2
  138. package/lib/core/index.d.ts.map +1 -1
  139. package/lib/core/index.js +2 -2
  140. package/lib/core/index.js.map +1 -1
  141. package/lib/core/rebase/index.d.ts +2 -2
  142. package/lib/core/rebase/index.d.ts.map +1 -1
  143. package/lib/core/rebase/index.js +2 -2
  144. package/lib/core/rebase/index.js.map +1 -1
  145. package/lib/core/rebase/types.d.ts +5 -4
  146. package/lib/core/rebase/types.d.ts.map +1 -1
  147. package/lib/core/rebase/types.js +26 -1
  148. package/lib/core/rebase/types.js.map +1 -1
  149. package/lib/core/rebase/utils.d.ts +10 -0
  150. package/lib/core/rebase/utils.d.ts.map +1 -1
  151. package/lib/core/rebase/utils.js +20 -0
  152. package/lib/core/rebase/utils.js.map +1 -1
  153. package/lib/core/tree/delta.d.ts +21 -26
  154. package/lib/core/tree/delta.d.ts.map +1 -1
  155. package/lib/core/tree/delta.js.map +1 -1
  156. package/lib/core/tree/deltaUtil.d.ts +1 -3
  157. package/lib/core/tree/deltaUtil.d.ts.map +1 -1
  158. package/lib/core/tree/deltaUtil.js +1 -12
  159. package/lib/core/tree/deltaUtil.js.map +1 -1
  160. package/lib/core/tree/index.d.ts +1 -1
  161. package/lib/core/tree/index.d.ts.map +1 -1
  162. package/lib/core/tree/index.js +1 -1
  163. package/lib/core/tree/index.js.map +1 -1
  164. package/lib/core/tree/visitDelta.d.ts.map +1 -1
  165. package/lib/core/tree/visitDelta.js +82 -80
  166. package/lib/core/tree/visitDelta.js.map +1 -1
  167. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  168. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  169. package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
  170. package/lib/feature-libraries/deltaUtils.js +13 -0
  171. package/lib/feature-libraries/deltaUtils.js.map +1 -1
  172. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  173. package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
  174. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  175. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
  176. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  177. package/lib/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
  178. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  179. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
  180. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  181. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  182. package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
  183. package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
  184. package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
  185. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  186. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  187. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
  188. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  189. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
  190. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  191. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
  192. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  193. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +74 -166
  194. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  195. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
  196. package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
  197. package/lib/feature-libraries/modular-schema/modularChangeTypes.js +18 -1
  198. package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
  199. package/lib/feature-libraries/optional-field/optionalField.d.ts +3 -3
  200. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  201. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  202. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  203. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  204. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  205. package/lib/feature-libraries/sequence-field/rebase.js +4 -4
  206. package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
  207. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
  208. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
  209. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
  210. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  211. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
  212. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
  213. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  214. package/lib/feature-libraries/sequence-field/utils.js +36 -4
  215. package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
  216. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  217. package/lib/feature-libraries/treeCursorUtils.js +4 -1
  218. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  219. package/lib/index.d.ts +26 -2
  220. package/lib/index.d.ts.map +1 -1
  221. package/lib/index.js +1 -1
  222. package/lib/index.js.map +1 -1
  223. package/lib/packageVersion.d.ts +1 -1
  224. package/lib/packageVersion.js +1 -1
  225. package/lib/packageVersion.js.map +1 -1
  226. package/lib/shared-tree/index.d.ts +1 -1
  227. package/lib/shared-tree/index.d.ts.map +1 -1
  228. package/lib/shared-tree/index.js +1 -1
  229. package/lib/shared-tree/index.js.map +1 -1
  230. package/lib/shared-tree/sharedTree.d.ts +38 -18
  231. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  232. package/lib/shared-tree/sharedTree.js +37 -33
  233. package/lib/shared-tree/sharedTree.js.map +1 -1
  234. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  235. package/lib/shared-tree/treeCheckout.js +13 -9
  236. package/lib/shared-tree/treeCheckout.js.map +1 -1
  237. package/lib/simple-tree/api/treeNodeApi.js +1 -1
  238. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  239. package/lib/simple-tree/arrayNode.js +1 -1
  240. package/lib/simple-tree/arrayNode.js.map +1 -1
  241. package/lib/simple-tree/toMapTree.js +1 -1
  242. package/lib/simple-tree/toMapTree.js.map +1 -1
  243. package/lib/util/bTreeUtils.d.ts +10 -0
  244. package/lib/util/bTreeUtils.d.ts.map +1 -0
  245. package/lib/util/bTreeUtils.js +47 -0
  246. package/lib/util/bTreeUtils.js.map +1 -0
  247. package/lib/util/idAllocator.d.ts +0 -2
  248. package/lib/util/idAllocator.d.ts.map +1 -1
  249. package/lib/util/idAllocator.js +0 -2
  250. package/lib/util/idAllocator.js.map +1 -1
  251. package/lib/util/index.d.ts +2 -1
  252. package/lib/util/index.d.ts.map +1 -1
  253. package/lib/util/index.js +2 -1
  254. package/lib/util/index.js.map +1 -1
  255. package/lib/util/rangeMap.d.ts +52 -30
  256. package/lib/util/rangeMap.d.ts.map +1 -1
  257. package/lib/util/rangeMap.js +160 -117
  258. package/lib/util/rangeMap.js.map +1 -1
  259. package/lib/util/utils.d.ts +4 -1
  260. package/lib/util/utils.d.ts.map +1 -1
  261. package/lib/util/utils.js +7 -1
  262. package/lib/util/utils.js.map +1 -1
  263. package/package.json +23 -23
  264. package/src/core/index.ts +5 -2
  265. package/src/core/rebase/index.ts +5 -0
  266. package/src/core/rebase/types.ts +33 -5
  267. package/src/core/rebase/utils.ts +27 -0
  268. package/src/core/tree/delta.ts +21 -26
  269. package/src/core/tree/deltaUtil.ts +1 -16
  270. package/src/core/tree/index.ts +0 -2
  271. package/src/core/tree/visitDelta.ts +108 -97
  272. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +2 -2
  273. package/src/feature-libraries/deltaUtils.ts +13 -0
  274. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -6
  275. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +12 -13
  276. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +21 -1
  277. package/src/feature-libraries/modular-schema/genericFieldKind.ts +2 -2
  278. package/src/feature-libraries/modular-schema/index.ts +2 -0
  279. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +12 -11
  280. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +138 -225
  281. package/src/feature-libraries/modular-schema/modularChangeTypes.ts +40 -27
  282. package/src/feature-libraries/optional-field/optionalField.ts +3 -3
  283. package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
  284. package/src/feature-libraries/sequence-field/rebase.ts +9 -3
  285. package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
  286. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
  287. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +3 -4
  288. package/src/feature-libraries/sequence-field/utils.ts +36 -4
  289. package/src/feature-libraries/treeCursorUtils.ts +6 -1
  290. package/src/index.ts +34 -6
  291. package/src/packageVersion.ts +1 -1
  292. package/src/shared-tree/index.ts +4 -1
  293. package/src/shared-tree/sharedTree.ts +60 -40
  294. package/src/shared-tree/treeCheckout.ts +19 -12
  295. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  296. package/src/simple-tree/arrayNode.ts +1 -1
  297. package/src/simple-tree/toMapTree.ts +1 -1
  298. package/src/util/bTreeUtils.ts +60 -0
  299. package/src/util/idAllocator.ts +0 -2
  300. package/src/util/index.ts +3 -0
  301. package/src/util/rangeMap.ts +208 -143
  302. package/src/util/utils.ts +10 -3
  303. package/lib/package.json +0 -3
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.newTupleBTree = exports.newCrossFieldKeyTable = exports.getFieldsForCrossFieldKey = exports.getParentFieldId = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
7
+ exports.normalizeFieldId = exports.getParentFieldId = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
8
8
  const internal_1 = require("@fluidframework/core-utils/internal");
9
9
  const sorted_btree_es6_1 = require("@tylerbu/sorted-btree-es6");
10
10
  const index_js_1 = require("../../core/index.js");
@@ -15,6 +15,7 @@ const crossFieldQueries_js_1 = require("./crossFieldQueries.js");
15
15
  const fieldChangeHandler_js_1 = require("./fieldChangeHandler.js");
16
16
  const fieldKindWithEditor_js_1 = require("./fieldKindWithEditor.js");
17
17
  const genericFieldKind_js_1 = require("./genericFieldKind.js");
18
+ const modularChangeTypes_js_1 = require("./modularChangeTypes.js");
18
19
  /**
19
20
  * Implementation of ChangeFamily which delegates work in a given field to the appropriate FieldKind
20
21
  * as determined by the schema.
@@ -101,10 +102,10 @@ class ModularChangeFamily {
101
102
  if (hasConflicts(change1) && hasConflicts(change2)) {
102
103
  return {
103
104
  fieldChanges: new Map(),
104
- nodeChanges: newTupleBTree(),
105
- nodeToParent: newTupleBTree(),
106
- nodeAliases: newTupleBTree(),
107
- crossFieldKeys: newTupleBTree(),
105
+ nodeChanges: (0, index_js_2.newTupleBTree)(),
106
+ nodeToParent: (0, index_js_2.newTupleBTree)(),
107
+ nodeAliases: (0, index_js_2.newTupleBTree)(),
108
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
108
109
  };
109
110
  }
110
111
  else if (hasConflicts(change1)) {
@@ -123,20 +124,20 @@ class ModularChangeFamily {
123
124
  // A collision for a node ID means that that node is referenced in both changesets
124
125
  // (since we assume that if two changesets use the same node ID they are referring to the same node),
125
126
  // therefore all collisions will be addressed when processing the intersection of the changesets.
126
- const composedNodeChanges = (0, index_js_2.brand)(mergeBTrees(change1.nodeChanges, change2.nodeChanges));
127
- const composedNodeToParent = (0, index_js_2.brand)(mergeBTrees(change1.nodeToParent, change2.nodeToParent));
128
- const composedNodeAliases = (0, index_js_2.brand)(mergeBTrees(change1.nodeAliases, change2.nodeAliases));
127
+ const composedNodeChanges = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeChanges, change2.nodeChanges));
128
+ const composedNodeToParent = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeToParent, change2.nodeToParent));
129
+ const composedNodeAliases = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeAliases, change2.nodeAliases));
129
130
  const crossFieldTable = newComposeTable(change1, change2, composedNodeToParent);
130
131
  const composedFields = this.composeFieldMaps(change1.fieldChanges, change2.fieldChanges, undefined, genId, crossFieldTable, revisionMetadata);
131
132
  this.composeInvalidatedElements(crossFieldTable, composedFields, composedNodeChanges, composedNodeToParent, composedNodeAliases, genId, revisionMetadata);
132
133
  // Currently no field kinds require making changes to cross-field keys during composition, so we can just merge the two tables.
133
- const composedCrossFieldKeys = mergeBTrees(change1.crossFieldKeys, change2.crossFieldKeys);
134
+ const composedCrossFieldKeys = index_js_2.RangeMap.union(change1.crossFieldKeys, change2.crossFieldKeys);
134
135
  return {
135
136
  fieldChanges: composedFields,
136
137
  nodeChanges: composedNodeChanges,
137
138
  nodeToParent: composedNodeToParent,
138
139
  nodeAliases: composedNodeAliases,
139
- crossFieldKeys: (0, index_js_2.brand)(composedCrossFieldKeys),
140
+ crossFieldKeys: composedCrossFieldKeys,
140
141
  };
141
142
  }
142
143
  composeInvalidatedField(fieldChange, crossFieldTable, genId, revisionMetadata) {
@@ -357,7 +358,7 @@ class ModularChangeFamily {
357
358
  const { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);
358
359
  const revisionMetadata = (0, index_js_1.revisionMetadataSourceFromInfo)(oldRevInfos);
359
360
  const invertedFields = this.invertFieldMap(change.change.fieldChanges, undefined, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert);
360
- const invertedNodes = newTupleBTree();
361
+ const invertedNodes = (0, index_js_2.newTupleBTree)();
361
362
  change.change.nodeChanges.forEachPair(([revision, localId], nodeChangeset) => {
362
363
  invertedNodes.set([revision, localId], this.invertNodeChange(nodeChangeset, { revision, localId }, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert));
363
364
  });
@@ -436,12 +437,12 @@ class ModularChangeFamily {
436
437
  newChange: change,
437
438
  baseChange: over.change,
438
439
  baseFieldToContext: new Map(),
439
- baseToRebasedNodeId: newTupleBTree(),
440
+ baseToRebasedNodeId: (0, index_js_2.newTupleBTree)(),
440
441
  rebasedFields: new Set(),
441
442
  rebasedNodeToParent: (0, index_js_2.brand)(change.nodeToParent.clone()),
442
- rebasedCrossFieldKeys: (0, index_js_2.brand)(change.crossFieldKeys.clone()),
443
+ rebasedCrossFieldKeys: change.crossFieldKeys.clone(),
443
444
  nodeIdPairs: [],
444
- affectedBaseFields: newTupleBTree(),
445
+ affectedBaseFields: (0, index_js_2.newTupleBTree)(),
445
446
  fieldsWithUnattachedChild: new Set(),
446
447
  };
447
448
  const getBaseRevisions = () => revisionInfoFromTaggedChange(over).map((info) => info.revision);
@@ -755,11 +756,11 @@ class ModularChangeFamily {
755
756
  ? [undefined]
756
757
  : change.revisions.map((revInfo) => revInfo.revision));
757
758
  const updatedFields = this.replaceFieldMapRevisions(change.fieldChanges, oldRevisions, newRevision);
758
- const updatedNodes = newTupleBTree();
759
+ const updatedNodes = (0, index_js_2.newTupleBTree)();
759
760
  for (const [[revision, id], nodeChangeset] of change.nodeChanges.entries()) {
760
761
  updatedNodes.set([replaceRevision(revision, oldRevisions, newRevision), id], this.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision));
761
762
  }
762
- const updatedNodeToParent = newTupleBTree();
763
+ const updatedNodeToParent = (0, index_js_2.newTupleBTree)();
763
764
  for (const [[revision, id], fieldId] of change.nodeToParent.entries()) {
764
765
  updatedNodeToParent.set([replaceRevision(revision, oldRevisions, newRevision), id], replaceFieldIdRevision(normalizeFieldId(fieldId, change.nodeAliases), oldRevisions, newRevision));
765
766
  }
@@ -769,7 +770,7 @@ class ModularChangeFamily {
769
770
  nodeChanges: updatedNodes,
770
771
  nodeToParent: updatedNodeToParent,
771
772
  // We've updated all references to old node IDs, so we no longer need an alias table.
772
- nodeAliases: newTupleBTree(),
773
+ nodeAliases: (0, index_js_2.newTupleBTree)(),
773
774
  crossFieldKeys: replaceCrossFieldKeyTableRevisions(change.crossFieldKeys, oldRevisions, newRevision, change.nodeAliases),
774
775
  };
775
776
  if (change.builds !== undefined) {
@@ -809,7 +810,7 @@ class ModularChangeFamily {
809
810
  return updatedFields;
810
811
  }
811
812
  makeCrossFieldKeyTable(fields, nodes) {
812
- const keys = newCrossFieldKeyTable();
813
+ const keys = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
813
814
  this.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);
814
815
  nodes.forEachPair(([revision, localId], node) => {
815
816
  if (node.fieldChanges !== undefined) {
@@ -824,8 +825,8 @@ class ModularChangeFamily {
824
825
  populateCrossFieldKeyTableForFieldMap(table, fields, parent) {
825
826
  for (const [fieldKey, fieldChange] of fields) {
826
827
  const keys = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).getCrossFieldKeys(fieldChange.change);
827
- for (const key of keys) {
828
- table.set(key, { nodeId: parent, field: fieldKey });
828
+ for (const { key, count } of keys) {
829
+ table.set(key, count, { nodeId: parent, field: fieldKey });
829
830
  }
830
831
  }
831
832
  }
@@ -864,7 +865,7 @@ class ModularChangeFamily {
864
865
  numChildren += 1;
865
866
  }
866
867
  for (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {
867
- const fields = getFieldsForCrossFieldKey(change, keyRange);
868
+ const fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);
868
869
  (0, internal_1.assert)(fields.length === 1 &&
869
870
  fields[0] !== undefined &&
870
871
  areEqualFieldIds(fields[0], fieldId), 0xa4f /* Inconsistent cross field keys */);
@@ -876,14 +877,15 @@ class ModularChangeFamily {
876
877
  exports.ModularChangeFamily = ModularChangeFamily;
877
878
  ModularChangeFamily.emptyChange = makeModularChangeset();
878
879
  function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, nodeAliases) {
879
- const updated = newTupleBTree();
880
- table.forEachPair(([target, revision, id, count], field) => {
881
- const updatedKey = [
882
- target,
883
- replaceRevision(revision, oldRevisions, newRevision),
884
- id,
885
- count,
886
- ];
880
+ const updated = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
881
+ for (const entry of table.entries()) {
882
+ const key = entry.start;
883
+ const updatedKey = {
884
+ target: key.target,
885
+ revision: replaceRevision(key.revision, oldRevisions, newRevision),
886
+ localId: key.localId,
887
+ };
888
+ const field = entry.value;
887
889
  const normalizedFieldId = normalizeFieldId(field, nodeAliases);
888
890
  const updatedNodeId = normalizedFieldId.nodeId !== undefined
889
891
  ? (0, index_js_1.replaceAtomRevisions)(normalizedFieldId.nodeId, oldRevisions, newRevision)
@@ -892,15 +894,15 @@ function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, no
892
894
  ...normalizedFieldId,
893
895
  nodeId: updatedNodeId,
894
896
  };
895
- updated.set(updatedKey, updatedValue);
896
- });
897
+ updated.set(updatedKey, entry.length, updatedValue);
898
+ }
897
899
  return updated;
898
900
  }
899
901
  function replaceRevision(revision, oldRevisions, newRevision) {
900
902
  return oldRevisions.has(revision) ? newRevision : revision;
901
903
  }
902
904
  function replaceIdMapRevisions(map, oldRevisions, newRevision) {
903
- const updated = newTupleBTree();
905
+ const updated = (0, index_js_2.newTupleBTree)();
904
906
  for (const [[revision, id], value] of map.entries()) {
905
907
  updated.set([replaceRevision(revision, oldRevisions, newRevision), id], value);
906
908
  }
@@ -917,9 +919,9 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
917
919
  // Note that it would in principle be possible to adopt the later build and exclude from the
918
920
  // composition all the changes already reflected on the tree, but that is not something we
919
921
  // care to support at this time.
920
- const allBuilds = (0, index_js_2.brand)(mergeBTrees(change1.builds ?? newTupleBTree(), change2.builds ?? newTupleBTree(), true));
921
- const allDestroys = (0, index_js_2.brand)(mergeBTrees(change1.destroys ?? newTupleBTree(), change2.destroys ?? newTupleBTree()));
922
- const allRefreshers = (0, index_js_2.brand)(mergeBTrees(change1.refreshers ?? newTupleBTree(), change2.refreshers ?? newTupleBTree(), true));
922
+ const allBuilds = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.builds ?? (0, index_js_2.newTupleBTree)(), change2.builds ?? (0, index_js_2.newTupleBTree)(), true));
923
+ const allDestroys = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.destroys ?? (0, index_js_2.newTupleBTree)(), change2.destroys ?? (0, index_js_2.newTupleBTree)()));
924
+ const allRefreshers = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.refreshers ?? (0, index_js_2.newTupleBTree)(), change2.refreshers ?? (0, index_js_2.newTupleBTree)(), true));
923
925
  if (change1.destroys !== undefined && change2.builds !== undefined) {
924
926
  for (const [key, chunk] of change2.builds.entries()) {
925
927
  const destroyCount = change1.destroys.get(key);
@@ -991,7 +993,7 @@ function* relevantRemovedRootsFromFields(change, nodeChanges, fieldKinds) {
991
993
  * corresponding build or refresher.
992
994
  */
993
995
  function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshers = true) {
994
- const refreshers = newTupleBTree();
996
+ const refreshers = (0, index_js_2.newTupleBTree)();
995
997
  const chunkLengths = new Map();
996
998
  if (change.builds !== undefined) {
997
999
  for (const [[revision, id], chunk] of change.builds.entries()) {
@@ -1040,18 +1042,28 @@ function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshe
1040
1042
  }
1041
1043
  exports.updateRefreshers = updateRefreshers;
1042
1044
  /**
1045
+ * Converts a change into the delta format.
1046
+ *
1043
1047
  * @param change - The change to convert into a delta.
1044
1048
  * @param fieldKinds - The field kinds to delegate to.
1045
1049
  */
1046
1050
  function intoDelta(taggedChange, fieldKinds) {
1047
1051
  const change = taggedChange.change;
1048
1052
  const rootDelta = {};
1053
+ const global = [];
1054
+ const rename = [];
1049
1055
  if (!hasConflicts(change)) {
1050
1056
  // If there are no constraint violations, then tree changes apply.
1051
- const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds);
1057
+ const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds, global, rename);
1052
1058
  if (fieldDeltas.size > 0) {
1053
1059
  rootDelta.fields = fieldDeltas;
1054
1060
  }
1061
+ if (global.length > 0) {
1062
+ rootDelta.global = global;
1063
+ }
1064
+ if (rename.length > 0) {
1065
+ rootDelta.rename = rename;
1066
+ }
1055
1067
  }
1056
1068
  // Constraint violations should not prevent nodes from being built
1057
1069
  if (change.builds && change.builds.size > 0) {
@@ -1089,22 +1101,24 @@ function copyDetachedNodes(detachedNodes) {
1089
1101
  /**
1090
1102
  * @param change - The change to convert into a delta.
1091
1103
  */
1092
- function intoDeltaImpl(change, nodeChanges, fieldKinds) {
1104
+ function intoDeltaImpl(change, nodeChanges, fieldKinds, global, rename) {
1093
1105
  const delta = new Map();
1094
1106
  for (const [field, fieldChange] of change) {
1095
- const deltaField = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
1107
+ const { local: fieldChanges, global: fieldGlobal, rename: fieldRename, } = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
1096
1108
  const nodeChange = nodeChangeFromId(nodeChanges, childChange);
1097
- return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds);
1109
+ return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds, global, rename);
1098
1110
  });
1099
- if (!(0, index_js_1.isEmptyFieldChanges)(deltaField)) {
1100
- delta.set(field, deltaField);
1111
+ if (fieldChanges !== undefined && fieldChanges.length > 0) {
1112
+ delta.set(field, fieldChanges);
1101
1113
  }
1114
+ fieldGlobal?.forEach((c) => global.push(c));
1115
+ fieldRename?.forEach((r) => rename.push(r));
1102
1116
  }
1103
1117
  return delta;
1104
1118
  }
1105
- function deltaFromNodeChange(change, nodeChanges, fieldKinds) {
1119
+ function deltaFromNodeChange(change, nodeChanges, fieldKinds, global, rename) {
1106
1120
  if (change.fieldChanges !== undefined) {
1107
- return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds);
1121
+ return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds, global, rename);
1108
1122
  }
1109
1123
  // TODO: update the API to allow undefined to be returned here
1110
1124
  return new Map();
@@ -1161,22 +1175,22 @@ function newComposeTable(baseChange, newChange, composedNodeToParent) {
1161
1175
  newChange,
1162
1176
  fieldToContext: new Map(),
1163
1177
  newFieldToBaseField: new Map(),
1164
- newToBaseNodeId: newTupleBTree(),
1178
+ newToBaseNodeId: (0, index_js_2.newTupleBTree)(),
1165
1179
  composedNodes: new Set(),
1166
1180
  composedNodeToParent,
1167
1181
  pendingCompositions: {
1168
1182
  nodeIdsToCompose: [],
1169
- affectedBaseFields: newTupleBTree(),
1170
- affectedNewFields: newTupleBTree(),
1183
+ affectedBaseFields: (0, index_js_2.newTupleBTree)(),
1184
+ affectedNewFields: (0, index_js_2.newTupleBTree)(),
1171
1185
  },
1172
1186
  };
1173
1187
  }
1174
1188
  function newCrossFieldTable() {
1175
1189
  return {
1176
- srcTable: new Map(),
1177
- dstTable: new Map(),
1178
- srcDependents: new Map(),
1179
- dstDependents: new Map(),
1190
+ srcTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
1191
+ dstTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
1192
+ srcDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
1193
+ dstDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
1180
1194
  invalidatedFields: new Set(),
1181
1195
  };
1182
1196
  }
@@ -1247,19 +1261,17 @@ class RebaseManager extends CrossFieldManagerI {
1247
1261
  }
1248
1262
  set(target, revision, id, count, newValue, invalidateDependents) {
1249
1263
  if (invalidateDependents && this.allowInval) {
1250
- const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, [
1264
+ const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
1251
1265
  target,
1252
1266
  revision,
1253
- id,
1254
- count,
1255
- ]);
1267
+ localId: id,
1268
+ }, count);
1256
1269
  (0, internal_1.assert)(newFieldIds.length === 0, 0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */);
1257
- const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, [
1270
+ const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
1258
1271
  target,
1259
1272
  revision,
1260
- id,
1261
- count,
1262
- ]);
1273
+ localId: id,
1274
+ }, count);
1263
1275
  (0, internal_1.assert)(baseFieldIds.length > 0, 0x9c7 /* Cross field key not registered in base or new change */);
1264
1276
  for (const baseFieldId of baseFieldIds) {
1265
1277
  this.table.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
@@ -1271,7 +1283,7 @@ class RebaseManager extends CrossFieldManagerI {
1271
1283
  setInChangeAtomIdMap(this.table.rebasedNodeToParent, id, this.fieldId);
1272
1284
  }
1273
1285
  moveKey(target, revision, id, count) {
1274
- setInCrossFieldKeyTable(this.table.rebasedCrossFieldKeys, target, revision, id, count, this.fieldId);
1286
+ this.table.rebasedCrossFieldKeys.set({ target, revision, localId: id }, count, this.fieldId);
1275
1287
  }
1276
1288
  get table() {
1277
1289
  return this.crossFieldTable;
@@ -1285,24 +1297,22 @@ class ComposeManager extends CrossFieldManagerI {
1285
1297
  }
1286
1298
  set(target, revision, id, count, newValue, invalidateDependents) {
1287
1299
  if (invalidateDependents && this.allowInval) {
1288
- const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, [
1300
+ const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
1289
1301
  target,
1290
1302
  revision,
1291
- id,
1292
- count,
1293
- ]);
1303
+ localId: id,
1304
+ }, count);
1294
1305
  if (newFieldIds.length > 0) {
1295
1306
  for (const newFieldId of newFieldIds) {
1296
1307
  this.table.pendingCompositions.affectedNewFields.set([newFieldId.nodeId?.revision, newFieldId.nodeId?.localId, newFieldId.field], true);
1297
1308
  }
1298
1309
  }
1299
1310
  else {
1300
- const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, [
1311
+ const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
1301
1312
  target,
1302
1313
  revision,
1303
- id,
1304
- count,
1305
- ]);
1314
+ localId: id,
1315
+ }, count);
1306
1316
  (0, internal_1.assert)(baseFieldIds.length > 0, 0x9c8 /* Cross field key not registered in base or new change */);
1307
1317
  for (const baseFieldId of baseFieldIds) {
1308
1318
  this.table.pendingCompositions.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
@@ -1326,10 +1336,10 @@ function makeModularChangeset(props = {
1326
1336
  }) {
1327
1337
  const changeset = {
1328
1338
  fieldChanges: props.fieldChanges ?? new Map(),
1329
- nodeChanges: props.nodeChanges ?? newTupleBTree(),
1330
- nodeToParent: props.nodeToParent ?? newTupleBTree(),
1331
- nodeAliases: props.nodeAliases ?? newTupleBTree(),
1332
- crossFieldKeys: props.crossFieldKeys ?? newCrossFieldKeyTable(),
1339
+ nodeChanges: props.nodeChanges ?? (0, index_js_2.newTupleBTree)(),
1340
+ nodeToParent: props.nodeToParent ?? (0, index_js_2.newTupleBTree)(),
1341
+ nodeAliases: props.nodeAliases ?? (0, index_js_2.newTupleBTree)(),
1342
+ crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1333
1343
  };
1334
1344
  if (props.revisions !== undefined && props.revisions.length > 0) {
1335
1345
  changeset.revisions = props.revisions;
@@ -1385,7 +1395,7 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1385
1395
  if (content.mode === 1 /* CursorLocationType.Fields */ && content.getFieldLength() === 0) {
1386
1396
  return { type: "global", revision };
1387
1397
  }
1388
- const builds = newTupleBTree();
1398
+ const builds = (0, index_js_2.newTupleBTree)();
1389
1399
  const chunkCompressor = {
1390
1400
  policy: index_js_3.defaultChunkPolicy,
1391
1401
  idCompressor,
@@ -1412,9 +1422,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1412
1422
  const modularChange = buildModularChangesetFromField({
1413
1423
  path: field,
1414
1424
  fieldChange: { fieldKind, change },
1415
- nodeChanges: newTupleBTree(),
1416
- nodeToParent: newTupleBTree(),
1417
- crossFieldKeys: newCrossFieldKeyTable(),
1425
+ nodeChanges: (0, index_js_2.newTupleBTree)(),
1426
+ nodeToParent: (0, index_js_2.newTupleBTree)(),
1427
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1418
1428
  idAllocator: this.idAllocator,
1419
1429
  localCrossFieldKeys,
1420
1430
  revision,
@@ -1441,9 +1451,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1441
1451
  fieldKind: change.fieldKind,
1442
1452
  change: change.change,
1443
1453
  },
1444
- nodeChanges: newTupleBTree(),
1445
- nodeToParent: newTupleBTree(),
1446
- crossFieldKeys: newCrossFieldKeyTable(),
1454
+ nodeChanges: (0, index_js_2.newTupleBTree)(),
1455
+ nodeToParent: (0, index_js_2.newTupleBTree)(),
1456
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1447
1457
  idAllocator: this.idAllocator,
1448
1458
  localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
1449
1459
  revision: change.revision,
@@ -1470,9 +1480,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1470
1480
  this.applyChange((0, index_js_1.tagChange)(buildModularChangesetFromNode({
1471
1481
  path,
1472
1482
  nodeChange,
1473
- nodeChanges: newTupleBTree(),
1474
- nodeToParent: newTupleBTree(),
1475
- crossFieldKeys: newCrossFieldKeyTable(),
1483
+ nodeChanges: (0, index_js_2.newTupleBTree)(),
1484
+ nodeToParent: (0, index_js_2.newTupleBTree)(),
1485
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1476
1486
  idAllocator: this.idAllocator,
1477
1487
  revision,
1478
1488
  }), revision));
@@ -1484,9 +1494,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
1484
1494
  this.applyChange((0, index_js_1.tagChange)(buildModularChangesetFromNode({
1485
1495
  path,
1486
1496
  nodeChange,
1487
- nodeChanges: newTupleBTree(),
1488
- nodeToParent: newTupleBTree(),
1489
- crossFieldKeys: newCrossFieldKeyTable(),
1497
+ nodeChanges: (0, index_js_2.newTupleBTree)(),
1498
+ nodeToParent: (0, index_js_2.newTupleBTree)(),
1499
+ crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
1490
1500
  idAllocator: this.idAllocator,
1491
1501
  revision,
1492
1502
  }), revision));
@@ -1497,8 +1507,8 @@ function buildModularChangesetFromField(props) {
1497
1507
  const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
1498
1508
  const fieldChanges = new Map([[path.field, fieldChange]]);
1499
1509
  if (path.parent === undefined) {
1500
- for (const key of localCrossFieldKeys) {
1501
- crossFieldKeys.set(key, { nodeId: undefined, field: path.field });
1510
+ for (const { key, count } of localCrossFieldKeys) {
1511
+ crossFieldKeys.set(key, count, { nodeId: undefined, field: path.field });
1502
1512
  }
1503
1513
  if (childId !== undefined) {
1504
1514
  setInChangeAtomIdMap(nodeToParent, childId, {
@@ -1519,8 +1529,8 @@ function buildModularChangesetFromField(props) {
1519
1529
  fieldChanges,
1520
1530
  };
1521
1531
  const parentId = { localId: (0, index_js_2.brand)(idAllocator.allocate()), revision };
1522
- for (const key of localCrossFieldKeys) {
1523
- crossFieldKeys.set(key, { nodeId: parentId, field: path.field });
1532
+ for (const { key, count } of localCrossFieldKeys) {
1533
+ crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
1524
1534
  }
1525
1535
  if (childId !== undefined) {
1526
1536
  setInChangeAtomIdMap(nodeToParent, childId, {
@@ -1593,19 +1603,6 @@ function revisionInfoFromTaggedChange(taggedChange) {
1593
1603
  }
1594
1604
  return revInfos;
1595
1605
  }
1596
- function mergeBTrees(tree1, tree2, preferLeft = true) {
1597
- if (tree1 === undefined) {
1598
- return tree2 !== undefined ? (0, index_js_2.brand)(tree2.clone()) : newTupleBTree();
1599
- }
1600
- const result = (0, index_js_2.brand)(tree1.clone());
1601
- if (tree2 === undefined) {
1602
- return result;
1603
- }
1604
- for (const [key, value] of tree2.entries()) {
1605
- result.set(key, value, !preferLeft);
1606
- }
1607
- return result;
1608
- }
1609
1606
  function fieldChangeFromId(fields, nodes, id) {
1610
1607
  const fieldMap = fieldMapFromNodeId(fields, nodes, id.nodeId);
1611
1608
  return fieldMap.get(id.field) ?? (0, index_js_2.fail)("No field exists for the given ID");
@@ -1657,77 +1654,18 @@ function getParentFieldId(changeset, nodeId) {
1657
1654
  return normalizeFieldId(parentId, changeset.nodeAliases);
1658
1655
  }
1659
1656
  exports.getParentFieldId = getParentFieldId;
1660
- function getFieldsForCrossFieldKey(changeset, [target, revision, id, count]) {
1661
- let firstLocalId = id;
1662
- const lastLocalId = id + count - 1;
1663
- const fields = [];
1664
- // eslint-disable-next-line no-constant-condition
1665
- while (true) {
1666
- const entry = getFirstIntersectingCrossFieldEntry(changeset.crossFieldKeys, [
1667
- target,
1668
- revision,
1669
- (0, index_js_2.brand)(firstLocalId),
1670
- count,
1671
- ]);
1672
- if (entry === undefined) {
1673
- return fields;
1674
- }
1675
- const [[_target, _revision, entryId, entryCount], fieldId] = entry;
1676
- fields.push(normalizeFieldId(fieldId, changeset.nodeAliases));
1677
- const entryLastId = entryId + entryCount - 1;
1678
- if (entryLastId >= lastLocalId) {
1679
- return fields;
1680
- }
1681
- firstLocalId = entryLastId + 1;
1682
- }
1683
- }
1684
- exports.getFieldsForCrossFieldKey = getFieldsForCrossFieldKey;
1685
- function getFirstIntersectingCrossFieldEntry(table, [target, revision, id, count]) {
1686
- const entry = table.nextLowerPair([target, revision, id, Number.POSITIVE_INFINITY]);
1687
- if (entry === undefined) {
1688
- return undefined;
1689
- }
1690
- const [entryTarget, entryRevision, entryId, entryCount] = entry[0];
1691
- if (entryTarget !== target || entryRevision !== revision) {
1692
- return undefined;
1693
- }
1694
- const lastQueryId = id + count - 1;
1695
- const entryLastId = entryId + entryCount - 1;
1696
- if (entryId > lastQueryId || entryLastId < id) {
1697
- return undefined;
1698
- }
1699
- return entry;
1700
- }
1701
- function setInCrossFieldKeyTable(table, target, revision, id, count, value) {
1702
- let entry = getFirstIntersectingCrossFieldEntry(table, [target, revision, id, count]);
1703
- const lastQueryId = id + count - 1;
1704
- while (entry !== undefined) {
1705
- const [entryKey, entryValue] = entry;
1706
- table.delete(entryKey);
1707
- const [_target, _revision, entryId, entryCount] = entryKey;
1708
- if (entryId < id) {
1709
- table.set([target, revision, entryId, id - entryId], entryValue);
1710
- }
1711
- const lastEntryId = entryId + entryCount - 1;
1712
- if (lastEntryId > lastQueryId) {
1713
- table.set([target, revision, (0, index_js_2.brand)(lastQueryId + 1), lastEntryId - lastQueryId], entryValue);
1714
- break;
1715
- }
1716
- const nextId = (0, index_js_2.brand)(lastEntryId + 1);
1717
- entry = getFirstIntersectingCrossFieldEntry(table, [
1718
- target,
1719
- revision,
1720
- nextId,
1721
- lastQueryId - nextId + 1,
1722
- ]);
1723
- }
1724
- table.set([target, revision, id, count], value);
1657
+ function getFieldsForCrossFieldKey(changeset, key, count) {
1658
+ return changeset.crossFieldKeys
1659
+ .getAll(key, count)
1660
+ .map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
1725
1661
  }
1662
+ // This is only exported for use in test utilities.
1726
1663
  function normalizeFieldId(fieldId, nodeAliases) {
1727
1664
  return fieldId.nodeId !== undefined
1728
1665
  ? { ...fieldId, nodeId: normalizeNodeId(fieldId.nodeId, nodeAliases) }
1729
1666
  : fieldId;
1730
1667
  }
1668
+ exports.normalizeFieldId = normalizeFieldId;
1731
1669
  /**
1732
1670
  * @returns The canonical form of nodeId, according to nodeAliases
1733
1671
  */
@@ -1745,38 +1683,6 @@ function normalizeNodeId(nodeId, nodeAliases) {
1745
1683
  function hasConflicts(change) {
1746
1684
  return (change.constraintViolationCount ?? 0) > 0;
1747
1685
  }
1748
- function newCrossFieldKeyTable() {
1749
- return newTupleBTree();
1750
- }
1751
- exports.newCrossFieldKeyTable = newCrossFieldKeyTable;
1752
- function newTupleBTree(entries) {
1753
- return (0, index_js_2.brand)(new sorted_btree_es6_1.BTree(entries, compareTuples));
1754
- }
1755
- exports.newTupleBTree = newTupleBTree;
1756
- // This assumes that the arrays are the same length.
1757
- function compareTuples(arrayA, arrayB) {
1758
- for (let i = 0; i < arrayA.length; i++) {
1759
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1760
- const a = arrayA[i];
1761
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1762
- const b = arrayB[i];
1763
- // Less-than and greater-than always return false if either value is undefined,
1764
- // so we handle undefined separately, treating it as less than all other values.
1765
- if (a === undefined && b !== undefined) {
1766
- return -1;
1767
- }
1768
- else if (b === undefined && a !== undefined) {
1769
- return 1;
1770
- }
1771
- else if (a < b) {
1772
- return -1;
1773
- }
1774
- else if (a > b) {
1775
- return 1;
1776
- }
1777
- }
1778
- return 0;
1779
- }
1780
1686
  function getFromChangeAtomIdMap(map, id) {
1781
1687
  return map.get([id.revision, id.localId]);
1782
1688
  }