@@ -463,15 +463,17 @@ class SymbolTree {
463463 /**
464464 * Find the index of the given object (the number of preceding siblings).
465465 *
466- * `O(n)`
466+ * `O(n)`<br>
467+ * `O(1)` (cached)
467468 *
468469 * @method index
469470 * @memberOf module:symbol-tree#
470471 * @param {Object } child
471472 * @return {Number } The number of preceding siblings, or -1 if the object has no parent
472473 */
473474 index ( child ) {
474- const parentNode = this . _node ( this . _node ( child ) . parent ) ;
475+ const childNode = this . _node ( child ) ;
476+ const parentNode = this . _node ( childNode . parent ) ;
475477
476478 if ( ! parentNode ) {
477479 // In principal, you could also find out the number of preceding siblings
@@ -480,15 +482,25 @@ class SymbolTree {
480482 return - 1 ;
481483 }
482484
483- let index = 0 ;
485+ let index = childNode . getCachedIndex ( parentNode ) ;
486+
487+ if ( index >= 0 ) {
488+ return index ;
489+ }
490+
491+ index = 0 ;
484492 let object = parentNode . first ;
485493
486494 while ( object ) {
495+ const node = this . _node ( object ) ;
496+ node . setCachedIndex ( parentNode , index ) ;
497+
487498 if ( object === child ) {
488499 break ;
489500 }
501+
490502 ++ index ;
491- object = this . _node ( object ) . next ;
503+ object = node . next ;
492504 }
493505
494506 return index ;
@@ -533,6 +545,10 @@ class SymbolTree {
533545 removeNode . prev = null ;
534546 removeNode . next = null ;
535547
548+ if ( parentNode ) {
549+ parentNode . childrenChanged ( ) ;
550+ }
551+
536552 return removeObject ;
537553 }
538554
@@ -572,6 +588,10 @@ class SymbolTree {
572588 parentNode . first = newObject ;
573589 }
574590
591+ if ( parentNode ) {
592+ parentNode . childrenChanged ( ) ;
593+ }
594+
575595 return newObject ;
576596 }
577597
@@ -611,6 +631,10 @@ class SymbolTree {
611631 parentNode . last = newObject ;
612632 }
613633
634+ if ( parentNode ) {
635+ parentNode . childrenChanged ( ) ;
636+ }
637+
614638 return newObject ;
615639 }
616640
@@ -639,6 +663,7 @@ class SymbolTree {
639663 newNode . parent = referenceObject ;
640664 referenceNode . first = newObject ;
641665 referenceNode . last = newObject ;
666+ referenceNode . childrenChanged ( ) ;
642667 }
643668 else {
644669 this . insertBefore ( newObject , referenceNode . first ) ;
@@ -672,6 +697,7 @@ class SymbolTree {
672697 newNode . parent = referenceObject ;
673698 referenceNode . first = newObject ;
674699 referenceNode . last = newObject ;
700+ referenceNode . childrenChanged ( ) ;
675701 }
676702 else {
677703 this . insertAfter ( newObject , referenceNode . last ) ;
0 commit comments