From 8b6d343fcf46fdd1f17ce3ea32fa02ea1f3ac7f0 Mon Sep 17 00:00:00 2001 From: ZLY201 <951711127@qq.com> Date: Wed, 31 Aug 2022 23:39:47 +0800 Subject: [PATCH 1/3] perf: migrate rbTree to js-sdsl --- lib/rules/indent.js | 34 +++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/rules/indent.js b/lib/rules/indent.js index b974a6ab150..b15ed88e602 100644 --- a/lib/rules/indent.js +++ b/lib/rules/indent.js @@ -12,7 +12,7 @@ // Requirements //------------------------------------------------------------------------------ -const createTree = require("functional-red-black-tree"); +const { OrderedMap } = require("js-sdsl"); const astUtils = require("./utils/ast-utils"); @@ -135,7 +135,8 @@ class BinarySearchTree { * Creates an empty tree */ constructor() { - this._rbTree = createTree(); + this._rbTree = new OrderedMap(); + this._rbTreeEnd = this._rbTree.end(); } /** @@ -145,13 +146,7 @@ class BinarySearchTree { * @returns {void} */ insert(key, value) { - const iterator = this._rbTree.find(key); - - if (iterator.valid) { - this._rbTree = iterator.update(value); - } else { - this._rbTree = this._rbTree.insert(key, value); - } + this._rbTree.setElement(key, value); } /** @@ -160,9 +155,9 @@ class BinarySearchTree { * @returns {{key: number, value: *}|null} The found entry, or null if no such entry exists. */ findLe(key) { - const iterator = this._rbTree.le(key); + const iterator = this._rbTree.reverseLowerBound(key); - return iterator && { key: iterator.key, value: iterator.value }; + return { key: iterator.pointer[0], value: iterator.pointer[1] }; } /** @@ -177,11 +172,20 @@ class BinarySearchTree { if (start === end) { return; } - const iterator = this._rbTree.ge(start); + const iterator = this._rbTree.lowerBound(start); - while (iterator.valid && iterator.key < end) { - this._rbTree = this._rbTree.remove(iterator.key); - iterator.next(); + if (iterator.equals(this._rbTreeEnd)) { + return; + } + + if (end > this._rbTree.back()[0]) { + while (!iterator.equals(this._rbTreeEnd)) { + this._rbTree.eraseElementByIterator(iterator); + } + } else { + while (iterator.pointer[0] < end) { + this._rbTree.eraseElementByIterator(iterator); + } } } } diff --git a/package.json b/package.json index c21dad41b8e..4bd529da3e1 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,6 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", "globby": "^11.1.0", @@ -83,6 +82,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4-beta.0", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", From 66cc8ab89b4a24598e62486981299053222d8cd2 Mon Sep 17 00:00:00 2001 From: ZLY201 <951711127@qq.com> Date: Thu, 1 Sep 2022 21:44:43 +0800 Subject: [PATCH 2/3] fix: keep the old behaviour and change name to ordered map --- lib/rules/indent.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/rules/indent.js b/lib/rules/indent.js index b15ed88e602..cda02035a1d 100644 --- a/lib/rules/indent.js +++ b/lib/rules/indent.js @@ -135,8 +135,8 @@ class BinarySearchTree { * Creates an empty tree */ constructor() { - this._rbTree = new OrderedMap(); - this._rbTreeEnd = this._rbTree.end(); + this._orderedMap = new OrderedMap(); + this._orderedMapEnd = this._orderedMap.end(); } /** @@ -146,7 +146,7 @@ class BinarySearchTree { * @returns {void} */ insert(key, value) { - this._rbTree.setElement(key, value); + this._orderedMap.setElement(key, value); } /** @@ -155,7 +155,11 @@ class BinarySearchTree { * @returns {{key: number, value: *}|null} The found entry, or null if no such entry exists. */ findLe(key) { - const iterator = this._rbTree.reverseLowerBound(key); + const iterator = this._orderedMap.reverseLowerBound(key); + + if (iterator.equals(this._orderedMapEnd)) { + return {}; + } return { key: iterator.pointer[0], value: iterator.pointer[1] }; } @@ -172,19 +176,19 @@ class BinarySearchTree { if (start === end) { return; } - const iterator = this._rbTree.lowerBound(start); + const iterator = this._orderedMap.lowerBound(start); - if (iterator.equals(this._rbTreeEnd)) { + if (iterator.equals(this._orderedMapEnd)) { return; } - if (end > this._rbTree.back()[0]) { - while (!iterator.equals(this._rbTreeEnd)) { - this._rbTree.eraseElementByIterator(iterator); + if (end > this._orderedMap.back()[0]) { + while (!iterator.equals(this._orderedMapEnd)) { + this._orderedMap.eraseElementByIterator(iterator); } } else { while (iterator.pointer[0] < end) { - this._rbTree.eraseElementByIterator(iterator); + this._orderedMap.eraseElementByIterator(iterator); } } } From 42b8a9c85944ed0863ae4b8ea5eaeae311343982 Mon Sep 17 00:00:00 2001 From: ZLY201 <951711127@qq.com> Date: Wed, 7 Sep 2022 16:17:36 +0800 Subject: [PATCH 3/3] feat: upgrade js-sdsl --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bd529da3e1..ac39a48eb40 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4-beta.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1",