'use strict'; module.exports = class SymbolTreeNode { constructor() { this.parent = null; this.previousSibling = null; this.nextSibling = null; this.firstChild = null; this.lastChild = null; /** This value is incremented anytime a children is added or removed */ this.childrenVersion = 0; /** The last child object which has a cached index */ this.childIndexCachedUpTo = null; /** This value represents the cached node index, as long as * cachedIndexVersion matches with the childrenVersion of the parent */ this.cachedIndex = -1; this.cachedIndexVersion = NaN; // NaN is never equal to anything } get isAttached() { return !!(this.parent || this.previousSibling || this.nextSibling); } get hasChildren() { return !!this.firstChild; } childrenChanged() { /* jshint -W016 */ // integer wrap around this.childrenVersion = (this.childrenVersion + 1) & 0xFFFFFFFF; this.childIndexCachedUpTo = null; } getCachedIndex(parentNode) { // (assumes parentNode is actually the parent) if (this.cachedIndexVersion !== parentNode.childrenVersion) { this.cachedIndexVersion = NaN; // cachedIndex is no longer valid return -1; } return this.cachedIndex; // -1 if not cached } setCachedIndex(parentNode, index) { // (assumes parentNode is actually the parent) this.cachedIndexVersion = parentNode.childrenVersion; this.cachedIndex = index; } };