@fluidframework/tree 2.20.0 → 2.21.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 (108) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/tree.legacy.alpha.api.md +6 -0
  3. package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  4. package/dist/feature-libraries/treeCursorUtils.js +1 -1
  5. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/legacy.d.ts +3 -1
  11. package/dist/packageVersion.d.ts +1 -1
  12. package/dist/packageVersion.js +1 -1
  13. package/dist/packageVersion.js.map +1 -1
  14. package/dist/shared-tree/index.d.ts +1 -0
  15. package/dist/shared-tree/index.d.ts.map +1 -1
  16. package/dist/shared-tree/index.js +4 -1
  17. package/dist/shared-tree/index.js.map +1 -1
  18. package/dist/shared-tree/publicContracts.d.ts +18 -0
  19. package/dist/shared-tree/publicContracts.d.ts.map +1 -0
  20. package/dist/shared-tree/publicContracts.js +24 -0
  21. package/dist/shared-tree/publicContracts.js.map +1 -0
  22. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  23. package/dist/shared-tree/sharedTree.js +3 -6
  24. package/dist/shared-tree/sharedTree.js.map +1 -1
  25. package/dist/simple-tree/api/schemaFactory.d.ts +2 -0
  26. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  27. package/dist/simple-tree/api/schemaFactory.js +2 -0
  28. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  29. package/dist/simple-tree/api/tree.d.ts +4 -0
  30. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  31. package/dist/simple-tree/api/tree.js.map +1 -1
  32. package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  33. package/dist/simple-tree/core/getOrCreateNode.js +1 -1
  34. package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
  35. package/dist/simple-tree/core/index.d.ts +1 -1
  36. package/dist/simple-tree/core/index.d.ts.map +1 -1
  37. package/dist/simple-tree/core/index.js +2 -2
  38. package/dist/simple-tree/core/index.js.map +1 -1
  39. package/dist/simple-tree/core/treeNodeKernel.d.ts +2 -6
  40. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  41. package/dist/simple-tree/core/treeNodeKernel.js +10 -13
  42. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  43. package/dist/simple-tree/proxies.js +1 -1
  44. package/dist/simple-tree/proxies.js.map +1 -1
  45. package/dist/util/rangeMap.d.ts +10 -1
  46. package/dist/util/rangeMap.d.ts.map +1 -1
  47. package/dist/util/rangeMap.js +35 -7
  48. package/dist/util/rangeMap.js.map +1 -1
  49. package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
  50. package/lib/feature-libraries/treeCursorUtils.js +2 -2
  51. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  52. package/lib/index.d.ts +1 -1
  53. package/lib/index.d.ts.map +1 -1
  54. package/lib/index.js +1 -1
  55. package/lib/index.js.map +1 -1
  56. package/lib/legacy.d.ts +3 -1
  57. package/lib/packageVersion.d.ts +1 -1
  58. package/lib/packageVersion.js +1 -1
  59. package/lib/packageVersion.js.map +1 -1
  60. package/lib/shared-tree/index.d.ts +1 -0
  61. package/lib/shared-tree/index.d.ts.map +1 -1
  62. package/lib/shared-tree/index.js +1 -0
  63. package/lib/shared-tree/index.js.map +1 -1
  64. package/lib/shared-tree/publicContracts.d.ts +18 -0
  65. package/lib/shared-tree/publicContracts.d.ts.map +1 -0
  66. package/lib/shared-tree/publicContracts.js +21 -0
  67. package/lib/shared-tree/publicContracts.js.map +1 -0
  68. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  69. package/lib/shared-tree/sharedTree.js +3 -6
  70. package/lib/shared-tree/sharedTree.js.map +1 -1
  71. package/lib/simple-tree/api/schemaFactory.d.ts +2 -0
  72. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  73. package/lib/simple-tree/api/schemaFactory.js +2 -0
  74. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  75. package/lib/simple-tree/api/tree.d.ts +4 -0
  76. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  77. package/lib/simple-tree/api/tree.js.map +1 -1
  78. package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
  79. package/lib/simple-tree/core/getOrCreateNode.js +2 -2
  80. package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
  81. package/lib/simple-tree/core/index.d.ts +1 -1
  82. package/lib/simple-tree/core/index.d.ts.map +1 -1
  83. package/lib/simple-tree/core/index.js +1 -1
  84. package/lib/simple-tree/core/index.js.map +1 -1
  85. package/lib/simple-tree/core/treeNodeKernel.d.ts +2 -6
  86. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  87. package/lib/simple-tree/core/treeNodeKernel.js +9 -11
  88. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  89. package/lib/simple-tree/proxies.js +2 -2
  90. package/lib/simple-tree/proxies.js.map +1 -1
  91. package/lib/util/rangeMap.d.ts +10 -1
  92. package/lib/util/rangeMap.d.ts.map +1 -1
  93. package/lib/util/rangeMap.js +35 -7
  94. package/lib/util/rangeMap.js.map +1 -1
  95. package/package.json +23 -23
  96. package/src/feature-libraries/treeCursorUtils.ts +4 -2
  97. package/src/index.ts +2 -0
  98. package/src/packageVersion.ts +1 -1
  99. package/src/shared-tree/index.ts +5 -0
  100. package/src/shared-tree/publicContracts.ts +24 -0
  101. package/src/shared-tree/sharedTree.ts +3 -6
  102. package/src/simple-tree/api/schemaFactory.ts +2 -0
  103. package/src/simple-tree/api/tree.ts +4 -0
  104. package/src/simple-tree/core/getOrCreateNode.ts +6 -2
  105. package/src/simple-tree/core/index.ts +1 -1
  106. package/src/simple-tree/core/treeNodeKernel.ts +16 -14
  107. package/src/simple-tree/proxies.ts +2 -2
  108. package/src/util/rangeMap.ts +35 -6
@@ -24,10 +24,19 @@ export class RangeMap<K, V> {
24
24
  * Offsetting `b` by this difference should return `a`.
25
25
  * The difference can be infinite if `a` cannot be reached from `b` by offsetting,
26
26
  * but the difference should still be positive if `a` is larger than `b` and negative if smaller.
27
+ *
28
+ * @param offsetValue - Function used to associate a range of values with a range of keys.
29
+ * When writing to a range of keys starting with `start`, the value of the nth key is interpreted to be
30
+ * `offsetValue(firstValue, n - 1)`.
31
+ * The same logic should be used when interpreting the values for keys after the first in a
32
+ * `RangeQueryResult` or `RangeQueryEntry`.
33
+ *
34
+ * If `offsetValue` is left unspecified, all keys in a block will be given the same value.
27
35
  */
28
36
  public constructor(
29
37
  private readonly offsetKey: (key: K, offset: number) => K,
30
38
  private readonly subtractKeys: (a: K, b: K) => number,
39
+ public readonly offsetValue: (value: V, offset: number) => V = defaultValueOffsetFn,
31
40
  ) {
32
41
  this.tree = new BTree(undefined, subtractKeys);
33
42
  }
@@ -65,7 +74,11 @@ export class RangeMap<K, V> {
65
74
  const firstEntry = entries[0] ?? oob();
66
75
  const lengthBefore = this.subtractKeys(start, firstEntry.start);
67
76
  if (lengthBefore > 0) {
68
- entries[0] = { ...firstEntry, start, length: firstEntry.length - lengthBefore };
77
+ entries[0] = {
78
+ start,
79
+ length: firstEntry.length - lengthBefore,
80
+ value: this.offsetValue(firstEntry.value, lengthBefore),
81
+ };
69
82
  }
70
83
 
71
84
  const lastEntry = entries[entries.length - 1] ?? oob();
@@ -96,9 +109,14 @@ export class RangeMap<K, V> {
96
109
  const { value, length: entryLength } = entry[1];
97
110
 
98
111
  const entryLastKey = this.offsetKey(entryKey, entryLength - 1);
112
+ const lengthBeforeQuery = this.subtractKeys(start, entryKey);
99
113
  const overlappingLength = Math.min(this.subtractKeys(entryLastKey, start) + 1, length);
100
114
  if (overlappingLength > 0) {
101
- return { value, start, length: overlappingLength };
115
+ return {
116
+ value: this.offsetValue(value, lengthBeforeQuery),
117
+ start,
118
+ length: overlappingLength,
119
+ };
102
120
  }
103
121
  }
104
122
  }
@@ -171,13 +189,18 @@ export class RangeMap<K, V> {
171
189
  const lengthAfter = this.subtractKeys(lastEntryKey, lastDeleteKey);
172
190
  if (lengthAfter > 0) {
173
191
  // A portion of this entry comes after the deletion range, so we reinsert that portion.
174
- this.tree.set(this.offsetKey(lastDeleteKey, 1), { length: lengthAfter, value });
192
+ const newKey = this.offsetKey(lastDeleteKey, 1);
193
+ const difference = this.subtractKeys(newKey, key);
194
+ this.tree.set(newKey, {
195
+ length: lengthAfter,
196
+ value: this.offsetValue(value, difference),
197
+ });
175
198
  }
176
199
  }
177
200
  }
178
201
 
179
202
  public clone(): RangeMap<K, V> {
180
- const cloned = new RangeMap<K, V>(this.offsetKey, this.subtractKeys);
203
+ const cloned = new RangeMap<K, V>(this.offsetKey, this.subtractKeys, this.offsetValue);
181
204
  cloned.tree = this.tree.clone();
182
205
  return cloned;
183
206
  }
@@ -187,11 +210,13 @@ export class RangeMap<K, V> {
187
210
  */
188
211
  public static union<K, V>(a: RangeMap<K, V>, b: RangeMap<K, V>): RangeMap<K, V> {
189
212
  assert(
190
- a.offsetKey === b.offsetKey && a.subtractKeys === b.subtractKeys,
213
+ a.offsetKey === b.offsetKey &&
214
+ a.subtractKeys === b.subtractKeys &&
215
+ a.offsetValue === b.offsetValue,
191
216
  0xaae /* Maps should have the same behavior */,
192
217
  );
193
218
 
194
- const merged = new RangeMap<K, V>(a.offsetKey, a.subtractKeys);
219
+ const merged = new RangeMap<K, V>(a.offsetKey, a.subtractKeys, a.offsetValue);
195
220
 
196
221
  // TODO: Is there a good pattern that lets us make `tree` readonly?
197
222
  merged.tree = a.tree.clone();
@@ -307,3 +332,7 @@ function offsetInteger(key: number, offset: number): number {
307
332
  function subtractIntegers(a: number, b: number): number {
308
333
  return a - b;
309
334
  }
335
+
336
+ function defaultValueOffsetFn<T>(value: T, offset: number): T {
337
+ return value;
338
+ }