@@ -209,18 +209,31 @@ private[collection] object RedBlackTree {
209
209
RedTree (k, v, null , null )
210
210
} else {
211
211
val cmp = ordering.compare(k, tree.key)
212
- if (cmp < 0 ) balanceLeft(isBlackTree(tree), tree.key, tree.value, upd(tree.left, k, v, overwrite), tree.right)
213
- else if (cmp > 0 ) balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, upd(tree.right, k, v, overwrite))
214
- else if (overwrite || k != tree.key) mkTree(isBlackTree(tree), tree.key, v, tree.left, tree.right)
212
+ if (cmp < 0 ) {
213
+ val newLeft = upd(tree.left, k, v, overwrite)
214
+ if (newLeft eq tree.left) tree
215
+ else balanceLeft(isBlackTree(tree), tree.key, tree.value, newLeft, tree.right)
216
+ } else if (cmp > 0 ) {
217
+ val newRight = upd(tree.right, k, v, overwrite)
218
+ if (newRight eq tree.right) tree
219
+ else balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, newRight)
220
+ } else if (overwrite && (v.asInstanceOf [AnyRef ] ne tree.value.asInstanceOf [AnyRef ]))
221
+ mkTree(isBlackTree(tree), tree.key, v, tree.left, tree.right)
215
222
else tree
216
223
}
217
224
private [this ] def updNth [A , B , B1 >: B ](tree : Tree [A , B ], idx : Int , k : A , v : B1 ): Tree [A , B1 ] = if (tree eq null ) {
218
225
RedTree (k, v, null , null )
219
226
} else {
220
227
val rank = count(tree.left) + 1
221
- if (idx < rank) balanceLeft(isBlackTree(tree), tree.key, tree.value, updNth(tree.left, idx, k, v), tree.right)
222
- else if (idx > rank) balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, updNth(tree.right, idx - rank, k, v))
223
- else tree
228
+ if (idx < rank) {
229
+ val newLeft = updNth(tree.left, idx, k, v)
230
+ if (newLeft eq tree.left) tree
231
+ else balanceLeft(isBlackTree(tree), tree.key, tree.value, newLeft, tree.right)
232
+ } else if (idx > rank) {
233
+ val newRight = updNth(tree.right, idx - rank, k, v)
234
+ if (newRight eq tree.right) tree
235
+ else balanceRight(isBlackTree(tree), tree.key, tree.value, tree.left, newRight)
236
+ } else tree
224
237
}
225
238
226
239
private [this ] def doFrom [A , B ](tree : Tree [A , B ], from : A )(implicit ordering : Ordering [A ]): Tree [A , B ] = {
0 commit comments