From 520f0298086a320edd6d5755424d934c110053d4 Mon Sep 17 00:00:00 2001 From: Shaun Cutts Date: Tue, 25 Sep 2018 01:24:32 -0400 Subject: [PATCH 1/5] add return type to range for strict mode --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 5550f6a..c2c684e 100644 --- a/index.d.ts +++ b/index.d.ts @@ -23,7 +23,7 @@ export default class SplayTree { isEmpty (): boolean; keys (): Array; values (): Array; - range (minKey:Key, maxKey:Key, visit:TraverseCallback, context?:any); + range (minKey:Key, maxKey:Key, visit:TraverseCallback, context?:any): void; pop (): Node; min (): Key; max (): Key; From aecb61bb174b362b904b2ac4dcbc6ec4929da866 Mon Sep 17 00:00:00 2001 From: Shaun Cutts Date: Mon, 15 Oct 2018 12:13:35 -0400 Subject: [PATCH 2/5] adds removeNode; experimental removeParent; remove works via removeNode --- index.js | 155 +++++++++++++++++++++++++++++++++----- package-lock.json | 2 +- tests/duplicate.test.js | 2 +- tests/remove-node.test.js | 96 +++++++++++++++++++++++ tests/remove.test.js | 13 +++- 5 files changed, 246 insertions(+), 22 deletions(-) create mode 100644 tests/remove-node.test.js diff --git a/index.js b/index.js index 23057d7..c7a881e 100644 --- a/index.js +++ b/index.js @@ -174,29 +174,134 @@ function add (i, data, t, comparator, tree) { /** * Deletes i from the tree if it's there * @param {Key} i - * @param {Tree} tree + * @param {Node} root * @param {Comparator} comparator * @param {Tree} tree * @return {Node} new root */ -function remove (i, t, comparator, tree) { - let x; - if (t === null) return null; - t = splay(i, t, comparator); - var cmp = comparator(i, t.key); - if (cmp === 0) { /* found it */ - if (t.left === null) { - x = t.right; +function remove (i, root, comparator, tree) { + let current = root; + let parent = null; + while (current) { + const cmp = comparator(i, current.key); + if (cmp === 0) { + return removeNode(current, parent, comparator, tree); + } else if (cmp < 0) { + parent = current; + current = current.left; + } else { + parent = current; + current = current.right; + } + } + return tree._root; +} + +/** + * Find parent of node if node is in tree. + * @param {Node} t tree node to find. + * @param {Node} root root of subtree to search under + * @param {Comparator} comparator + * @param {Tree} tree + * @return {Node} parent of node + */ +function findParent (t, root, comparator) { + let current = root; + let parent = null; + while (current) { + const cmp = comparator(t.key, current.key); + if (cmp === 0) { + break; + } else if (cmp < 0) { + parent = current; + current = current.left; + } else { + parent = current; + current = current.right; + } + } + if (current === null) { + return null; + } + // search subtree of equal keys + let parents = []; + while (current !== t) { + if (current.left !== null && + comparator(t.key, current.left.key) === 0) { + parents.push(current); + parent = current; + current = current.left; + } else if (current.right !== null && + comparator(t.key, current.left.key) === 0) { + parent = current; + current = current.right; } else { - x = splay(i, t.left, comparator); - x.right = t.right; + parent = null; + while (parents.length > 0) { + parent = parents.pop(); + if (comparator(t.key, parent.right.key) === 0) { + current = parent.right; + } else { + return null; + } + } } - tree._size--; - return x; } - return t; /* It wasn't there */ + return parent; } +/** + * Removes node from tree + * @param {Node} t tree node to remove + * @param {Node} parent parent of t (null if t is root or unknown) + * @param {Comparator} comparator + * @param {Tree} tree + * @return {Node} new root + */ + +function removeNode(t, parent, comparator, tree) { + let child + if (t.right === null || t.left === null) { + if (t === tree._root) { + tree._size -=1 + return t.right || t.left + } else if (parent === null) { + parent = findParent(t, tree._root, comparator) + } + if (parent === null) { + // t not in tree -- do nothing + return tree._root + } else if (parent.right === t) { + parent.right = t.right + } else { + parent.left = t.left + } + } else { + // replace t with rightmost child of left sub-node, moving child's + // right branch to leftmost branch of t.right + let parent = t + child = t.left + while (child.right !== null) { + parent = child + child = child.right + } + + let left = t.right + while (left.left !== null) { + left = left.left + } + if (parent.right === child) { + parent.right = child.left + } else { + parent.left = child.left + } + left.left = child.right + t.key = child.key + t.data = child.data + } + tree._size -= 1 + return tree._root +} function split (key, v, comparator) { let left, right; @@ -290,6 +395,13 @@ export default class Tree { this._root = remove(key, this._root, this._comparator, this); } + /** + * @param {Node} node + * @param {Node} parent optional parent of node + */ + removeNode (node, parent = null) { + this._root = removeNode(node, parent, this._comparator, this) + } /** * Removes and returns the node with smallest key @@ -299,9 +411,9 @@ export default class Tree { let node = this._root; if (node) { while (node.left) node = node.left; - this._root = splay(node.key, this._root, this._comparator); - this._root = remove(node.key, this._root, this._comparator, this); - return { key: node.key, data: node.data }; + const result = { key: node.key, data: node.data }; + this._root = removeNode(node, null, this._comparator, this); + return result; } return null; } @@ -336,6 +448,15 @@ export default class Tree { return this._root; } + /** + * Find parent of node if node is in tree. + * + * @param {Node} node + * @return {Node|null} + */ + findParent (node) { + return findParent(node, comparator, this) + } /** * @param {Key} key diff --git a/package-lock.json b/package-lock.json index b22f273..7e4a275 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "splaytree", - "version": "2.0.1", + "version": "2.0.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tests/duplicate.test.js b/tests/duplicate.test.js index d45f058..5f63c08 100644 --- a/tests/duplicate.test.js +++ b/tests/duplicate.test.js @@ -35,7 +35,7 @@ describe ('Duplicate keys', () => { const tree = new Tree(); const values = [2, 12, 1, 1, -6, 1, 1]; - values.forEach((v) => tree.insert(v)); + values.forEach((v, i) => tree.insert(v, i)); let size = tree.size; for (let i = 0; i < 4; i++) { diff --git a/tests/remove-node.test.js b/tests/remove-node.test.js new file mode 100644 index 0000000..3798846 --- /dev/null +++ b/tests/remove-node.test.js @@ -0,0 +1,96 @@ +import { describe, it } from 'mocha'; +import { assert } from 'chai'; + +import Tree from '../index'; + +describe('remove node', () => { + it ('should remove a node', () => { + const tree = new Tree(); + const n1 = tree.insert(1); + + tree.removeNode(n1) + assert.isTrue(tree.isEmpty()); + assert.equal(tree.findStatic(1), null); + }) + + it ('should leave nodes with duplicate keys', () => { + const tree = new Tree(); + const n1 = tree.insert(1, 'a'); + const n2 = tree.insert(1, 'b'); + const n3 = tree.insert(1, 'c'); + const n4 = tree.insert(1, 'd'); + const n5 = tree.insert(1, 'e'); + + tree.removeNode(n3); + const range = []; + tree.range(1, 1, node => { + range.push(node.data); + }) + range.sort(); + assert.equal(range.join(''), 'abde'); + }) + it ('should remove leaf node', () => { + const tree = new Tree(); + const n1 = tree.insert(1); + const n2 = tree.insert(2); + const n3 = tree.insert(3); + + tree.removeNode(n1); + const range = []; + tree.range(1, 3, node => { + range.push('' + node.key); + }) + range.sort(); + assert.equal(range.join(''), '23'); + }) + it ('should remove a sub-node', () => { + const tree = new Tree(); + const n1 = tree.insert(1); + const n2 = tree.insert(2); + const n3 = tree.insert(3); + const n4 = tree.insert(4); + const n5 = tree.insert(5); + + tree.removeNode(n4); + const range = []; + tree.range(1, 5, node => { + range.push('' + node.key); + }) + range.sort(); + assert.equal(range.join(''), '1235'); + }) + it ('should remove in tree with duplicates', () => { + const tree = new Tree(); + const values = [2, 12, 1, 1, -6, 1, 1, 2, 0, 2]; + + values.forEach((v) => tree.insert(v)); + let size = values.length + for (const value of values) { + const node = tree.findStatic(value) + assert.exists(node, `didn't find ${value}`) + assert.equal(node.key, value) + tree.removeNode(node); + assert.equal(tree.size, --size); + } + }) + it ('should remove in tree with multiple duplicates', () => { + const tree = new Tree(); + const values = [2, 3, 3, 1, 2, 2, 1, 3, 2, 1, 3, 4, 2, 3, 2, 3, 2]; + + values.forEach((v) => tree.insert(v)); + let count = 1 + for (const value of values) { + const node = tree.findStatic(value) + assert.exists(node, `didn't find ${value} (at ${count})`) + assert.equal(node.key, value) + tree.removeNode(node); + assert.equal(tree.size, values.length - count); + const keys = tree.keys() + keys.sort() + const expectedKeys = values.slice(count) + expectedKeys.sort() + assert.deepEqual(keys, expectedKeys) + count += 1 + } + }) +}) diff --git a/tests/remove.test.js b/tests/remove.test.js index 172a5d5..e7c0a25 100644 --- a/tests/remove.test.js +++ b/tests/remove.test.js @@ -10,6 +10,7 @@ describe('remove', () => { const tree = new Tree(); tree.remove(1); assert.equal(tree.size, 0); + assert.equal(tree.findStatic(1), null); }); @@ -17,7 +18,9 @@ describe('remove', () => { const tree = new Tree(); tree.insert(1); tree.remove(1); + console.log(tree.toString()) assert.isTrue(tree.isEmpty()); + assert.equal(tree.findStatic(1), null); }); @@ -27,6 +30,8 @@ describe('remove', () => { tree.insert(2); tree.remove(1); assert.equal(tree._root.key, 2); + assert.equal(tree.findStatic(1), null); + assert.equal(tree.findStatic(2).key, 2); }); @@ -36,6 +41,8 @@ describe('remove', () => { tree.insert(1); tree.remove(2); assert.equal(tree._root.key, 1); + assert.equal(tree.findStatic(2), null); + assert.equal(tree.findStatic(1).key, 1); }); @@ -48,11 +55,11 @@ describe('remove', () => { tree.remove(2); - assert.equal(n2.key, 2); - assert.equal(n3.key, 3); + assert.equal(tree.findStatic(1).key, 1); + assert.equal(tree.findStatic(2), null); + assert.equal(tree.findStatic(3).key, 3); }); - it ('pop()', () => { const tree = new Tree(); tree.insert(2); From 978a5925b4186115c61ddac723df6aa54729a45d Mon Sep 17 00:00:00 2001 From: Shaun Cutts Date: Mon, 15 Oct 2018 12:19:09 -0400 Subject: [PATCH 3/5] cleanup semicolons and other formatting --- index.js | 57 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/index.js b/index.js index c7a881e..3187b7b 100644 --- a/index.js +++ b/index.js @@ -199,11 +199,10 @@ function remove (i, root, comparator, tree) { /** * Find parent of node if node is in tree. - * @param {Node} t tree node to find. - * @param {Node} root root of subtree to search under + * @param {Node} t tree node to find. + * @param {Node} root root of subtree to search under * @param {Comparator} comparator - * @param {Tree} tree - * @return {Node} parent of node + * @return {Node} parent of node */ function findParent (t, root, comparator) { let current = root; @@ -252,55 +251,55 @@ function findParent (t, root, comparator) { /** * Removes node from tree - * @param {Node} t tree node to remove - * @param {Node} parent parent of t (null if t is root or unknown) + * @param {Node} t tree node to remove + * @param {Node} parent parent of t (null if t root or unknown) * @param {Comparator} comparator - * @param {Tree} tree + * @param {Tree} tree * @return {Node} new root */ function removeNode(t, parent, comparator, tree) { - let child + let child; if (t.right === null || t.left === null) { if (t === tree._root) { - tree._size -=1 - return t.right || t.left + tree._size -=1; + return t.right || t.left; } else if (parent === null) { - parent = findParent(t, tree._root, comparator) + parent = findParent(t, tree._root, comparator); } if (parent === null) { // t not in tree -- do nothing - return tree._root + return tree._root; } else if (parent.right === t) { - parent.right = t.right + parent.right = t.right; } else { - parent.left = t.left + parent.left = t.left; } } else { - // replace t with rightmost child of left sub-node, moving child's + // replace t with rightmost child of left sub-node, moving child's // right branch to leftmost branch of t.right - let parent = t - child = t.left + let parent = t; + child = t.left; while (child.right !== null) { - parent = child - child = child.right + parent = child; + child = child.right; } - let left = t.right + let left = t.right; while (left.left !== null) { - left = left.left + left = left.left; } if (parent.right === child) { - parent.right = child.left + parent.right = child.left; } else { - parent.left = child.left + parent.left = child.left; } - left.left = child.right - t.key = child.key - t.data = child.data + left.left = child.right; + t.key = child.key; + t.data = child.data; } - tree._size -= 1 - return tree._root + tree._size -= 1; + return tree._root; } function split (key, v, comparator) { @@ -455,7 +454,7 @@ export default class Tree { * @return {Node|null} */ findParent (node) { - return findParent(node, comparator, this) + return findParent(node, this._root, comparator); } /** From 5a819e0263bc5f03088dc3a6b2ae836b6f6c2c7e Mon Sep 17 00:00:00 2001 From: Shaun Cutts Date: Mon, 15 Oct 2018 18:43:19 -0400 Subject: [PATCH 4/5] cleanup typescript types; tweak tests to check return values --- index.d.ts | 5 ++++- index.js | 9 +++++++-- tests/remove.test.js | 7 ++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/index.d.ts b/index.d.ts index 5550f6a..73d6cd2 100644 --- a/index.d.ts +++ b/index.d.ts @@ -17,7 +17,10 @@ export default class SplayTree { insert (key: Key, data?: Value): Node; add (key: Key, data?: Value): Node; remove (key: Key): boolean; - find (key: Key): Node; + removeNode (node: Node): boolean; + find (key: Key): Node | null; + findStatic(key: Key): Node | null; + findParent(node: Node): Node | null; at (index: number): Node; contains (key: Key): boolean; isEmpty (): boolean; diff --git a/index.js b/index.js index 3187b7b..6590f18 100644 --- a/index.js +++ b/index.js @@ -388,22 +388,27 @@ export default class Tree { /** * @param {Key} key - * @return {Node|null} + * @return boolean true if node removed. */ remove (key) { + const size = this._size this._root = remove(key, this._root, this._comparator, this); + return size > this._size; } /** * @param {Node} node * @param {Node} parent optional parent of node + * @return boolean true if node removed. */ removeNode (node, parent = null) { + const size = this._size this._root = removeNode(node, parent, this._comparator, this) + return size > this._size; } /** - * Removes and returns the node with smallest key + * Removes and returns a node with smallest key * @return {?Node} */ pop () { diff --git a/tests/remove.test.js b/tests/remove.test.js index e7c0a25..ca27673 100644 --- a/tests/remove.test.js +++ b/tests/remove.test.js @@ -8,7 +8,8 @@ describe('remove', () => { it ('should not change the size of empty tree', () => { const tree = new Tree(); - tree.remove(1); + const result = tree.remove(1); + assert.equal(result, false); assert.equal(tree.size, 0); assert.equal(tree.findStatic(1), null); }); @@ -17,8 +18,8 @@ describe('remove', () => { it ('should remove a single key', () => { const tree = new Tree(); tree.insert(1); - tree.remove(1); - console.log(tree.toString()) + const result = tree.remove(1); + assert.equal(result, true); assert.isTrue(tree.isEmpty()); assert.equal(tree.findStatic(1), null); }); From 56444041963cb2ac4e868f6704fb0c6c1ba613f7 Mon Sep 17 00:00:00 2001 From: Shaun Cutts Date: Tue, 16 Oct 2018 01:25:44 -0400 Subject: [PATCH 5/5] cleans up for lint and builds "dist" --- dist/splay.es6.js | 163 ++++++++++++++++++++++++++++++++++++----- dist/splay.es6.js.map | 2 +- dist/splay.js | 165 +++++++++++++++++++++++++++++++++++++----- dist/splay.js.map | 2 +- index.js | 28 +++---- 5 files changed, 306 insertions(+), 54 deletions(-) diff --git a/dist/splay.es6.js b/dist/splay.es6.js index 62bbb0d..3a02802 100644 --- a/dist/splay.es6.js +++ b/dist/splay.es6.js @@ -183,29 +183,133 @@ function add (i, data, t, comparator, tree) { /** * Deletes i from the tree if it's there * @param {Key} i - * @param {Tree} tree + * @param {Node} root * @param {Comparator} comparator * @param {Tree} tree * @return {Node} new root */ -function remove (i, t, comparator, tree) { - let x; - if (t === null) return null; - t = splay(i, t, comparator); - var cmp = comparator(i, t.key); - if (cmp === 0) { /* found it */ - if (t.left === null) { - x = t.right; +function remove (i, root, comparator, tree) { + let current = root; + let parent = null; + while (current) { + const cmp = comparator(i, current.key); + if (cmp === 0) { + return removeNode(current, parent, comparator, tree); + } else if (cmp < 0) { + parent = current; + current = current.left; } else { - x = splay(i, t.left, comparator); - x.right = t.right; + parent = current; + current = current.right; } - tree._size--; - return x; } - return t; /* It wasn't there */ + return tree._root; } +/** + * Find parent of node if node is in tree. + * @param {Node} t tree node to find. + * @param {Node} root root of subtree to search under + * @param {Comparator} comparator + * @return {Node} parent of node + */ +function findParent (t, root, comparator) { + let current = root; + let parent = null; + while (current) { + const cmp = comparator(t.key, current.key); + if (cmp === 0) { + break; + } else if (cmp < 0) { + parent = current; + current = current.left; + } else { + parent = current; + current = current.right; + } + } + if (current === null) { + return null; + } + // search subtree of equal keys + let parents = []; + while (current !== t) { + if (current.left !== null + && comparator(t.key, current.left.key) === 0) { + parents.push(current); + parent = current; + current = current.left; + } else if (current.right !== null + && comparator(t.key, current.left.key) === 0) { + parent = current; + current = current.right; + } else { + parent = null; + while (parents.length > 0) { + parent = parents.pop(); + if (comparator(t.key, parent.right.key) === 0) { + current = parent.right; + } else { + return null; + } + } + } + } + return parent; +} + +/** + * Removes node from tree + * @param {Node} t tree node to remove + * @param {Node} parent parent of t (null if t root or unknown) + * @param {Comparator} comparator + * @param {Tree} tree + * @return {Node} new root + */ + +function removeNode(t, parent, comparator, tree) { + let child; + if (t.right === null || t.left === null) { + if (t === tree._root) { + tree._size -= 1; + return t.right || t.left; + } else if (parent === null) { + parent = findParent(t, tree._root, comparator); + } + if (parent === null) { + // t not in tree -- do nothing + return tree._root; + } else if (parent.right === t) { + parent.right = t.right; + } else { + parent.left = t.left; + } + } else { + // replace t with rightmost child of left sub-node, moving child's + // right branch to leftmost branch of t.right + let parent = t; + child = t.left; + while (child.right !== null) { + parent = child; + child = child.right; + } + + let left = t.right; + while (left.left !== null) { + left = left.left; + } + if (parent.right === child) { + parent.right = child.left; + } else { + parent.left = child.left; + } + left.left = child.right; + t.key = child.key; + t.data = child.data; + } + tree._size -= 1; + return tree._root; +} function split (key, v, comparator) { let left, right; @@ -293,24 +397,36 @@ class Tree { /** * @param {Key} key - * @return {Node|null} + * @return boolean true if node removed. */ remove (key) { + const size = this._size; this._root = remove(key, this._root, this._comparator, this); + return size > this._size; } + /** + * @param {Node} node + * @param {Node} parent optional parent of node + * @return boolean true if node removed. + */ + removeNode (node, parent = null) { + const size = this._size; + this._root = removeNode(node, parent, this._comparator, this); + return size > this._size; + } /** - * Removes and returns the node with smallest key + * Removes and returns a node with smallest key * @return {?Node} */ pop () { let node = this._root; if (node) { while (node.left) node = node.left; - this._root = splay(node.key, this._root, this._comparator); - this._root = remove(node.key, this._root, this._comparator, this); - return { key: node.key, data: node.data }; + const result = { key: node.key, data: node.data }; + this._root = removeNode(node, null, this._comparator, this); + return result; } return null; } @@ -345,6 +461,15 @@ class Tree { return this._root; } + /** + * Find parent of node if node is in tree. + * + * @param {Node} node + * @return {Node|null} + */ + findParent (node) { + return findParent(node, this._root, this._comparator); + } /** * @param {Key} key diff --git a/dist/splay.es6.js.map b/dist/splay.es6.js.map index b1e315e..bc88510 100644 --- a/dist/splay.es6.js.map +++ b/dist/splay.es6.js.map @@ -1 +1 @@ -{"version":3,"file":"splay.es6.js","sources":["../index.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAM,IAAI,CAAC;;EAET,WAAW,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;IACtB,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC;IAClB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IACnB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;GACpB;CACF;;AAED,SAAS,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;;;;;;;;;AAStE,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE;EAChC,IAAI,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;EACzB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EACZ,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;EACrB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;EAEV,OAAO,IAAI,EAAE;IACX,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;;IAEjC,IAAI,GAAG,GAAG,CAAC,EAAE;MACX,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM;;MAE3B,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACjC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACX,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;QACjB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC,GAAG,CAAC,CAAC;QACN,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM;OAC5B;MACD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;MACX,CAAC,GAAG,CAAC,CAAC;MACN,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;KAEZ,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;MAClB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,MAAM;;MAE5B,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAClC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACX,CAAC,GAAG,CAAC,CAAC;QACN,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,MAAM;OAC7B;MACD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;MACZ,CAAC,GAAG,CAAC,CAAC;MACN,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;KACb,MAAM;MACL,MAAM;KACP;GACF;;EAED,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;EACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;EACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;EACjB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;EACjB,OAAO,CAAC,CAAC;CACV;;;;;;;;;;AAUD,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;EAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;EAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;;EAEb,IAAI,CAAC,KAAK,IAAI,EAAE;IACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,CAAC;GACb;;EAED,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;EAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;EACjC,IAAI,GAAG,GAAG,CAAC,EAAE;IACX,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACf,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;GACf,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;IACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;GAChB;EACD,OAAO,IAAI,CAAC;CACb;;;;;;;;;;;AAWD,SAAS,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;EAC1C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;EAE/B,IAAI,CAAC,KAAK,IAAI,EAAE;IACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,OAAO,IAAI,CAAC;GACb;;EAED,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;EAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;EACjC,IAAI,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;OACnB;IACH,IAAI,GAAG,GAAG,CAAC,EAAE;MACX,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;MACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;MACf,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;KACf,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;MAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;MACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;MACd,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;KAChB;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,OAAO,IAAI,CAAC;GACb;CACF;;;;;;;;;;;AAWD,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;EACvC,IAAI,CAAC,CAAC;EACN,IAAI,CAAC,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC;EAC5B,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;EAC5B,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;EAC/B,IAAI,GAAG,KAAK,CAAC,EAAE;IACb,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE;MACnB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;KACb,MAAM;MACL,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;MACjC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;KACnB;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,OAAO,CAAC,CAAC;GACV;EACD,OAAO,CAAC,CAAC;CACV;;;AAGD,SAAS,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE;EAClC,IAAI,IAAI,EAAE,KAAK,CAAC;EAChB,IAAI,CAAC,KAAK,IAAI,EAAE;IACd,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;GACrB,MAAM;IACL,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;;IAE9B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,CAAC,EAAE;MACb,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;MACf,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;KACjB,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;MAClB,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;MAClB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;MACf,IAAI,MAAM,CAAC,CAAC;KACb,MAAM;MACL,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;MAChB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;MACd,KAAK,IAAI,CAAC,CAAC;KACZ;GACF;EACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;CACxB;;;AAGD,SAAS,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;EACvC,IAAI,KAAK,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC;EAChC,IAAI,IAAI,MAAM,IAAI,EAAE,OAAO,KAAK,CAAC;;EAEjC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;EAC3C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;EAClB,OAAO,KAAK,CAAC;CACd;;;;;;;;;;;AAWD,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE;EACvD,IAAI,IAAI,EAAE;IACR,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,GAAG,EAAE,SAAS,CAAC,CAAC;GACrE;CACF;;;AAGD,AAAe,MAAM,IAAI,CAAC;;EAExB,WAAW,CAAC,CAAC,UAAU,GAAG,eAAe,EAAE;IACzC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;GAChB;;;;;;;;;EASD,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;IACjB,OAAO,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;GAC3E;;;;;;;;;EASD,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;IACd,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;GACxE;;;;;;;EAOD,MAAM,CAAC,CAAC,GAAG,EAAE;IACX,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;GAC9D;;;;;;;EAOD,GAAG,CAAC,GAAG;IACL,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,IAAI,IAAI,EAAE;MACR,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;MACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;MAC5D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;MAClE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KAC3C;IACD,OAAO,IAAI,CAAC;GACb;;;;;;;EAOD,UAAU,CAAC,CAAC,GAAG,EAAE;IACf,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACjC,OAAO,OAAO,EAAE;MACd,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;MACtC,IAAI,GAAG,KAAK,CAAC,KAAK,OAAO,OAAO,CAAC;WAC5B,IAAI,GAAG,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;wBACvB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;KAC3C;IACD,OAAO,IAAI,CAAC;GACb;;;;;;;EAOD,IAAI,CAAC,CAAC,GAAG,EAAE;IACT,IAAI,IAAI,CAAC,KAAK,EAAE;MACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;MACtD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;KAC9D;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;GACnB;;;;;;;EAOD,QAAQ,CAAC,CAAC,GAAG,EAAE;IACb,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACjC,OAAO,OAAO,EAAE;MACd,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;MACtC,IAAI,GAAG,KAAK,CAAC,KAAK,OAAO,IAAI,CAAC;WACzB,IAAI,GAAG,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;wBACvB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;KAC3C;IACD,OAAO,KAAK,CAAC;GACd;;;;;;;;EAQD,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,IAAI,IAAI,GAAG,KAAK,CAAC;;IAEjB,OAAO,CAAC,IAAI,EAAE;MACZ,IAAI,OAAO,MAAM,IAAI,EAAE;QACrB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;UAClB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;UAClB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;;UAE3B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB,MAAM,IAAI,GAAG,IAAI,CAAC;OACpB;KACF;IACD,OAAO,IAAI,CAAC;GACb;;;;;;;;;;;EAWD,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE;IACzB,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACjC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;;IAE3B,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE;MAC7B,IAAI,IAAI,EAAE;QACR,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;OAClB,MAAM;QACL,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACf,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC,EAAE;UACX,MAAM;SACP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;UACtC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC;SACrC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;OACnB;KACF;IACD,OAAO,IAAI,CAAC;GACb;;;;;;;EAOD,IAAI,CAAC,GAAG;IACN,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;GACb;;;;;;;EAOD,MAAM,CAAC,GAAG;IACR,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;GACf;;;;;;EAMD,GAAG,GAAG;IACJ,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,IAAI,CAAC;GACb;;;;;;EAMD,GAAG,GAAG;IACJ,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,IAAI,CAAC;GACb;;;;;;EAMD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACjC,OAAO,CAAC,CAAC;GACV;;;;;;EAMD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IACnC,OAAO,CAAC,CAAC;GACV;;;;;;;;EAQD,EAAE,CAAC,CAAC,KAAK,EAAE;IACT,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,EAAE,CAAC;;IAEb,OAAO,CAAC,IAAI,EAAE;MACZ,IAAI,OAAO,EAAE;QACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;UAChB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;UAClB,IAAI,CAAC,KAAK,KAAK,EAAE,OAAO,OAAO,CAAC;UAChC,CAAC,EAAE,CAAC;UACJ,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB,MAAM,IAAI,GAAG,IAAI,CAAC;OACpB;KACF;IACD,OAAO,IAAI,CAAC;GACb;;;;;;;EAOD,IAAI,CAAC,CAAC,CAAC,EAAE;IACP,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,IAAI,SAAS,GAAG,IAAI,CAAC;;IAErB,IAAI,CAAC,CAAC,KAAK,EAAE;MACX,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;MACpB,OAAO,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;MAClD,OAAO,SAAS,CAAC;KAClB;;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;IACpC,OAAO,IAAI,EAAE;MACX,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;MACxC,IAAI,GAAG,KAAK,CAAC,EAAE,MAAM;WAChB,IAAI,GAAG,GAAG,CAAC,EAAE;QAChB,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;OAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;KAC1B;;IAED,OAAO,SAAS,CAAC;GAClB;;;;;;;EAOD,IAAI,CAAC,CAAC,CAAC,EAAE;IACP,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,IAAI,WAAW,GAAG,IAAI,CAAC;;IAEvB,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE;MACnB,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC;MACrB,OAAO,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC;MAC1D,OAAO,WAAW,CAAC;KACpB;;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;IACpC,OAAO,IAAI,EAAE;MACX,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;MACxC,IAAI,GAAG,KAAK,CAAC,EAAE,MAAM;WAChB,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;WAC9B;QACH,WAAW,GAAG,IAAI,CAAC;QACnB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;OACnB;KACF;IACD,OAAO,WAAW,CAAC;GACpB;;;;;;EAMD,KAAK,GAAG;IACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;GACb;;;;;;EAMD,MAAM,GAAG;IACP,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;GAC3B;;;;;;;;;;;;EAYD,IAAI,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,KAAK,EAAE;IAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;;;IAGpC,IAAI,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;;IAEzD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;MACvB,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;MAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;KACnB,MAAM;MACL,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;MACnF,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;MACzB,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;KAC7D;IACD,OAAO,IAAI,CAAC;GACb;;;;;;EAMD,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE;;EAEzC,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;;;;;;;EAOlC,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;IAClC,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;GACrB;;;EAGD,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;IACpC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;MAC/B,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;KAC1D,MAAM;MACL,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;KACxD;IACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;GAC7C;;;EAGD,KAAK,CAAC,GAAG,EAAE;IACT,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;GACjD;CACF;;;AAGD,SAAS,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;EACxD,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;EACzB,IAAI,IAAI,GAAG,CAAC,EAAE;IACZ,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,IAAI,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC;GACb;EACD,OAAO,IAAI,CAAC;CACb;;;AAGD,SAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;EAChC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;EAC5B,IAAI,CAAC,GAAG,IAAI,CAAC;EACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACpC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;GAChD;EACD,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;EACd,OAAO,IAAI,CAAC,IAAI,CAAC;CAClB;;;AAGD,SAAS,MAAM,EAAE,IAAI,EAAE;EACrB,IAAI,OAAO,GAAG,IAAI,CAAC;EACnB,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,KAAK,CAAC;;EAEzB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;EAC5B,IAAI,CAAC,GAAG,IAAI,CAAC;;EAEb,OAAO,CAAC,IAAI,EAAE;IACZ,IAAI,OAAO,EAAE;MACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;MAChB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;KACxB,MAAM;MACL,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAChB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;OACzB,MAAM,IAAI,GAAG,IAAI,CAAC;KACpB;GACF;EACD,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;EACd,OAAO,IAAI,CAAC,IAAI,CAAC;CAClB;;;AAGD,SAAS,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;EACzC,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;EACzB,IAAI,IAAI,GAAG,CAAC,EAAE;IACZ,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;;IAElD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;IAEjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;IAE3B,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC;GACb;EACD,OAAO,IAAI,CAAC;CACb;;;AAGD,SAAS,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;EACtD,MAAM,IAAI,GAAG,EAAE,CAAC;EAChB,IAAI,CAAC,GAAG,IAAI,CAAC;;EAEb,IAAI,EAAE,GAAG,EAAE,CAAC;EACZ,IAAI,EAAE,GAAG,EAAE,CAAC;;EAEZ,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE;IACjC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;MAC/B,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;MACZ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;KACd,MAAM;MACL,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;MACZ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;KACd;IACD,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;GACZ;;EAED,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;OAC7B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;;EAElC,OAAO,IAAI,CAAC,IAAI,CAAC;CAClB;;;AAGD,SAAS,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;EAChD,IAAI,IAAI,IAAI,KAAK,EAAE,OAAO;;EAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC;EACxC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;EACjB,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;;EAElB,OAAO,IAAI,EAAE;IACX,GAAG,CAAC,EAAE,CAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;IAC5C,GAAG,CAAC,EAAE,CAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;IAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;;IAElB,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;;IAEd,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;GACjB;;EAED,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;EAC1C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;CAC3C;;;;"} \ No newline at end of file +{"version":3,"file":"splay.es6.js","sources":["../index.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Node} root\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, root, comparator, tree) {\n let current = root;\n let parent = null;\n while (current) {\n const cmp = comparator(i, current.key);\n if (cmp === 0) {\n return removeNode(current, parent, comparator, tree);\n } else if (cmp < 0) {\n parent = current;\n current = current.left;\n } else {\n parent = current;\n current = current.right;\n }\n }\n return tree._root;\n}\n\n/**\n * Find parent of node if node is in tree.\n * @param {Node} t tree node to find.\n * @param {Node} root root of subtree to search under\n * @param {Comparator} comparator\n * @return {Node} parent of node\n */\nfunction findParent (t, root, comparator) {\n let current = root;\n let parent = null;\n while (current) {\n const cmp = comparator(t.key, current.key);\n if (cmp === 0) {\n break;\n } else if (cmp < 0) {\n parent = current;\n current = current.left;\n } else {\n parent = current;\n current = current.right;\n }\n }\n if (current === null) {\n return null;\n }\n // search subtree of equal keys\n let parents = [];\n while (current !== t) {\n if (current.left !== null\n && comparator(t.key, current.left.key) === 0) {\n parents.push(current);\n parent = current;\n current = current.left;\n } else if (current.right !== null\n && comparator(t.key, current.left.key) === 0) {\n parent = current;\n current = current.right;\n } else {\n parent = null;\n while (parents.length > 0) {\n parent = parents.pop();\n if (comparator(t.key, parent.right.key) === 0) {\n current = parent.right;\n } else {\n return null;\n }\n }\n }\n }\n return parent;\n}\n\n/**\n * Removes node from tree\n * @param {Node} t tree node to remove\n * @param {Node} parent parent of t (null if t root or unknown)\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\n\nfunction removeNode(t, parent, comparator, tree) {\n let child;\n if (t.right === null || t.left === null) {\n if (t === tree._root) {\n tree._size -= 1;\n return t.right || t.left;\n } else if (parent === null) {\n parent = findParent(t, tree._root, comparator);\n }\n if (parent === null) {\n // t not in tree -- do nothing\n return tree._root;\n } else if (parent.right === t) {\n parent.right = t.right;\n } else {\n parent.left = t.left;\n }\n } else {\n // replace t with rightmost child of left sub-node, moving child's\n // right branch to leftmost branch of t.right\n let parent = t;\n child = t.left;\n while (child.right !== null) {\n parent = child;\n child = child.right;\n }\n\n let left = t.right;\n while (left.left !== null) {\n left = left.left;\n }\n if (parent.right === child) {\n parent.right = child.left;\n } else {\n parent.left = child.left;\n }\n left.left = child.right;\n t.key = child.key;\n t.data = child.data;\n }\n tree._size -= 1;\n return tree._root;\n}\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return boolean true if node removed.\n */\n remove (key) {\n const size = this._size;\n this._root = remove(key, this._root, this._comparator, this);\n return size > this._size;\n }\n\n /**\n * @param {Node} node\n * @param {Node} parent optional parent of node\n * @return boolean true if node removed.\n */\n removeNode (node, parent = null) {\n const size = this._size;\n this._root = removeNode(node, parent, this._comparator, this);\n return size > this._size;\n }\n\n /**\n * Removes and returns a node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n const result = { key: node.key, data: node.data };\n this._root = removeNode(node, null, this._comparator, this);\n return result;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n /**\n * Find parent of node if node is in tree.\n *\n * @param {Node} node\n * @return {Node|null}\n */\n findParent (node) {\n return findParent(node, this._root, this._comparator);\n }\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/splay.js b/dist/splay.js index 7b9d51e..6262e61 100644 --- a/dist/splay.js +++ b/dist/splay.js @@ -186,29 +186,133 @@ /** * Deletes i from the tree if it's there * @param {Key} i - * @param {Tree} tree + * @param {Node} root * @param {Comparator} comparator * @param {Tree} tree * @return {Node} new root */ - function remove (i, t, comparator, tree) { - var x; - if (t === null) { return null; } - t = splay(i, t, comparator); - var cmp = comparator(i, t.key); - if (cmp === 0) { /* found it */ - if (t.left === null) { - x = t.right; + function remove (i, root, comparator, tree) { + var current = root; + var parent = null; + while (current) { + var cmp = comparator(i, current.key); + if (cmp === 0) { + return removeNode(current, parent, comparator, tree); + } else if (cmp < 0) { + parent = current; + current = current.left; } else { - x = splay(i, t.left, comparator); - x.right = t.right; + parent = current; + current = current.right; } - tree._size--; - return x; } - return t; /* It wasn't there */ + return tree._root; } + /** + * Find parent of node if node is in tree. + * @param {Node} t tree node to find. + * @param {Node} root root of subtree to search under + * @param {Comparator} comparator + * @return {Node} parent of node + */ + function findParent (t, root, comparator) { + var current = root; + var parent = null; + while (current) { + var cmp = comparator(t.key, current.key); + if (cmp === 0) { + break; + } else if (cmp < 0) { + parent = current; + current = current.left; + } else { + parent = current; + current = current.right; + } + } + if (current === null) { + return null; + } + // search subtree of equal keys + var parents = []; + while (current !== t) { + if (current.left !== null + && comparator(t.key, current.left.key) === 0) { + parents.push(current); + parent = current; + current = current.left; + } else if (current.right !== null + && comparator(t.key, current.left.key) === 0) { + parent = current; + current = current.right; + } else { + parent = null; + while (parents.length > 0) { + parent = parents.pop(); + if (comparator(t.key, parent.right.key) === 0) { + current = parent.right; + } else { + return null; + } + } + } + } + return parent; + } + + /** + * Removes node from tree + * @param {Node} t tree node to remove + * @param {Node} parent parent of t (null if t root or unknown) + * @param {Comparator} comparator + * @param {Tree} tree + * @return {Node} new root + */ + + function removeNode(t, parent, comparator, tree) { + var child; + if (t.right === null || t.left === null) { + if (t === tree._root) { + tree._size -= 1; + return t.right || t.left; + } else if (parent === null) { + parent = findParent(t, tree._root, comparator); + } + if (parent === null) { + // t not in tree -- do nothing + return tree._root; + } else if (parent.right === t) { + parent.right = t.right; + } else { + parent.left = t.left; + } + } else { + // replace t with rightmost child of left sub-node, moving child's + // right branch to leftmost branch of t.right + var parent$1 = t; + child = t.left; + while (child.right !== null) { + parent$1 = child; + child = child.right; + } + + var left = t.right; + while (left.left !== null) { + left = left.left; + } + if (parent$1.right === child) { + parent$1.right = child.left; + } else { + parent$1.left = child.left; + } + left.left = child.right; + t.key = child.key; + t.data = child.data; + } + tree._size -= 1; + return tree._root; + } function split (key, v, comparator) { var left, right; @@ -298,24 +402,38 @@ /** * @param{Key} key - * @return {Node|null} + * @return boolean true if node removed. */ Tree.prototype.remove = function remove$1 (key) { + var size = this._size; this._root = remove(key, this._root, this._comparator, this); + return size > this._size; }; + /** + * @param {Node} node + * @param {Node} parent optional parent of node + * @return boolean true if node removed. + */ + Tree.prototype.removeNode = function removeNode$1 (node, parent) { + if ( parent === void 0 ) parent = null; + + var size = this._size; + this._root = removeNode(node, parent, this._comparator, this); + return size > this._size; + }; /** - * Removes and returns the node with smallest key + * Removes and returns a node with smallest key * @return {?Node} */ Tree.prototype.pop = function pop () { var node = this._root; if (node) { while (node.left) { node = node.left; } - this._root = splay(node.key,this._root, this._comparator); - this._root = remove(node.key, this._root, this._comparator, this); - return { key: node.key, data: node.data }; + var result = { key: node.key, data: node.data }; + this._root = removeNode(node, null, this._comparator, this); + return result; } return null; }; @@ -350,6 +468,15 @@ return this._root; }; + /** + * Find parent of node if node is in tree. + * + * @param {Node} node + * @return {Node|null} + */ + Tree.prototype.findParent = function findParent$1 (node) { + return findParent(node, this._root, this._comparator); + }; /** * @param{Key} key diff --git a/dist/splay.js.map b/dist/splay.js.map index 6444112..4c8f3d0 100644 --- a/dist/splay.js.map +++ b/dist/splay.js.map @@ -1 +1 @@ -{"version":3,"file":"splay.js","sources":["../index.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n"],"names":["let","const","this"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"splay.js","sources":["../index.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Node} root\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, root, comparator, tree) {\n let current = root;\n let parent = null;\n while (current) {\n const cmp = comparator(i, current.key);\n if (cmp === 0) {\n return removeNode(current, parent, comparator, tree);\n } else if (cmp < 0) {\n parent = current;\n current = current.left;\n } else {\n parent = current;\n current = current.right;\n }\n }\n return tree._root;\n}\n\n/**\n * Find parent of node if node is in tree.\n * @param {Node} t tree node to find.\n * @param {Node} root root of subtree to search under\n * @param {Comparator} comparator\n * @return {Node} parent of node\n */\nfunction findParent (t, root, comparator) {\n let current = root;\n let parent = null;\n while (current) {\n const cmp = comparator(t.key, current.key);\n if (cmp === 0) {\n break;\n } else if (cmp < 0) {\n parent = current;\n current = current.left;\n } else {\n parent = current;\n current = current.right;\n }\n }\n if (current === null) {\n return null;\n }\n // search subtree of equal keys\n let parents = [];\n while (current !== t) {\n if (current.left !== null\n && comparator(t.key, current.left.key) === 0) {\n parents.push(current);\n parent = current;\n current = current.left;\n } else if (current.right !== null\n && comparator(t.key, current.left.key) === 0) {\n parent = current;\n current = current.right;\n } else {\n parent = null;\n while (parents.length > 0) {\n parent = parents.pop();\n if (comparator(t.key, parent.right.key) === 0) {\n current = parent.right;\n } else {\n return null;\n }\n }\n }\n }\n return parent;\n}\n\n/**\n * Removes node from tree\n * @param {Node} t tree node to remove\n * @param {Node} parent parent of t (null if t root or unknown)\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\n\nfunction removeNode(t, parent, comparator, tree) {\n let child;\n if (t.right === null || t.left === null) {\n if (t === tree._root) {\n tree._size -= 1;\n return t.right || t.left;\n } else if (parent === null) {\n parent = findParent(t, tree._root, comparator);\n }\n if (parent === null) {\n // t not in tree -- do nothing\n return tree._root;\n } else if (parent.right === t) {\n parent.right = t.right;\n } else {\n parent.left = t.left;\n }\n } else {\n // replace t with rightmost child of left sub-node, moving child's\n // right branch to leftmost branch of t.right\n let parent = t;\n child = t.left;\n while (child.right !== null) {\n parent = child;\n child = child.right;\n }\n\n let left = t.right;\n while (left.left !== null) {\n left = left.left;\n }\n if (parent.right === child) {\n parent.right = child.left;\n } else {\n parent.left = child.left;\n }\n left.left = child.right;\n t.key = child.key;\n t.data = child.data;\n }\n tree._size -= 1;\n return tree._root;\n}\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return boolean true if node removed.\n */\n remove (key) {\n const size = this._size;\n this._root = remove(key, this._root, this._comparator, this);\n return size > this._size;\n }\n\n /**\n * @param {Node} node\n * @param {Node} parent optional parent of node\n * @return boolean true if node removed.\n */\n removeNode (node, parent = null) {\n const size = this._size;\n this._root = removeNode(node, parent, this._comparator, this);\n return size > this._size;\n }\n\n /**\n * Removes and returns a node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n const result = { key: node.key, data: node.data };\n this._root = removeNode(node, null, this._comparator, this);\n return result;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n /**\n * Find parent of node if node is in tree.\n *\n * @param {Node} node\n * @return {Node|null}\n */\n findParent (node) {\n return findParent(node, this._root, this._comparator);\n }\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n"],"names":["let","const","parent","this"],"mappings":"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"} \ No newline at end of file diff --git a/index.js b/index.js index 6590f18..402c0a7 100644 --- a/index.js +++ b/index.js @@ -225,13 +225,13 @@ function findParent (t, root, comparator) { // search subtree of equal keys let parents = []; while (current !== t) { - if (current.left !== null && - comparator(t.key, current.left.key) === 0) { + if (current.left !== null + && comparator(t.key, current.left.key) === 0) { parents.push(current); parent = current; current = current.left; - } else if (current.right !== null && - comparator(t.key, current.left.key) === 0) { + } else if (current.right !== null + && comparator(t.key, current.left.key) === 0) { parent = current; current = current.right; } else { @@ -262,7 +262,7 @@ function removeNode(t, parent, comparator, tree) { let child; if (t.right === null || t.left === null) { if (t === tree._root) { - tree._size -=1; + tree._size -= 1; return t.right || t.left; } else if (parent === null) { parent = findParent(t, tree._root, comparator); @@ -391,7 +391,7 @@ export default class Tree { * @return boolean true if node removed. */ remove (key) { - const size = this._size + const size = this._size; this._root = remove(key, this._root, this._comparator, this); return size > this._size; } @@ -401,11 +401,11 @@ export default class Tree { * @param {Node} parent optional parent of node * @return boolean true if node removed. */ - removeNode (node, parent = null) { - const size = this._size - this._root = removeNode(node, parent, this._comparator, this) - return size > this._size; - } + removeNode (node, parent = null) { + const size = this._size; + this._root = removeNode(node, parent, this._comparator, this); + return size > this._size; + } /** * Removes and returns a node with smallest key @@ -458,9 +458,9 @@ export default class Tree { * @param {Node} node * @return {Node|null} */ - findParent (node) { - return findParent(node, this._root, comparator); - } + findParent (node) { + return findParent(node, this._root, this._comparator); + } /** * @param {Key} key