From fe23ef8d8d9c2f8ff44eb887fdf4bce5cf24c4fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Ooms?= Date: Mon, 6 Jul 2020 17:26:53 +0200 Subject: [PATCH] :rocket: perf(Seq#splice): Speed up easy cases. --- src/seq.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/seq.js b/src/seq.js index 188b943..df04516 100644 --- a/src/seq.js +++ b/src/seq.js @@ -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) ] ;