Skip to content

Commit dcf1b05

Browse files
Iterate over the tree in reverse
1 parent 5530e5a commit dcf1b05

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

lib/SymbolTree.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -521,12 +521,14 @@ class SymbolTree {
521521
* @method treeIterator
522522
* @memberOf module:symbol-tree#
523523
* @param {Object} root
524+
* @param {Boolean} [reverse=false]
524525
* @return {Object} An iterable iterator (ES6)
525526
*/
526-
treeIterator(root) {
527-
const following = this.following.bind(this);
528-
529-
let nextObject = root;
527+
treeIterator(root, reverse) {
528+
let nextObject = reverse
529+
? this.lastInclusiveDescendant(root)
530+
: root;
531+
const findNext = (reverse ? this.preceding : this.following).bind(this);
530532
const iterator = {};
531533

532534
iterator.next = function() {
@@ -538,7 +540,7 @@ class SymbolTree {
538540
}
539541

540542
const value = nextObject;
541-
nextObject = following(nextObject, root);
543+
nextObject = findNext(nextObject, root);
542544

543545
return {
544546
done : false,

test/SymbolTree.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,36 @@ test('tree iterator', function(t) {
978978
t.end();
979979
});
980980

981+
test('tree iterator reverse', function(t) {
982+
const tree = new SymbolTree();
983+
const a = {};
984+
const aa = {};
985+
const ab = {};
986+
const aba = {};
987+
const abaa = {};
988+
const ac = {};
989+
const b = {};
990+
991+
tree.insertLast(aa, a);
992+
tree.insertLast(ab, a);
993+
tree.insertLast(aba, ab);
994+
tree.insertLast(abaa, aba);
995+
tree.insertLast(ac, a);
996+
tree.insertAfter(b, a);
997+
998+
const results = [];
999+
const iterator = tree.treeIterator(a, true);
1000+
1001+
for (const object of iterator) {
1002+
results.push(object);
1003+
}
1004+
t.deepEqual([ac, abaa, aba, ab, aa, a], results);
1005+
t.deepEqual({done: true, value: a}, iterator.next());
1006+
t.deepEqual({done: true, value: a}, iterator.next()); // should keep returning done: true
1007+
1008+
t.end();
1009+
});
1010+
9811011
test('look up the index of an object', function(t) {
9821012
const tree = new SymbolTree();
9831013
const a = {};

0 commit comments

Comments
 (0)