Skip to content

Commit

Permalink
🚀 perf(Seq#splice): Speed up easy cases.
Browse files Browse the repository at this point in the history
  • Loading branch information
make-github-pseudonymous-again committed Jul 6, 2020
1 parent a710f3d commit fe23ef8
Showing 1 changed file with 24 additions and 2 deletions.
26 changes: 24 additions & 2 deletions src/seq.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,30 @@ Seq.prototype.splice = function ( start , deleteCount , ...items ) {
if ( start < -length || start >= length ) throw new Error( `wrong start '${start}'` ) ;

if ( start < 0 ) start += length ;

const [ prefix , rest ] = this.tree.split( ( m ) => m > start ) ;
else if ( start === length ) {
return [ new Seq(this.tree.append(items)) , new Seq(empty(size)) ] ;
}

const split = this.tree.splitTree( ( m ) => m > start , size.zero( ) ) ;

if (deleteCount === 1) {
if (items.length === 0) {
return [ new Seq(split.left.concat(split.right)) , new Seq(empty(size).push(split.middle)) ] ;
}
else {
return [ new Seq(split.left.append(items).concat(split.right)) , new Seq(empty(size).push(split.middle)) ] ;
}
}

const prefix = split.left ;
const rest = split.right.cons(split.middle) ;

if (deleteCount === 0) {
return [ new Seq(prefix.append(items).concat(rest)) , new Seq(empty(size)) ] ;
}
if (deleteCount === undefined) {
return [ new Seq(prefix.append(items)) , new Seq(rest) ] ;
}
const [ deleted , suffix ] = rest.split( ( m ) => m > deleteCount ) ;
return [ new Seq(prefix.append(items).concat(suffix)) , new Seq(deleted) ] ;

Expand Down

0 comments on commit fe23ef8

Please sign in to comment.