|
|
- 'use strict';
-
- const TREE = Symbol();
- const ROOT = Symbol();
- const NEXT = Symbol();
- const ITERATE_FUNC = Symbol();
-
- class TreeIterator {
- constructor(tree, root, firstResult, iterateFunction) {
- this[TREE] = tree;
- this[ROOT] = root;
- this[NEXT] = firstResult;
- this[ITERATE_FUNC] = iterateFunction;
- }
-
- next() {
- const tree = this[TREE];
- const iterateFunc = this[ITERATE_FUNC];
- const root = this[ROOT];
-
- if (!this[NEXT]) {
- return {
- done: true,
- value: root,
- };
- }
-
- const value = this[NEXT];
-
- if (iterateFunc === 1) {
- this[NEXT] = tree._node(value).previousSibling;
- }
- else if (iterateFunc === 2) {
- this[NEXT] = tree._node(value).nextSibling;
- }
- else if (iterateFunc === 3) {
- this[NEXT] = tree._node(value).parent;
- }
- else if (iterateFunc === 4) {
- this[NEXT] = tree.preceding(value, {root: root});
- }
- else /* if (iterateFunc === 5)*/ {
- this[NEXT] = tree.following(value, {root: root});
- }
-
- return {
- done: false,
- value: value,
- };
- }
- }
-
- Object.defineProperty(TreeIterator.prototype, Symbol.iterator, {
- value: function() {
- return this;
- },
- writable: false,
- });
-
- TreeIterator.PREV = 1;
- TreeIterator.NEXT = 2;
- TreeIterator.PARENT = 3;
- TreeIterator.PRECEDING = 4;
- TreeIterator.FOLLOWING = 5;
-
- Object.freeze(TreeIterator);
- Object.freeze(TreeIterator.prototype);
-
- module.exports = TreeIterator;
|