Skip to content

Commit fe23ef8

Browse files
🚀 perf(Seq#splice): Speed up easy cases.
1 parent a710f3d commit fe23ef8

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

src/seq.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,30 @@ Seq.prototype.splice = function ( start , deleteCount , ...items ) {
115115
if ( start < -length || start >= length ) throw new Error( `wrong start '${start}'` ) ;
116116

117117
if ( start < 0 ) start += length ;
118-
119-
const [ prefix , rest ] = this.tree.split( ( m ) => m > start ) ;
118+
else if ( start === length ) {
119+
return [ new Seq(this.tree.append(items)) , new Seq(empty(size)) ] ;
120+
}
121+
122+
const split = this.tree.splitTree( ( m ) => m > start , size.zero( ) ) ;
123+
124+
if (deleteCount === 1) {
125+
if (items.length === 0) {
126+
return [ new Seq(split.left.concat(split.right)) , new Seq(empty(size).push(split.middle)) ] ;
127+
}
128+
else {
129+
return [ new Seq(split.left.append(items).concat(split.right)) , new Seq(empty(size).push(split.middle)) ] ;
130+
}
131+
}
132+
133+
const prefix = split.left ;
134+
const rest = split.right.cons(split.middle) ;
135+
136+
if (deleteCount === 0) {
137+
return [ new Seq(prefix.append(items).concat(rest)) , new Seq(empty(size)) ] ;
138+
}
139+
if (deleteCount === undefined) {
140+
return [ new Seq(prefix.append(items)) , new Seq(rest) ] ;
141+
}
120142
const [ deleted , suffix ] = rest.split( ( m ) => m > deleteCount ) ;
121143
return [ new Seq(prefix.append(items).concat(suffix)) , new Seq(deleted) ] ;
122144

0 commit comments

Comments
 (0)