@@ -739,14 +739,14 @@ export default class BTree<K=any, V=any> implements ISortedMapF<K,V>, ISortedMap
739
739
* @param stepToNode If true, the cursor will be advanced to the next node (skipping values)
740
740
* @returns true if the step was completed and false if the step would have caused the cursor to move beyond the end of the tree.
741
741
*/
742
- private static step < K , V > ( cursor : DiffCursor < K , V > , stepToNode : boolean = false ) : boolean {
742
+ private static step < K , V > ( cursor : DiffCursor < K , V > , stepToNode ? : boolean ) : boolean {
743
743
const { internalSpine, levelIndices, leaf } = cursor ;
744
- if ( stepToNode || leaf ) {
744
+ if ( stepToNode === true || leaf ) {
745
745
const levelsLength = levelIndices . length ;
746
746
// Step to the next node only if:
747
747
// - We are explicitly directed to via stepToNode, or
748
748
// - There are no key/value pairs left to step to in this leaf
749
- if ( stepToNode || levelIndices [ levelsLength - 1 ] === 0 ) {
749
+ if ( stepToNode === true || levelIndices [ levelsLength - 1 ] === 0 ) {
750
750
const spineLength = internalSpine . length ;
751
751
// Root is leaf
752
752
if ( spineLength === 0 )
@@ -755,19 +755,17 @@ export default class BTree<K=any, V=any> implements ISortedMapF<K,V>, ISortedMap
755
755
const nodeLevelIndex = spineLength - 1 ;
756
756
let levelIndexWalkBack = nodeLevelIndex ;
757
757
while ( levelIndexWalkBack >= 0 ) {
758
- const childIndex = levelIndices [ levelIndexWalkBack ]
759
- if ( childIndex > 0 ) {
758
+ if ( levelIndices [ levelIndexWalkBack ] > 0 ) {
760
759
if ( levelIndexWalkBack < levelsLength - 1 ) {
761
760
// Remove leaf state from cursor
762
761
cursor . leaf = undefined ;
763
- levelIndices . splice ( levelIndexWalkBack + 1 , levelsLength - levelIndexWalkBack ) ;
762
+ levelIndices . pop ( ) ;
764
763
}
765
- // If we walked upwards past any internal node, splice them out
764
+ // If we walked upwards past any internal node, slice them out
766
765
if ( levelIndexWalkBack < nodeLevelIndex )
767
- internalSpine . splice ( levelIndexWalkBack + 1 , spineLength - levelIndexWalkBack ) ;
766
+ cursor . internalSpine = internalSpine . slice ( 0 , levelIndexWalkBack + 1 ) ;
768
767
// Move to new internal node
769
- const nodeIndex = -- levelIndices [ levelIndexWalkBack ] ;
770
- cursor . currentKey = internalSpine [ levelIndexWalkBack ] [ nodeIndex ] . maxKey ( ) ;
768
+ cursor . currentKey = internalSpine [ levelIndexWalkBack ] [ -- levelIndices [ levelIndexWalkBack ] ] . maxKey ( ) ;
771
769
return true ;
772
770
}
773
771
levelIndexWalkBack -- ;
@@ -1680,7 +1678,7 @@ class BNodeInternal<K,V> extends BNode<K,V> {
1680
1678
* - Leaf is only populated if the cursor points to a KVP. If this is the case, levelIndices.length === internalSpine.length + 1
1681
1679
* and levelIndices[levelIndices.length - 1] is the index of the value.
1682
1680
*/
1683
- type DiffCursor < K , V > = { height : number , internalSpine : BNode < K , V > [ ] [ ] , levelIndices : number [ ] , leaf : BNode < K , V > | undefined , currentKey : K } ;
1681
+ type DiffCursor < K , V > = { height : number , internalSpine : BNode < K , V > [ ] [ ] , levelIndices : number [ ] , leaf : BNode < K , V > | undefined , currentKey : K } ;
1684
1682
1685
1683
// Optimization: this array of `undefined`s is used instead of a normal
1686
1684
// array of values in nodes where `undefined` is the only value.
0 commit comments