@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.
- package/CHANGELOG.md +4 -0
- package/api-report/tree.legacy.alpha.api.md +6 -0
- package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.js +1 -1
- package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +3 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/index.d.ts +1 -0
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js +4 -1
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/publicContracts.d.ts +18 -0
- package/dist/shared-tree/publicContracts.d.ts.map +1 -0
- package/dist/shared-tree/publicContracts.js +24 -0
- package/dist/shared-tree/publicContracts.js.map +1 -0
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +3 -6
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +2 -0
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +2 -0
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +4 -0
- package/dist/simple-tree/api/tree.d.ts.map +1 -1
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/dist/simple-tree/core/getOrCreateNode.js +1 -1
- package/dist/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/dist/simple-tree/core/index.d.ts +1 -1
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +2 -2
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts +2 -6
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +10 -13
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/proxies.js +1 -1
- package/dist/simple-tree/proxies.js.map +1 -1
- package/dist/util/rangeMap.d.ts +10 -1
- package/dist/util/rangeMap.d.ts.map +1 -1
- package/dist/util/rangeMap.js +35 -7
- package/dist/util/rangeMap.js.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.js +2 -2
- package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +3 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/index.d.ts +1 -0
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js +1 -0
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/publicContracts.d.ts +18 -0
- package/lib/shared-tree/publicContracts.d.ts.map +1 -0
- package/lib/shared-tree/publicContracts.js +21 -0
- package/lib/shared-tree/publicContracts.js.map +1 -0
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +3 -6
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +2 -0
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +2 -0
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +4 -0
- package/lib/simple-tree/api/tree.d.ts.map +1 -1
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -1
- package/lib/simple-tree/core/getOrCreateNode.js +2 -2
- package/lib/simple-tree/core/getOrCreateNode.js.map +1 -1
- package/lib/simple-tree/core/index.d.ts +1 -1
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +1 -1
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts +2 -6
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +9 -11
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/proxies.js +2 -2
- package/lib/simple-tree/proxies.js.map +1 -1
- package/lib/util/rangeMap.d.ts +10 -1
- package/lib/util/rangeMap.d.ts.map +1 -1
- package/lib/util/rangeMap.js +35 -7
- package/lib/util/rangeMap.js.map +1 -1
- package/package.json +23 -23
- package/src/feature-libraries/treeCursorUtils.ts +4 -2
- package/src/index.ts +2 -0
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/index.ts +5 -0
- package/src/shared-tree/publicContracts.ts +24 -0
- package/src/shared-tree/sharedTree.ts +3 -6
- package/src/simple-tree/api/schemaFactory.ts +2 -0
- package/src/simple-tree/api/tree.ts +4 -0
- package/src/simple-tree/core/getOrCreateNode.ts +6 -2
- package/src/simple-tree/core/index.ts +1 -1
- package/src/simple-tree/core/treeNodeKernel.ts +16 -14
- package/src/simple-tree/proxies.ts +2 -2
- package/src/util/rangeMap.ts +35 -6
package/src/util/rangeMap.ts
CHANGED
|
@@ -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] = {
|
|
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 {
|
|
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.
|
|
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 &&
|
|
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
|
+
}
|