text: const {v4: uuidv4} = require('uuid');
  
  module.exports =  class SymbolTreeNode {
          constructor(tree) {
                  this.tree = tree;
  
                  this.parent = null;
                  this.previousSibling = null;
                  this.nextSibling = null;
  
                  this.firstChild = null;
                  this.lastChild = null;
  
                  this.id = uuidv4();
  
                  /** 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 Boolean(
                          this.parent || this.previousSibling || this.nextSibling
                  );
          }
  
          get hasChildren() {
                  return Boolean(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;
          }
  };
  