@fluidframework/merge-tree 0.59.4002 → 1.0.2
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/.eslintrc.js +1 -1
- package/README.md +1 -1
- package/REFERENCEPOSITIONS.md +127 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +47 -41
- package/dist/client.js.map +1 -1
- package/dist/collections.d.ts +5 -4
- package/dist/collections.d.ts.map +1 -1
- package/dist/collections.js +17 -18
- package/dist/collections.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/localReference.d.ts +4 -0
- package/dist/localReference.d.ts.map +1 -1
- package/dist/localReference.js +24 -3
- package/dist/localReference.js.map +1 -1
- package/dist/mergeTree.d.ts +20 -0
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +139 -48
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeDeltaCallback.d.ts +8 -10
- package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/dist/mergeTreeDeltaCallback.js +6 -10
- package/dist/mergeTreeDeltaCallback.js.map +1 -1
- package/dist/opBuilder.js +6 -5
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts +12 -10
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +7 -7
- package/dist/ops.js.map +1 -1
- package/dist/referencePositions.d.ts +1 -1
- package/dist/referencePositions.d.ts.map +1 -1
- package/dist/referencePositions.js +3 -2
- package/dist/referencePositions.js.map +1 -1
- package/lib/client.d.ts +17 -0
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +47 -41
- package/lib/client.js.map +1 -1
- package/lib/collections.d.ts +5 -4
- package/lib/collections.d.ts.map +1 -1
- package/lib/collections.js +17 -18
- package/lib/collections.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/localReference.d.ts +4 -0
- package/lib/localReference.d.ts.map +1 -1
- package/lib/localReference.js +22 -2
- package/lib/localReference.js.map +1 -1
- package/lib/mergeTree.d.ts +20 -0
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +140 -49
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeDeltaCallback.d.ts +8 -10
- package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
- package/lib/mergeTreeDeltaCallback.js +6 -10
- package/lib/mergeTreeDeltaCallback.js.map +1 -1
- package/lib/opBuilder.js +6 -5
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts +12 -10
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js +7 -7
- package/lib/ops.js.map +1 -1
- package/lib/referencePositions.d.ts +1 -1
- package/lib/referencePositions.d.ts.map +1 -1
- package/lib/referencePositions.js +3 -2
- package/lib/referencePositions.js.map +1 -1
- package/package.json +69 -74
- package/src/client.ts +27 -18
- package/src/collections.ts +5 -4
- package/src/index.ts +1 -1
- package/src/localReference.ts +24 -2
- package/src/mergeTree.ts +133 -39
- package/src/mergeTreeDeltaCallback.ts +8 -10
- package/src/ops.ts +13 -10
- package/src/referencePositions.ts +3 -2
package/lib/collections.js
CHANGED
|
@@ -202,11 +202,10 @@ export class Heap {
|
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
|
-
export
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
})(RBColor || (RBColor = {}));
|
|
205
|
+
export const RBColor = {
|
|
206
|
+
RED: 0,
|
|
207
|
+
BLACK: 1,
|
|
208
|
+
};
|
|
210
209
|
export class RedBlackTree {
|
|
211
210
|
constructor(compareKeys, aug) {
|
|
212
211
|
this.compareKeys = compareKeys;
|
|
@@ -216,7 +215,7 @@ export class RedBlackTree {
|
|
|
216
215
|
return { key, data, color, size };
|
|
217
216
|
}
|
|
218
217
|
isRed(node) {
|
|
219
|
-
return !!node && (node.color ===
|
|
218
|
+
return !!node && (node.color === RBColor.RED);
|
|
220
219
|
}
|
|
221
220
|
nodeSize(node) {
|
|
222
221
|
return node ? node.size : 0;
|
|
@@ -313,14 +312,14 @@ export class RedBlackTree {
|
|
|
313
312
|
}
|
|
314
313
|
else {
|
|
315
314
|
this.root = this.nodePut(this.root, key, data, conflict);
|
|
316
|
-
this.root.color =
|
|
315
|
+
this.root.color = RBColor.BLACK;
|
|
317
316
|
}
|
|
318
317
|
}
|
|
319
318
|
}
|
|
320
319
|
nodePut(node, key, data, conflict) {
|
|
321
320
|
let _node = node;
|
|
322
321
|
if (!_node) {
|
|
323
|
-
return this.makeNode(key, data,
|
|
322
|
+
return this.makeNode(key, data, RBColor.RED, 1);
|
|
324
323
|
}
|
|
325
324
|
else {
|
|
326
325
|
const cmp = this.compareKeys(key, _node.key);
|
|
@@ -401,7 +400,7 @@ export class RedBlackTree {
|
|
|
401
400
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
402
401
|
if ((!this.isRed(this.root.left)) && (!this.isRed(this.root.right))) {
|
|
403
402
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
404
|
-
this.root.color =
|
|
403
|
+
this.root.color = RBColor.RED;
|
|
405
404
|
}
|
|
406
405
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
407
406
|
this.root = this.nodeRemove(this.root, key);
|
|
@@ -524,7 +523,7 @@ export class RedBlackTree {
|
|
|
524
523
|
node.left = leftChild.right;
|
|
525
524
|
leftChild.right = node;
|
|
526
525
|
leftChild.color = leftChild.right.color;
|
|
527
|
-
leftChild.right.color =
|
|
526
|
+
leftChild.right.color = RBColor.RED;
|
|
528
527
|
leftChild.size = node.size;
|
|
529
528
|
node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;
|
|
530
529
|
if (this.aug) {
|
|
@@ -539,7 +538,7 @@ export class RedBlackTree {
|
|
|
539
538
|
node.right = rightChild.left;
|
|
540
539
|
rightChild.left = node;
|
|
541
540
|
rightChild.color = rightChild.left.color;
|
|
542
|
-
rightChild.left.color =
|
|
541
|
+
rightChild.left.color = RBColor.RED;
|
|
543
542
|
rightChild.size = node.size;
|
|
544
543
|
node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;
|
|
545
544
|
if (this.aug) {
|
|
@@ -549,7 +548,7 @@ export class RedBlackTree {
|
|
|
549
548
|
return rightChild;
|
|
550
549
|
}
|
|
551
550
|
oppositeColor(c) {
|
|
552
|
-
return (c ===
|
|
551
|
+
return (c === RBColor.BLACK) ? RBColor.RED : RBColor.BLACK;
|
|
553
552
|
}
|
|
554
553
|
flipColors(node) {
|
|
555
554
|
node.color = this.oppositeColor(node.color);
|
|
@@ -632,7 +631,7 @@ export class RedBlackTree {
|
|
|
632
631
|
let go = true;
|
|
633
632
|
if (node) {
|
|
634
633
|
if (actions.pre) {
|
|
635
|
-
if (actions.showStructure || (node.color ===
|
|
634
|
+
if (actions.showStructure || (node.color === RBColor.BLACK)) {
|
|
636
635
|
go = actions.pre(node);
|
|
637
636
|
}
|
|
638
637
|
}
|
|
@@ -640,7 +639,7 @@ export class RedBlackTree {
|
|
|
640
639
|
go = this.nodeWalk(node.left, actions);
|
|
641
640
|
}
|
|
642
641
|
if (go && actions.infix) {
|
|
643
|
-
if (actions.showStructure || (node.color ===
|
|
642
|
+
if (actions.showStructure || (node.color === RBColor.BLACK)) {
|
|
644
643
|
go = actions.infix(node);
|
|
645
644
|
}
|
|
646
645
|
}
|
|
@@ -648,7 +647,7 @@ export class RedBlackTree {
|
|
|
648
647
|
go = this.nodeWalk(node.right, actions);
|
|
649
648
|
}
|
|
650
649
|
if (go && actions.post) {
|
|
651
|
-
if (actions.showStructure || (node.color ===
|
|
650
|
+
if (actions.showStructure || (node.color === RBColor.BLACK)) {
|
|
652
651
|
go = actions.post(node);
|
|
653
652
|
}
|
|
654
653
|
}
|
|
@@ -659,7 +658,7 @@ export class RedBlackTree {
|
|
|
659
658
|
let go = true;
|
|
660
659
|
if (node) {
|
|
661
660
|
if (actions.pre) {
|
|
662
|
-
if (actions.showStructure || (node.color ===
|
|
661
|
+
if (actions.showStructure || (node.color === RBColor.BLACK)) {
|
|
663
662
|
go = actions.pre(node);
|
|
664
663
|
}
|
|
665
664
|
}
|
|
@@ -667,7 +666,7 @@ export class RedBlackTree {
|
|
|
667
666
|
go = this.nodeWalkBackward(node.right, actions);
|
|
668
667
|
}
|
|
669
668
|
if (go && actions.infix) {
|
|
670
|
-
if (actions.showStructure || (node.color ===
|
|
669
|
+
if (actions.showStructure || (node.color === RBColor.BLACK)) {
|
|
671
670
|
go = actions.infix(node);
|
|
672
671
|
}
|
|
673
672
|
}
|
|
@@ -675,7 +674,7 @@ export class RedBlackTree {
|
|
|
675
674
|
go = this.nodeWalkBackward(node.left, actions);
|
|
676
675
|
}
|
|
677
676
|
if (go && actions.post) {
|
|
678
|
-
if (actions.showStructure || (node.color ===
|
|
677
|
+
if (actions.showStructure || (node.color === RBColor.BLACK)) {
|
|
679
678
|
go = actions.post(node);
|
|
680
679
|
}
|
|
681
680
|
}
|
package/lib/collections.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.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\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\n/* Remove once strictNullCheck is enabled */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n ConflictAction,\n IIntegerRange,\n KeyComparer,\n PropertyAction,\n SortedDictionary,\n} from \"./base\";\n\nexport class Stack<T> {\n public items: T[] = [];\n public push(val: T) {\n this.items.push(val);\n }\n\n public empty() {\n return this.items.length === 0;\n }\n\n public top(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n public pop(): T | undefined {\n return this.items.pop();\n }\n}\n\nexport function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {\n if (entry === undefined) {\n return undefined;\n } else if (entry.isHead) {\n return undefined;\n } else {\n entry.next.prev = entry.prev;\n entry.prev.next = entry.next;\n }\n return (entry);\n}\n\nfunction ListMakeEntry<U>(data: U): List<U> {\n return new List<U>(false, data);\n}\n\nexport function ListMakeHead<U>(): List<U> {\n return new List<U>(true, undefined);\n}\n\nexport class List<T> {\n public next: List<T>;\n public prev: List<T>;\n\n constructor(public isHead: boolean, public data: T | undefined) {\n this.prev = this;\n this.next = this;\n }\n\n public clear(): void {\n if (this.isHead) {\n this.prev = this;\n this.next = this;\n }\n }\n\n private add(data: T): List<T> {\n const entry = ListMakeEntry(data);\n this.prev.next = entry;\n entry.next = this;\n entry.prev = this.prev;\n this.prev = entry;\n return (entry);\n }\n\n public dequeue(): T | undefined {\n if (!this.empty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const removedEntry = ListRemoveEntry(this.next)!;\n return removedEntry.data;\n }\n }\n\n public enqueue(data: T): List<T> {\n return this.add(data);\n }\n\n public walk(fn: (data: T, l: List<T>) => void): void {\n for (let entry = this.next; !(entry.isHead); entry = entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(entry.data!, entry);\n }\n }\n\n public some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[] {\n const rtn: T[] = [];\n const start = rev ? this.prev : this.next;\n for (let entry = start; !(entry.isHead); entry = rev ? entry.prev : entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const data = entry.data!;\n if (fn(data, entry)) {\n if (rev) {\n // preserve list order when in reverse\n rtn.unshift(data);\n } else {\n rtn.push(data);\n }\n }\n }\n return rtn;\n }\n\n public count(): number {\n let entry: List<T>;\n let i: number;\n\n entry = this.next;\n for (i = 0; !(entry.isHead); i++) {\n entry = entry.next;\n }\n return (i);\n }\n\n public first(): T | undefined {\n if (!this.empty()) {\n return (this.next.data);\n }\n }\n\n public last(): T | undefined {\n if (!this.empty()) {\n return (this.prev.data);\n }\n }\n\n public empty(): boolean {\n return (this.next === this);\n }\n\n /**\n * @deprecated - use unshift\n */\n public push(data: T): void {\n this.unshift(data);\n }\n\n public unshift(data: T): void {\n const entry = ListMakeEntry(data);\n entry.data = data;\n entry.isHead = false;\n entry.next = this.next;\n entry.prev = this;\n this.next = entry;\n entry.next.prev = entry;\n }\n\n public [Symbol.iterator]() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let node: List<T> | undefined = this;\n const iterator: IterableIterator<T> = {\n next(): IteratorResult<T> {\n while (node && node.next.isHead === false) {\n node = node.next;\n if (node.data !== undefined) {\n return { value: node.data, done: false };\n }\n }\n return { value: undefined, done: true };\n },\n [Symbol.iterator]() {\n return this;\n },\n };\n return iterator;\n }\n}\n\nexport interface Comparer<T> {\n compare(a: T, b: T): number;\n min: T;\n}\n\nexport class Heap<T> {\n private L: T[];\n public count() {\n return this.L.length - 1;\n }\n constructor(a: T[], public comp: Comparer<T>) {\n this.L = [comp.min];\n for (let i = 0, len = a.length; i < len; i++) {\n this.add(a[i]);\n }\n }\n public peek() {\n return this.L[1];\n }\n\n public get() {\n const x = this.L[1];\n this.L[1] = this.L[this.count()];\n this.L.pop();\n this.fixDown(1);\n return x;\n }\n\n public add(x: T) {\n this.L.push(x);\n this.fixup(this.count());\n }\n\n /* eslint-disable no-bitwise */\n private fixup(k: number) {\n let _k = k;\n while (_k > 1 && (this.comp.compare(this.L[_k >> 1], this.L[_k]) > 0)) {\n const tmp = this.L[_k >> 1];\n this.L[_k >> 1] = this.L[_k];\n this.L[_k] = tmp;\n _k = _k >> 1;\n }\n }\n\n private fixDown(k: number) {\n let _k = k;\n while ((_k << 1) <= (this.count())) {\n let j = _k << 1;\n if ((j < this.count()) && (this.comp.compare(this.L[j], this.L[j + 1]) > 0)) {\n j++;\n }\n if (this.comp.compare(this.L[_k], this.L[j]) <= 0) {\n break;\n }\n const tmp = this.L[_k];\n this.L[_k] = this.L[j];\n this.L[j] = tmp;\n _k = j;\n }\n }\n /* eslint-enable no-bitwise */\n}\n\nexport const enum RBColor {\n RED,\n BLACK,\n}\n\nexport interface RBNode<TKey, TData> {\n key: TKey;\n data: TData;\n left: RBNode<TKey, TData> | undefined;\n right: RBNode<TKey, TData> | undefined;\n color: RBColor;\n size: number;\n}\n\nexport interface IRBAugmentation<TKey, TData> {\n update(node: RBNode<TKey, TData>): void;\n}\n\nexport interface IRBMatcher<TKey, TData> {\n continueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n matchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n}\n\nexport interface RBNodeActions<TKey, TData> {\n infix?(node: RBNode<TKey, TData>): boolean;\n pre?(node: RBNode<TKey, TData>): boolean;\n post?(node: RBNode<TKey, TData>): boolean;\n showStructure?: boolean;\n}\n\nexport class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {\n private root: RBNode<TKey, TData> | undefined;\n\n constructor(\n private readonly compareKeys: KeyComparer<TKey>,\n private readonly aug?: IRBAugmentation<TKey, TData>,\n ) { }\n\n private makeNode(key: TKey, data: TData, color: RBColor, size: number) {\n return <RBNode<TKey, TData>>{ key, data, color, size };\n }\n\n private isRed(node: RBNode<TKey, TData> | undefined) {\n return !!node && (node.color === RBColor.RED);\n }\n\n private nodeSize(node: RBNode<TKey, TData> | undefined) {\n return node ? node.size : 0;\n }\n public size() {\n return this.nodeSize(this.root);\n }\n public isEmpty() {\n return !this.root;\n }\n public get(key: TKey) {\n if (key !== undefined) {\n return this.nodeGet(this.root, key);\n }\n }\n private nodeGet(node: RBNode<TKey, TData> | undefined, key: TKey) {\n let _node = node;\n while (_node) {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node = _node.left;\n } else if (cmp > 0) {\n _node = _node.right;\n } else {\n return _node;\n }\n }\n }\n private contains(key: TKey) {\n return this.get(key);\n }\n\n public gather(key: TKey, matcher: IRBMatcher<TKey, TData>) {\n const results = [] as RBNode<TKey, TData>[];\n if (key !== undefined) {\n this.nodeGather(this.root, results, key, matcher);\n }\n return results;\n }\n\n private nodeGather(\n node: RBNode<TKey, TData> | undefined,\n results: RBNode<TKey, TData>[],\n key: TKey,\n matcher: IRBMatcher<TKey, TData>) {\n if (node) {\n if (matcher.continueSubtree(node.left, key)) {\n this.nodeGather(node.left, results, key, matcher);\n }\n if (matcher.matchNode(node, key)) {\n results.push(node);\n }\n if (matcher.continueSubtree(node.right, key)) {\n this.nodeGather(node.right, results, key, matcher);\n }\n }\n }\n\n public walkExactMatchesForward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesForward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesForward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesForward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesForward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public walkExactMatchesBackward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesBackward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesBackward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (cmp: number) => boolean,\n continueRightFn: (cmp: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesBackward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesBackward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>) {\n if (key !== undefined) {\n if (data === undefined) {\n this.remove(key);\n } else {\n this.root = this.nodePut(this.root, key, data, conflict);\n this.root.color = RBColor.BLACK;\n }\n }\n }\n\n private nodePut(\n node: RBNode<TKey, TData> | undefined,\n key: TKey, data: TData,\n conflict?: ConflictAction<TKey, TData>,\n ) {\n let _node = node;\n if (!_node) {\n return this.makeNode(key, data, RBColor.RED, 1);\n } else {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node.left = this.nodePut(_node.left, key, data, conflict);\n } else if (cmp > 0) {\n _node.right = this.nodePut(_node.right, key, data, conflict);\n } else {\n if (conflict) {\n const kd = conflict(key, _node.key, data, _node.data);\n if (kd.key) {\n _node.key = kd.key;\n }\n if (kd.data) {\n _node.data = kd.data;\n } else {\n _node.data = data;\n }\n } else {\n _node.data = data;\n }\n }\n if (this.isRed(_node.right) && (!this.isRed(_node.left))) {\n _node = this.rotateLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left) && this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n }\n if (this.isRed(_node.left) && this.isRed(_node.right)) {\n this.flipColors(_node);\n }\n _node.size = this.nodeSize(_node.left) + this.nodeSize(_node.right) + 1;\n if (this.aug) {\n this.updateLocal(_node);\n }\n return _node;\n }\n }\n\n private updateLocal(node: RBNode<TKey, TData>) {\n if (this.aug) {\n if (this.isRed(node.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.left!);\n }\n if (this.isRed(node.right)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.right!);\n }\n this.aug.update(node);\n }\n }\n\n private nodeRemoveMin(node: RBNode<TKey, TData>) {\n let _node = node;\n if (_node.left) {\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left.left))) {\n _node = this.moveRedLeft(_node);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemoveMin(_node.left!);\n return this.balance(_node);\n }\n }\n\n public remove(key: TKey) {\n if (key !== undefined) {\n if (!this.contains(key)) {\n return;\n }\n\n this.removeExisting(key);\n }\n // TODO: error on undefined key\n }\n\n public removeExisting(key: TKey) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(this.root!.left)) && (!this.isRed(this.root!.right))) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root!.color = RBColor.RED;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root = this.nodeRemove(this.root!, key);\n }\n\n private nodeRemove(node: RBNode<TKey, TData>, key: TKey) {\n let _node = node;\n if (this.compareKeys(key, _node.key) < 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left!.left))) {\n _node = this.moveRedLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemove(_node.left!, key);\n } else {\n if (this.isRed(_node.left)) {\n _node = this.rotateRight(_node);\n }\n if ((this.compareKeys(key, _node.key) === 0) && (!_node.right)) {\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.right)) && (!this.isRed(_node.right!.left))) {\n _node = this.moveRedRight(_node);\n }\n if (this.compareKeys(key, _node.key) === 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const subtreeMin = this.nodeMin(_node.right!);\n _node.key = subtreeMin.key;\n _node.data = subtreeMin.data;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemoveMin(_node.right!);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemove(_node.right!, key);\n }\n }\n return this.balance(_node);\n }\n\n public floor(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeFloor(this.root, key);\n }\n }\n\n private nodeFloor(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp === 0) {\n return node;\n } else if (cmp < 0) {\n return this.nodeFloor(node.left, key);\n } else {\n const rightFloor = this.nodeFloor(node.right, key);\n if (rightFloor) {\n return rightFloor;\n } else {\n return node;\n }\n }\n }\n }\n\n public ceil(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeCeil(this.root, key);\n }\n }\n\n private nodeCeil(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp === 0) {\n return node;\n } else if (cmp > 0) {\n return this.nodeCeil(node.right, key);\n } else {\n const leftCeil = this.nodeCeil(node.left, key);\n if (leftCeil) {\n return leftCeil;\n } else {\n return node;\n }\n }\n }\n }\n\n public min() {\n if (this.root) {\n return this.nodeMin(this.root);\n }\n }\n\n private nodeMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.left) {\n return node;\n } else {\n return this.nodeMin(node.left);\n }\n }\n\n public max() {\n if (this.root) {\n return this.nodeMax(this.root);\n }\n }\n\n private nodeMax(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.right) {\n return node;\n } else {\n return this.nodeMax(node.right);\n }\n }\n\n private rotateRight(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const leftChild = node.left!;\n node.left = leftChild.right;\n leftChild.right = node;\n leftChild.color = leftChild.right.color;\n leftChild.right.color = RBColor.RED;\n leftChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(leftChild);\n }\n return leftChild;\n }\n\n private rotateLeft(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rightChild = node.right!;\n node.right = rightChild.left;\n rightChild.left = node;\n rightChild.color = rightChild.left.color;\n rightChild.left.color = RBColor.RED;\n rightChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(rightChild);\n }\n return rightChild;\n }\n\n private oppositeColor(c: RBColor) {\n return (c === RBColor.BLACK) ? RBColor.RED : RBColor.BLACK;\n }\n\n private flipColors(node: RBNode<TKey, TData>) {\n node.color = this.oppositeColor(node.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.left!.color = this.oppositeColor(node.left!.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.right!.color = this.oppositeColor(node.right!.color);\n }\n\n private moveRedLeft(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.right!.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.rotateRight(_node.right!);\n _node = this.rotateLeft(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private moveRedRight(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private balance(input: RBNode<TKey, TData>) {\n let node: RBNode<TKey, TData> | undefined = input;\n if (this.isRed(node.right)) {\n node = this.rotateLeft(node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(node.left) && this.isRed(node.left!.left)) {\n node = this.rotateRight(node);\n }\n if (this.isRed(node.left) && (this.isRed(node.right))) {\n this.flipColors(node);\n }\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.aug.update(node);\n }\n return node;\n }\n\n public mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey) {\n this.nodeMap(this.root, action, start, end);\n }\n\n public map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, action, accum);\n }\n\n public keys() {\n const keyList = <TKey[]>[];\n const actions = <RBNodeActions<TKey, TData>>{\n showStructure: true,\n infix: (node) => {\n keyList.push(node.key);\n return true;\n },\n };\n this.walk(actions);\n return keyList;\n }\n\n /**\n * Depth-first traversal with custom action; if action returns\n * false, traversal is halted.\n * @param action - action to apply to each node\n */\n public walk(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalk(this.root, actions);\n }\n\n public walkBackward(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalkBackward(this.root, actions);\n }\n\n private nodeWalk(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.left) {\n go = this.nodeWalk(node.left, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalk(node.right, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeWalkBackward(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.right) {\n go = this.nodeWalkBackward(node.right, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalkBackward(node.left, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeMap<TAccum>(\n node: RBNode<TKey, TData> | undefined,\n action: PropertyAction<TKey, TData>,\n accum?: TAccum,\n start?: TKey,\n end?: TKey,\n ): boolean {\n let _start = start;\n let _end = end;\n if (!node) {\n return true;\n }\n if (_start === undefined) {\n _start = this.nodeMin(node).key;\n }\n if (_end === undefined) {\n _end = this.nodeMax(node).key;\n }\n const cmpStart = this.compareKeys(_start, node.key);\n const cmpEnd = this.compareKeys(_end, node.key);\n let go = true;\n if (cmpStart < 0) {\n go = this.nodeMap(node.left, action, accum, _start, _end);\n }\n if (go && (cmpStart <= 0) && (cmpEnd >= 0)) {\n // REVIEW: test for black node here\n go = action(node, accum);\n }\n if (go && (cmpEnd > 0)) {\n go = this.nodeMap(node.right, action, accum, _start, _end);\n }\n return go;\n }\n}\n\nexport interface AugmentedIntervalNode {\n minmax: IInterval;\n}\n\nexport const integerRangeToString = (range: IIntegerRange) => `[${range.start},${range.end})`;\n\nexport interface IInterval {\n clone(): IInterval;\n compare(b: IInterval): number;\n compareStart(b: IInterval): number;\n compareEnd(b: IInterval): number;\n modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage): IInterval | undefined;\n overlaps(b: IInterval): boolean;\n union(b: IInterval): IInterval;\n}\n\nconst intervalComparer = (a: IInterval, b: IInterval) => a.compare(b);\nexport type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;\nexport type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;\n\nexport class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>,\n IRBMatcher<T, AugmentedIntervalNode> {\n public intervals = new RedBlackTree<T, AugmentedIntervalNode>(intervalComparer, this);\n\n public remove(x: T) {\n this.intervals.remove(x);\n }\n\n public removeExisting(x: T) {\n this.intervals.removeExisting(x);\n }\n\n public put(x: T, conflict?: IntervalConflictResolver<T>) {\n let rbConflict: ConflictAction<T, AugmentedIntervalNode> | undefined;\n if (conflict) {\n rbConflict = (key: T, currentKey: T) => {\n const ival = conflict(key, currentKey);\n return {\n key: ival,\n };\n };\n }\n this.intervals.put(x, { minmax: x.clone() }, rbConflict);\n }\n\n public map(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapUntil(fn: (X: T) => boolean) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n return fn(node.key);\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapBackward(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walkBackward(actions);\n }\n\n // TODO: toString()\n public match(x: T) {\n return this.intervals.gather(x, this);\n }\n\n public matchNode(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.key.overlaps(key);\n }\n\n public continueSubtree(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.data.minmax.overlaps(key);\n }\n\n public update(node: IntervalNode<T>) {\n if (node.left && node.right) {\n node.data.minmax = node.key.union(\n node.left.data.minmax.union(node.right.data.minmax));\n } else {\n if (node.left) {\n node.data.minmax = node.key.union(node.left.data.minmax);\n } else if (node.right) {\n node.data.minmax = node.key.union(node.right.data.minmax);\n } else {\n node.data.minmax = node.key.clone();\n }\n }\n }\n}\n\nexport interface TSTResult<T> {\n key: string;\n val: T;\n}\n\nexport interface TSTNode<T> {\n c: string;\n left?: TSTNode<T>;\n mid?: TSTNode<T>;\n right?: TSTNode<T>;\n val?: T;\n}\n\ninterface TSTPrefix {\n text: string;\n}\n\nexport interface ProxString<T> {\n text: string;\n invDistance: number;\n val: T;\n}\n\nexport class TST<T> {\n private n = 0;\n private root: TSTNode<T> | undefined;\n\n public size() {\n return this.n;\n }\n\n private contains(key: string) {\n return this.get(key);\n }\n\n public get(key: string) {\n const x = this.nodeGet(this.root, key, 0);\n if (x === undefined) {\n return undefined;\n }\n return x.val;\n }\n\n private nodeGet(x: TSTNode<T> | undefined, key: string, d: number): TSTNode<T> | undefined {\n if (x === undefined) {\n return undefined;\n }\n const c = key.charAt(d);\n if (c < x.c) {\n return this.nodeGet(x.left, key, d);\n } else if (c > x.c) {\n return this.nodeGet(x.right, key, d);\n } else if (d < (key.length - 1)) {\n return this.nodeGet(x.mid, key, d + 1);\n } else { return x; }\n }\n\n public put(key: string, val: T) {\n if (!this.contains(key)) {\n this.n++;\n }\n this.root = this.nodePut(this.root, key, val, 0);\n }\n\n private nodePut(x: TSTNode<T> | undefined, key: string, val: T, d: number) {\n let _x = x;\n const c = key.charAt(d);\n if (_x === undefined) {\n _x = { c };\n }\n if (c < _x.c) {\n _x.left = this.nodePut(_x.left, key, val, d);\n } else if (c > _x.c) {\n _x.right = this.nodePut(_x.right, key, val, d);\n } else if (d < (key.length - 1)) {\n _x.mid = this.nodePut(_x.mid, key, val, d + 1);\n } else {\n _x.val = val;\n }\n return _x;\n }\n\n public neighbors(text: string, distance = 2) {\n let q = <ProxString<T>[]>[];\n this.nodeProximity(this.root, { text: \"\" }, 0, text, distance, q);\n q = q.filter((value) => (value.text.length > 0));\n return q;\n }\n\n public keysWithPrefix(text: string) {\n const q = <string[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push(text);\n }\n this.collect(x.mid, { text }, q);\n return q;\n }\n\n private collect(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: string[]) {\n if (x === undefined) {\n return;\n }\n this.collect(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push(prefix.text + x.c);\n }\n this.collect(x.mid, { text: prefix.text + x.c }, q);\n this.collect(x.right, prefix, q);\n }\n\n private mapNode(x: TSTNode<T> | undefined, prefix: TSTPrefix, fn: (key: string, val: T) => void) {\n if (x === undefined) {\n return;\n }\n const key = prefix.text + x.c;\n this.mapNode(x.left, prefix, fn);\n if (x.val) {\n fn(key, x.val);\n }\n this.mapNode(x.mid, { text: key }, fn);\n this.mapNode(x.right, prefix, fn);\n }\n\n public map(fn: (key: string, val: T) => void) {\n this.mapNode(this.root, { text: \"\" }, fn);\n }\n\n public pairsWithPrefix(text: string) {\n const q = <TSTResult<T>[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push({ key: text, val: x.val });\n }\n this.collectPairs(x.mid, { text }, q);\n return q;\n }\n\n private collectPairs(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: TSTResult<T>[]) {\n if (x === undefined) {\n return;\n }\n this.collectPairs(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push({ key: prefix.text + x.c, val: x.val });\n }\n this.collectPairs(x.mid, { text: prefix.text + x.c }, q);\n this.collectPairs(x.right, prefix, q);\n }\n\n private nodeProximity(\n x: TSTNode<T> | undefined,\n prefix: TSTPrefix,\n d: number,\n pattern: string,\n distance: number,\n q: ProxString<T>[]) {\n if ((x === undefined) || (distance < 0)) {\n return;\n }\n const c = pattern.charAt(d);\n if ((distance > 0) || (c < x.c)) {\n this.nodeProximity(x.left, prefix, d, pattern, distance, q);\n }\n if (x.val !== undefined) {\n const remD = distance - (pattern.length - d);\n if (remD >= 0) {\n let invD = distance;\n if (c !== x.c) {\n invD--;\n }\n q.push({ text: prefix.text + x.c, val: x.val, invDistance: invD });\n }\n }\n const recurD = (d < (pattern.length - 1)) ? d + 1 : d;\n if (c === x.c) {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance, q);\n } else {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance - 1, q);\n }\n if ((distance > 0) || (c > x.c)) {\n this.nodeProximity(x.right, prefix, d, pattern, distance, q);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.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\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\n/* Remove once strictNullCheck is enabled */\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n ConflictAction,\n IIntegerRange,\n KeyComparer,\n PropertyAction,\n SortedDictionary,\n} from \"./base\";\n\nexport class Stack<T> {\n public items: T[] = [];\n public push(val: T) {\n this.items.push(val);\n }\n\n public empty() {\n return this.items.length === 0;\n }\n\n public top(): T | undefined {\n return this.items[this.items.length - 1];\n }\n\n public pop(): T | undefined {\n return this.items.pop();\n }\n}\n\nexport function ListRemoveEntry<U>(entry: List<U>): List<U> | undefined {\n if (entry === undefined) {\n return undefined;\n } else if (entry.isHead) {\n return undefined;\n } else {\n entry.next.prev = entry.prev;\n entry.prev.next = entry.next;\n }\n return (entry);\n}\n\nfunction ListMakeEntry<U>(data: U): List<U> {\n return new List<U>(false, data);\n}\n\nexport function ListMakeHead<U>(): List<U> {\n return new List<U>(true, undefined);\n}\n\nexport class List<T> {\n public next: List<T>;\n public prev: List<T>;\n\n constructor(public isHead: boolean, public data: T | undefined) {\n this.prev = this;\n this.next = this;\n }\n\n public clear(): void {\n if (this.isHead) {\n this.prev = this;\n this.next = this;\n }\n }\n\n private add(data: T): List<T> {\n const entry = ListMakeEntry(data);\n this.prev.next = entry;\n entry.next = this;\n entry.prev = this.prev;\n this.prev = entry;\n return (entry);\n }\n\n public dequeue(): T | undefined {\n if (!this.empty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const removedEntry = ListRemoveEntry(this.next)!;\n return removedEntry.data;\n }\n }\n\n public enqueue(data: T): List<T> {\n return this.add(data);\n }\n\n public walk(fn: (data: T, l: List<T>) => void): void {\n for (let entry = this.next; !(entry.isHead); entry = entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(entry.data!, entry);\n }\n }\n\n public some(fn: (data: T, l: List<T>) => boolean, rev?: boolean): T[] {\n const rtn: T[] = [];\n const start = rev ? this.prev : this.next;\n for (let entry = start; !(entry.isHead); entry = rev ? entry.prev : entry.next) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const data = entry.data!;\n if (fn(data, entry)) {\n if (rev) {\n // preserve list order when in reverse\n rtn.unshift(data);\n } else {\n rtn.push(data);\n }\n }\n }\n return rtn;\n }\n\n public count(): number {\n let entry: List<T>;\n let i: number;\n\n entry = this.next;\n for (i = 0; !(entry.isHead); i++) {\n entry = entry.next;\n }\n return (i);\n }\n\n public first(): T | undefined {\n if (!this.empty()) {\n return (this.next.data);\n }\n }\n\n public last(): T | undefined {\n if (!this.empty()) {\n return (this.prev.data);\n }\n }\n\n public empty(): boolean {\n return (this.next === this);\n }\n\n /**\n * @deprecated - use unshift\n */\n public push(data: T): void {\n this.unshift(data);\n }\n\n public unshift(data: T): void {\n const entry = ListMakeEntry(data);\n entry.data = data;\n entry.isHead = false;\n entry.next = this.next;\n entry.prev = this;\n this.next = entry;\n entry.next.prev = entry;\n }\n\n public [Symbol.iterator]() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let node: List<T> | undefined = this;\n const iterator: IterableIterator<T> = {\n next(): IteratorResult<T> {\n while (node && node.next.isHead === false) {\n node = node.next;\n if (node.data !== undefined) {\n return { value: node.data, done: false };\n }\n }\n return { value: undefined, done: true };\n },\n [Symbol.iterator]() {\n return this;\n },\n };\n return iterator;\n }\n}\n\nexport interface Comparer<T> {\n compare(a: T, b: T): number;\n min: T;\n}\n\nexport class Heap<T> {\n private L: T[];\n public count() {\n return this.L.length - 1;\n }\n constructor(a: T[], public comp: Comparer<T>) {\n this.L = [comp.min];\n for (let i = 0, len = a.length; i < len; i++) {\n this.add(a[i]);\n }\n }\n public peek() {\n return this.L[1];\n }\n\n public get() {\n const x = this.L[1];\n this.L[1] = this.L[this.count()];\n this.L.pop();\n this.fixDown(1);\n return x;\n }\n\n public add(x: T) {\n this.L.push(x);\n this.fixup(this.count());\n }\n\n /* eslint-disable no-bitwise */\n private fixup(k: number) {\n let _k = k;\n while (_k > 1 && (this.comp.compare(this.L[_k >> 1], this.L[_k]) > 0)) {\n const tmp = this.L[_k >> 1];\n this.L[_k >> 1] = this.L[_k];\n this.L[_k] = tmp;\n _k = _k >> 1;\n }\n }\n\n private fixDown(k: number) {\n let _k = k;\n while ((_k << 1) <= (this.count())) {\n let j = _k << 1;\n if ((j < this.count()) && (this.comp.compare(this.L[j], this.L[j + 1]) > 0)) {\n j++;\n }\n if (this.comp.compare(this.L[_k], this.L[j]) <= 0) {\n break;\n }\n const tmp = this.L[_k];\n this.L[_k] = this.L[j];\n this.L[j] = tmp;\n _k = j;\n }\n }\n /* eslint-enable no-bitwise */\n}\n\nexport const RBColor = {\n RED: 0,\n BLACK: 1,\n} as const;\nexport type RBColor = typeof RBColor[keyof typeof RBColor];\n\nexport interface RBNode<TKey, TData> {\n key: TKey;\n data: TData;\n left: RBNode<TKey, TData> | undefined;\n right: RBNode<TKey, TData> | undefined;\n color: RBColor;\n size: number;\n}\n\nexport interface IRBAugmentation<TKey, TData> {\n update(node: RBNode<TKey, TData>): void;\n}\n\nexport interface IRBMatcher<TKey, TData> {\n continueSubtree(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n matchNode(node: RBNode<TKey, TData> | undefined, key: TKey): boolean;\n}\n\nexport interface RBNodeActions<TKey, TData> {\n infix?(node: RBNode<TKey, TData>): boolean;\n pre?(node: RBNode<TKey, TData>): boolean;\n post?(node: RBNode<TKey, TData>): boolean;\n showStructure?: boolean;\n}\n\nexport class RedBlackTree<TKey, TData> implements SortedDictionary<TKey, TData> {\n private root: RBNode<TKey, TData> | undefined;\n\n constructor(\n private readonly compareKeys: KeyComparer<TKey>,\n private readonly aug?: IRBAugmentation<TKey, TData>,\n ) { }\n\n private makeNode(key: TKey, data: TData, color: RBColor, size: number) {\n return <RBNode<TKey, TData>>{ key, data, color, size };\n }\n\n private isRed(node: RBNode<TKey, TData> | undefined) {\n return !!node && (node.color === RBColor.RED);\n }\n\n private nodeSize(node: RBNode<TKey, TData> | undefined) {\n return node ? node.size : 0;\n }\n public size() {\n return this.nodeSize(this.root);\n }\n public isEmpty() {\n return !this.root;\n }\n public get(key: TKey) {\n if (key !== undefined) {\n return this.nodeGet(this.root, key);\n }\n }\n private nodeGet(node: RBNode<TKey, TData> | undefined, key: TKey) {\n let _node = node;\n while (_node) {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node = _node.left;\n } else if (cmp > 0) {\n _node = _node.right;\n } else {\n return _node;\n }\n }\n }\n private contains(key: TKey) {\n return this.get(key);\n }\n\n public gather(key: TKey, matcher: IRBMatcher<TKey, TData>) {\n const results = [] as RBNode<TKey, TData>[];\n if (key !== undefined) {\n this.nodeGather(this.root, results, key, matcher);\n }\n return results;\n }\n\n private nodeGather(\n node: RBNode<TKey, TData> | undefined,\n results: RBNode<TKey, TData>[],\n key: TKey,\n matcher: IRBMatcher<TKey, TData>) {\n if (node) {\n if (matcher.continueSubtree(node.left, key)) {\n this.nodeGather(node.left, results, key, matcher);\n }\n if (matcher.matchNode(node, key)) {\n results.push(node);\n }\n if (matcher.continueSubtree(node.right, key)) {\n this.nodeGather(node.right, results, key, matcher);\n }\n }\n }\n\n public walkExactMatchesForward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesForward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesForward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesForward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesForward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public walkExactMatchesBackward(\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (number: number) => boolean,\n continueRightFn: (number: number) => boolean) {\n this.nodeWalkExactMatchesBackward(this.root, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n\n private nodeWalkExactMatchesBackward(\n node: RBNode<TKey, TData> | undefined,\n compareFn: (node: RBNode<TKey, TData>) => number,\n actionFn: (node: RBNode<TKey, TData>) => void,\n continueLeftFn: (cmp: number) => boolean,\n continueRightFn: (cmp: number) => boolean) {\n if (!node) {\n return;\n }\n const result: number = compareFn(node);\n if (continueRightFn(result)) {\n this.nodeWalkExactMatchesBackward(node.right, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n if (result === 0) {\n actionFn(node);\n }\n if (continueLeftFn(result)) {\n this.nodeWalkExactMatchesBackward(node.left, compareFn, actionFn, continueLeftFn, continueRightFn);\n }\n }\n\n public put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>) {\n if (key !== undefined) {\n if (data === undefined) {\n this.remove(key);\n } else {\n this.root = this.nodePut(this.root, key, data, conflict);\n this.root.color = RBColor.BLACK;\n }\n }\n }\n\n private nodePut(\n node: RBNode<TKey, TData> | undefined,\n key: TKey, data: TData,\n conflict?: ConflictAction<TKey, TData>,\n ) {\n let _node = node;\n if (!_node) {\n return this.makeNode(key, data, RBColor.RED, 1);\n } else {\n const cmp = this.compareKeys(key, _node.key);\n if (cmp < 0) {\n _node.left = this.nodePut(_node.left, key, data, conflict);\n } else if (cmp > 0) {\n _node.right = this.nodePut(_node.right, key, data, conflict);\n } else {\n if (conflict) {\n const kd = conflict(key, _node.key, data, _node.data);\n if (kd.key) {\n _node.key = kd.key;\n }\n if (kd.data) {\n _node.data = kd.data;\n } else {\n _node.data = data;\n }\n } else {\n _node.data = data;\n }\n }\n if (this.isRed(_node.right) && (!this.isRed(_node.left))) {\n _node = this.rotateLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left) && this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n }\n if (this.isRed(_node.left) && this.isRed(_node.right)) {\n this.flipColors(_node);\n }\n _node.size = this.nodeSize(_node.left) + this.nodeSize(_node.right) + 1;\n if (this.aug) {\n this.updateLocal(_node);\n }\n return _node;\n }\n }\n\n private updateLocal(node: RBNode<TKey, TData>) {\n if (this.aug) {\n if (this.isRed(node.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.left!);\n }\n if (this.isRed(node.right)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.aug.update(node.right!);\n }\n this.aug.update(node);\n }\n }\n\n private nodeRemoveMin(node: RBNode<TKey, TData>) {\n let _node = node;\n if (_node.left) {\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left.left))) {\n _node = this.moveRedLeft(_node);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemoveMin(_node.left!);\n return this.balance(_node);\n }\n }\n\n public remove(key: TKey) {\n if (key !== undefined) {\n if (!this.contains(key)) {\n return;\n }\n\n this.removeExisting(key);\n }\n // TODO: error on undefined key\n }\n\n public removeExisting(key: TKey) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(this.root!.left)) && (!this.isRed(this.root!.right))) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root!.color = RBColor.RED;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.root = this.nodeRemove(this.root!, key);\n }\n\n private nodeRemove(node: RBNode<TKey, TData>, key: TKey) {\n let _node = node;\n if (this.compareKeys(key, _node.key) < 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.left)) && (!this.isRed(_node.left!.left))) {\n _node = this.moveRedLeft(_node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.left = this.nodeRemove(_node.left!, key);\n } else {\n if (this.isRed(_node.left)) {\n _node = this.rotateRight(_node);\n }\n if ((this.compareKeys(key, _node.key) === 0) && (!_node.right)) {\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if ((!this.isRed(_node.right)) && (!this.isRed(_node.right!.left))) {\n _node = this.moveRedRight(_node);\n }\n if (this.compareKeys(key, _node.key) === 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const subtreeMin = this.nodeMin(_node.right!);\n _node.key = subtreeMin.key;\n _node.data = subtreeMin.data;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemoveMin(_node.right!);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.nodeRemove(_node.right!, key);\n }\n }\n return this.balance(_node);\n }\n\n public floor(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeFloor(this.root, key);\n }\n }\n\n private nodeFloor(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp === 0) {\n return node;\n } else if (cmp < 0) {\n return this.nodeFloor(node.left, key);\n } else {\n const rightFloor = this.nodeFloor(node.right, key);\n if (rightFloor) {\n return rightFloor;\n } else {\n return node;\n }\n }\n }\n }\n\n public ceil(key: TKey) {\n if (!this.isEmpty()) {\n return this.nodeCeil(this.root, key);\n }\n }\n\n private nodeCeil(node: RBNode<TKey, TData> | undefined, key: TKey): RBNode<TKey, TData> | undefined {\n if (node) {\n const cmp = this.compareKeys(key, node.key);\n if (cmp === 0) {\n return node;\n } else if (cmp > 0) {\n return this.nodeCeil(node.right, key);\n } else {\n const leftCeil = this.nodeCeil(node.left, key);\n if (leftCeil) {\n return leftCeil;\n } else {\n return node;\n }\n }\n }\n }\n\n public min() {\n if (this.root) {\n return this.nodeMin(this.root);\n }\n }\n\n private nodeMin(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.left) {\n return node;\n } else {\n return this.nodeMin(node.left);\n }\n }\n\n public max() {\n if (this.root) {\n return this.nodeMax(this.root);\n }\n }\n\n private nodeMax(node: RBNode<TKey, TData>): RBNode<TKey, TData> {\n if (!node.right) {\n return node;\n } else {\n return this.nodeMax(node.right);\n }\n }\n\n private rotateRight(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const leftChild = node.left!;\n node.left = leftChild.right;\n leftChild.right = node;\n leftChild.color = leftChild.right.color;\n leftChild.right.color = RBColor.RED;\n leftChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(leftChild);\n }\n return leftChild;\n }\n\n private rotateLeft(node: RBNode<TKey, TData>) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const rightChild = node.right!;\n node.right = rightChild.left;\n rightChild.left = node;\n rightChild.color = rightChild.left.color;\n rightChild.left.color = RBColor.RED;\n rightChild.size = node.size;\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.updateLocal(node);\n this.updateLocal(rightChild);\n }\n return rightChild;\n }\n\n private oppositeColor(c: RBColor) {\n return (c === RBColor.BLACK) ? RBColor.RED : RBColor.BLACK;\n }\n\n private flipColors(node: RBNode<TKey, TData>) {\n node.color = this.oppositeColor(node.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.left!.color = this.oppositeColor(node.left!.color);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n node.right!.color = this.oppositeColor(node.right!.color);\n }\n\n private moveRedLeft(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.right!.left)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n _node.right = this.rotateRight(_node.right!);\n _node = this.rotateLeft(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private moveRedRight(node: RBNode<TKey, TData>) {\n let _node = node;\n this.flipColors(_node);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(_node.left!.left)) {\n _node = this.rotateRight(_node);\n this.flipColors(_node);\n }\n return _node;\n }\n\n private balance(input: RBNode<TKey, TData>) {\n let node: RBNode<TKey, TData> | undefined = input;\n if (this.isRed(node.right)) {\n node = this.rotateLeft(node);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.isRed(node.left) && this.isRed(node.left!.left)) {\n node = this.rotateRight(node);\n }\n if (this.isRed(node.left) && (this.isRed(node.right))) {\n this.flipColors(node);\n }\n node.size = this.nodeSize(node.left) + this.nodeSize(node.right) + 1;\n if (this.aug) {\n this.aug.update(node);\n }\n return node;\n }\n\n public mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey) {\n this.nodeMap(this.root, action, start, end);\n }\n\n public map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum) {\n // TODO: optimize to avoid comparisons\n this.nodeMap(this.root, action, accum);\n }\n\n public keys() {\n const keyList = <TKey[]>[];\n const actions = <RBNodeActions<TKey, TData>>{\n showStructure: true,\n infix: (node) => {\n keyList.push(node.key);\n return true;\n },\n };\n this.walk(actions);\n return keyList;\n }\n\n /**\n * Depth-first traversal with custom action; if action returns\n * false, traversal is halted.\n * @param action - action to apply to each node\n */\n public walk(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalk(this.root, actions);\n }\n\n public walkBackward(actions: RBNodeActions<TKey, TData>) {\n this.nodeWalkBackward(this.root, actions);\n }\n\n private nodeWalk(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.left) {\n go = this.nodeWalk(node.left, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalk(node.right, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeWalkBackward(node: RBNode<TKey, TData> | undefined, actions: RBNodeActions<TKey, TData>): boolean {\n let go = true;\n if (node) {\n if (actions.pre) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.pre(node);\n }\n }\n if (node.right) {\n go = this.nodeWalkBackward(node.right, actions);\n }\n if (go && actions.infix) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.infix(node);\n }\n }\n if (go) {\n go = this.nodeWalkBackward(node.left, actions);\n }\n if (go && actions.post) {\n if (actions.showStructure || (node.color === RBColor.BLACK)) {\n go = actions.post(node);\n }\n }\n }\n return go;\n }\n\n private nodeMap<TAccum>(\n node: RBNode<TKey, TData> | undefined,\n action: PropertyAction<TKey, TData>,\n accum?: TAccum,\n start?: TKey,\n end?: TKey,\n ): boolean {\n let _start = start;\n let _end = end;\n if (!node) {\n return true;\n }\n if (_start === undefined) {\n _start = this.nodeMin(node).key;\n }\n if (_end === undefined) {\n _end = this.nodeMax(node).key;\n }\n const cmpStart = this.compareKeys(_start, node.key);\n const cmpEnd = this.compareKeys(_end, node.key);\n let go = true;\n if (cmpStart < 0) {\n go = this.nodeMap(node.left, action, accum, _start, _end);\n }\n if (go && (cmpStart <= 0) && (cmpEnd >= 0)) {\n // REVIEW: test for black node here\n go = action(node, accum);\n }\n if (go && (cmpEnd > 0)) {\n go = this.nodeMap(node.right, action, accum, _start, _end);\n }\n return go;\n }\n}\n\nexport interface AugmentedIntervalNode {\n minmax: IInterval;\n}\n\nexport const integerRangeToString = (range: IIntegerRange) => `[${range.start},${range.end})`;\n\nexport interface IInterval {\n clone(): IInterval;\n compare(b: IInterval): number;\n compareStart(b: IInterval): number;\n compareEnd(b: IInterval): number;\n modify(label: string, start: number, end: number, op?: ISequencedDocumentMessage): IInterval | undefined;\n overlaps(b: IInterval): boolean;\n union(b: IInterval): IInterval;\n}\n\nconst intervalComparer = (a: IInterval, b: IInterval) => a.compare(b);\nexport type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;\nexport type IntervalConflictResolver<TInterval> = (a: TInterval, b: TInterval) => TInterval;\n\nexport class IntervalTree<T extends IInterval> implements IRBAugmentation<T, AugmentedIntervalNode>,\n IRBMatcher<T, AugmentedIntervalNode> {\n public intervals = new RedBlackTree<T, AugmentedIntervalNode>(intervalComparer, this);\n\n public remove(x: T) {\n this.intervals.remove(x);\n }\n\n public removeExisting(x: T) {\n this.intervals.removeExisting(x);\n }\n\n public put(x: T, conflict?: IntervalConflictResolver<T>) {\n let rbConflict: ConflictAction<T, AugmentedIntervalNode> | undefined;\n if (conflict) {\n rbConflict = (key: T, currentKey: T) => {\n const ival = conflict(key, currentKey);\n return {\n key: ival,\n };\n };\n }\n this.intervals.put(x, { minmax: x.clone() }, rbConflict);\n }\n\n public map(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapUntil(fn: (X: T) => boolean) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n return fn(node.key);\n },\n showStructure: true,\n };\n this.intervals.walk(actions);\n }\n\n public mapBackward(fn: (x: T) => void) {\n const actions = <RBNodeActions<T, AugmentedIntervalNode>>{\n infix: (node) => {\n fn(node.key);\n return true;\n },\n showStructure: true,\n };\n this.intervals.walkBackward(actions);\n }\n\n // TODO: toString()\n public match(x: T) {\n return this.intervals.gather(x, this);\n }\n\n public matchNode(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.key.overlaps(key);\n }\n\n public continueSubtree(node: IntervalNode<T> | undefined, key: T) {\n return !!node && node.data.minmax.overlaps(key);\n }\n\n public update(node: IntervalNode<T>) {\n if (node.left && node.right) {\n node.data.minmax = node.key.union(\n node.left.data.minmax.union(node.right.data.minmax));\n } else {\n if (node.left) {\n node.data.minmax = node.key.union(node.left.data.minmax);\n } else if (node.right) {\n node.data.minmax = node.key.union(node.right.data.minmax);\n } else {\n node.data.minmax = node.key.clone();\n }\n }\n }\n}\n\nexport interface TSTResult<T> {\n key: string;\n val: T;\n}\n\nexport interface TSTNode<T> {\n c: string;\n left?: TSTNode<T>;\n mid?: TSTNode<T>;\n right?: TSTNode<T>;\n val?: T;\n}\n\ninterface TSTPrefix {\n text: string;\n}\n\nexport interface ProxString<T> {\n text: string;\n invDistance: number;\n val: T;\n}\n\nexport class TST<T> {\n private n = 0;\n private root: TSTNode<T> | undefined;\n\n public size() {\n return this.n;\n }\n\n private contains(key: string) {\n return this.get(key);\n }\n\n public get(key: string) {\n const x = this.nodeGet(this.root, key, 0);\n if (x === undefined) {\n return undefined;\n }\n return x.val;\n }\n\n private nodeGet(x: TSTNode<T> | undefined, key: string, d: number): TSTNode<T> | undefined {\n if (x === undefined) {\n return undefined;\n }\n const c = key.charAt(d);\n if (c < x.c) {\n return this.nodeGet(x.left, key, d);\n } else if (c > x.c) {\n return this.nodeGet(x.right, key, d);\n } else if (d < (key.length - 1)) {\n return this.nodeGet(x.mid, key, d + 1);\n } else { return x; }\n }\n\n public put(key: string, val: T) {\n if (!this.contains(key)) {\n this.n++;\n }\n this.root = this.nodePut(this.root, key, val, 0);\n }\n\n private nodePut(x: TSTNode<T> | undefined, key: string, val: T, d: number) {\n let _x = x;\n const c = key.charAt(d);\n if (_x === undefined) {\n _x = { c };\n }\n if (c < _x.c) {\n _x.left = this.nodePut(_x.left, key, val, d);\n } else if (c > _x.c) {\n _x.right = this.nodePut(_x.right, key, val, d);\n } else if (d < (key.length - 1)) {\n _x.mid = this.nodePut(_x.mid, key, val, d + 1);\n } else {\n _x.val = val;\n }\n return _x;\n }\n\n public neighbors(text: string, distance = 2) {\n let q = <ProxString<T>[]>[];\n this.nodeProximity(this.root, { text: \"\" }, 0, text, distance, q);\n q = q.filter((value) => (value.text.length > 0));\n return q;\n }\n\n public keysWithPrefix(text: string) {\n const q = <string[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push(text);\n }\n this.collect(x.mid, { text }, q);\n return q;\n }\n\n private collect(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: string[]) {\n if (x === undefined) {\n return;\n }\n this.collect(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push(prefix.text + x.c);\n }\n this.collect(x.mid, { text: prefix.text + x.c }, q);\n this.collect(x.right, prefix, q);\n }\n\n private mapNode(x: TSTNode<T> | undefined, prefix: TSTPrefix, fn: (key: string, val: T) => void) {\n if (x === undefined) {\n return;\n }\n const key = prefix.text + x.c;\n this.mapNode(x.left, prefix, fn);\n if (x.val) {\n fn(key, x.val);\n }\n this.mapNode(x.mid, { text: key }, fn);\n this.mapNode(x.right, prefix, fn);\n }\n\n public map(fn: (key: string, val: T) => void) {\n this.mapNode(this.root, { text: \"\" }, fn);\n }\n\n public pairsWithPrefix(text: string) {\n const q = <TSTResult<T>[]>[];\n const x = this.nodeGet(this.root, text, 0);\n if (x === undefined) {\n return q;\n }\n if (x.val !== undefined) {\n q.push({ key: text, val: x.val });\n }\n this.collectPairs(x.mid, { text }, q);\n return q;\n }\n\n private collectPairs(x: TSTNode<T> | undefined, prefix: TSTPrefix, q: TSTResult<T>[]) {\n if (x === undefined) {\n return;\n }\n this.collectPairs(x.left, prefix, q);\n if (x.val !== undefined) {\n q.push({ key: prefix.text + x.c, val: x.val });\n }\n this.collectPairs(x.mid, { text: prefix.text + x.c }, q);\n this.collectPairs(x.right, prefix, q);\n }\n\n private nodeProximity(\n x: TSTNode<T> | undefined,\n prefix: TSTPrefix,\n d: number,\n pattern: string,\n distance: number,\n q: ProxString<T>[]) {\n if ((x === undefined) || (distance < 0)) {\n return;\n }\n const c = pattern.charAt(d);\n if ((distance > 0) || (c < x.c)) {\n this.nodeProximity(x.left, prefix, d, pattern, distance, q);\n }\n if (x.val !== undefined) {\n const remD = distance - (pattern.length - d);\n if (remD >= 0) {\n let invD = distance;\n if (c !== x.c) {\n invD--;\n }\n q.push({ text: prefix.text + x.c, val: x.val, invDistance: invD });\n }\n }\n const recurD = (d < (pattern.length - 1)) ? d + 1 : d;\n if (c === x.c) {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance, q);\n } else {\n this.nodeProximity(x.mid, { text: prefix.text + x.c }, recurD, pattern, distance - 1, q);\n }\n if ((distance > 0) || (c > x.c)) {\n this.nodeProximity(x.right, prefix, d, pattern, distance, q);\n }\n }\n}\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export * from "./base";
|
|
|
6
6
|
export * from "./client";
|
|
7
7
|
export * from "./collections";
|
|
8
8
|
export * from "./constants";
|
|
9
|
-
export
|
|
9
|
+
export { LocalReference, LocalReferenceCollection } from "./localReference";
|
|
10
10
|
export * from "./mergeTree";
|
|
11
11
|
export * from "./mergeTreeDeltaCallback";
|
|
12
12
|
export * from "./mergeTreeTracking";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -6,7 +6,7 @@ export * from "./base";
|
|
|
6
6
|
export * from "./client";
|
|
7
7
|
export * from "./collections";
|
|
8
8
|
export * from "./constants";
|
|
9
|
-
export
|
|
9
|
+
export { LocalReference, LocalReferenceCollection } from "./localReference";
|
|
10
10
|
export * from "./mergeTree";
|
|
11
11
|
export * from "./mergeTreeDeltaCallback";
|
|
12
12
|
export * from "./mergeTreeTracking";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport * from \"./base\";\nexport * from \"./client\";\nexport * from \"./collections\";\nexport * from \"./constants\";\nexport { LocalReference, LocalReferenceCollection } from \"./localReference\";\nexport * from \"./mergeTree\";\nexport * from \"./mergeTreeDeltaCallback\";\nexport * from \"./mergeTreeTracking\";\nexport * from \"./opBuilder\";\nexport * from \"./ops\";\nexport * from \"./properties\";\nexport * from \"./segmentGroupCollection\";\nexport * from \"./segmentPropertiesManager\";\nexport * from \"./snapshotlegacy\";\nexport * from \"./sortedSegmentSet\";\nexport * from \"./textSegment\";\nexport * from \"./referencePositions\";\n"]}
|
package/lib/localReference.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ import { ISegment } from "./mergeTree";
|
|
|
8
8
|
import { ICombiningOp, ReferenceType } from "./ops";
|
|
9
9
|
import { PropertySet } from "./properties";
|
|
10
10
|
import { ReferencePosition } from "./referencePositions";
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare function _validateReferenceType(refType: ReferenceType): void;
|
|
11
15
|
/**
|
|
12
16
|
* @deprecated - Use ReferencePosition
|
|
13
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localReference.d.ts","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"localReference.d.ts","sourceRoot":"","sources":["../src/localReference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAiC,MAAM,eAAe,CAAC;AACpE,OAAO,EACH,QAAQ,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAiB,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAMH,iBAAiB,EAMpB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,QAe5D;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,iBAAiB;IAoBhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB;;OAEG;IACI,MAAM,EAAE,MAAM;IACd,OAAO;IAzBlB;;OAEG;IACH,gBAAuB,gBAAgB,EAAE,MAAM,CAAM;IAE9C,UAAU,EAAE,WAAW,GAAG,SAAS,CAAC;IAC3C;;OAEG;IACI,SAAS,CAAC,EAAE,cAAc,CAAC;IAClC;;OAEG;IACI,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAErC;;OAEG;gBAEkB,MAAM,EAAE,MAAM,EAC/B,WAAW,EAAE,QAAQ;IACrB;;OAEG;IACI,MAAM,GAAE,MAAU,EAClB,OAAO,gBAAuB,EACrC,UAAU,CAAC,EAAE,WAAW;IAO5B;;OAEG;IACI,GAAG,CAAC,CAAC,EAAE,cAAc;IAG5B;;OAEG;IACI,GAAG,CAAC,CAAC,EAAE,cAAc;IAG5B;;OAEG;IACI,OAAO,CAAC,CAAC,EAAE,cAAc;IAIhC;;OAEG;IACI,UAAU;IAIjB;;OAEG;IACI,aAAa,IAAI,OAAO;IAG/B;;OAEG;IACI,cAAc,IAAI,OAAO;IAGhC;;OAEG;IACI,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAG3C;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAG5C;;OAEG;IACI,aAAa,IAAI,MAAM,EAAE,GAAG,SAAS;IAG5C;;OAEG;IACI,cAAc,IAAI,MAAM,EAAE,GAAG,SAAS;IAItC,MAAM;IAIN,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY;IAI7D;;OAEG;IACI,SAAS;IAIT,UAAU;IAIV,SAAS;IAOT,aAAa;CAGvB;AAED,UAAU,aAAa;IACnB,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9B,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;CAChC;AAMD;;GAEG;AACH,qBAAa,wBAAwB;IA6B7B,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO;WA7Bd,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;IAenD;;;OAGG;IACI,YAAY,EAAE,MAAM,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAa;IAE7B;;;OAGG;;IAEC,gEAAgE;IAC/C,OAAO,EAAE,QAAQ,EAClC,oBAAoB,gCAA6D;IAOrF;;;OAGG;IACI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAiBR,eAAe,cAAc,CAAC;;;IAmB9C;;;OAGG;IACI,KAAK;IAuBZ;;;OAGG;IACH,IAAW,KAAK,YAEf;IAED;;;OAGG;IACI,cAAc,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,GAAG,iBAAiB;IActC;;;OAGG;IACI,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,iBAAiB;IAoB3D;;;OAGG;IACI,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,iBAAiB;IAqC9D;;;;;;;;;OASG;IACI,MAAM,CAAC,KAAK,EAAE,wBAAwB;IAe7C;;;;;;;;;;OAUG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAwBxC,mBAAmB,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,cAAc,GAAG,iBAAiB,CAAC,EAAE;IA2B3E,kBAAkB,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,cAAc,GAAG,iBAAiB,CAAC,EAAE;CA4BpF"}
|
package/lib/localReference.js
CHANGED
|
@@ -3,10 +3,29 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { assert } from "@fluidframework/common-utils";
|
|
6
|
+
import { UsageError } from "@fluidframework/container-utils";
|
|
6
7
|
import { ListMakeHead, ListRemoveEntry } from "./collections";
|
|
7
8
|
import { ReferenceType } from "./ops";
|
|
8
9
|
import { addProperties } from "./properties";
|
|
9
10
|
import { minReferencePosition, maxReferencePosition, compareReferencePositions, refHasTileLabels, refHasRangeLabels, refGetRangeLabels, refGetTileLabels, refHasRangeLabel, refHasTileLabel, refTypeIncludesFlag, } from "./referencePositions";
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export function _validateReferenceType(refType) {
|
|
15
|
+
let exclusiveCount = 0;
|
|
16
|
+
if (refTypeIncludesFlag(refType, ReferenceType.Transient)) {
|
|
17
|
+
++exclusiveCount;
|
|
18
|
+
}
|
|
19
|
+
if (refTypeIncludesFlag(refType, ReferenceType.SlideOnRemove)) {
|
|
20
|
+
++exclusiveCount;
|
|
21
|
+
}
|
|
22
|
+
if (refTypeIncludesFlag(refType, ReferenceType.StayOnRemove)) {
|
|
23
|
+
++exclusiveCount;
|
|
24
|
+
}
|
|
25
|
+
if (exclusiveCount > 1) {
|
|
26
|
+
throw new UsageError("Reference types can only be one of Transient, SlideOnRemove, and StayOnRemove");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
10
29
|
/**
|
|
11
30
|
* @deprecated - Use ReferencePosition
|
|
12
31
|
*/
|
|
@@ -22,6 +41,7 @@ export class LocalReference {
|
|
|
22
41
|
this.client = client;
|
|
23
42
|
this.offset = offset;
|
|
24
43
|
this.refType = refType;
|
|
44
|
+
_validateReferenceType(refType);
|
|
25
45
|
this.segment = initSegment;
|
|
26
46
|
this.properties = properties;
|
|
27
47
|
}
|
|
@@ -245,8 +265,8 @@ export class LocalReferenceCollection {
|
|
|
245
265
|
var _a, _b;
|
|
246
266
|
assert(!refTypeIncludesFlag(lref, ReferenceType.Transient), 0x2df /* "transient references cannot be bound to segments" */);
|
|
247
267
|
assertLocalReferences(lref);
|
|
248
|
-
const refsAtOffset = this.refsByOffset[lref.
|
|
249
|
-
(_a = this.refsByOffset[lref.
|
|
268
|
+
const refsAtOffset = this.refsByOffset[lref.offset] =
|
|
269
|
+
(_a = this.refsByOffset[lref.offset]) !== null && _a !== void 0 ? _a : { at: ListMakeHead() };
|
|
250
270
|
const atRefs = refsAtOffset.at =
|
|
251
271
|
(_b = refsAtOffset.at) !== null && _b !== void 0 ? _b : ListMakeHead();
|
|
252
272
|
atRefs.enqueue(lref);
|