     node = v.without(shift + 5, hash, key)
     if node?
       newSize = @size + node.size - v.size
-      new BitmapIndexedNode(@bitmap, this.arrayWith(i, node), newSize)
+      new BitmapIndexedNode(@bitmap, util.arrayWith(@array, i, node), newSize)
     else
       newBitmap = @bitmap ^ bit
+      newArray  = util.arrayWithout(@array, i)
       switch util.bitCount(newBitmap)
         when 0 then null
-        when 1 then this.arrayWithout(i)[0]
-        else   new BitmapIndexedNode(newBitmap, this.arrayWithout(i), @size - 1)
+        when 1 then newArray[0]
+        else   new BitmapIndexedNode(newBitmap, newArray, @size - 1)
 
   toString: -> "BitmapIndexedNode(#{@array.join(", ")})"
-
-  arrayWith: (i, node) -> @array[...i].concat([node], @array[i+1..])
-
-  arrayWithInsertion: (i, node) -> @array[...i].concat([node], @array[i..])
-
-  arrayWithout: (i) -> @array[...i].concat(@array[i+1..])
 
 BitmapIndexedNode.make = (shift, node) ->
   new BitmapIndexedNode(1 << util.mask(node.hash, shift), [node], node.size)

    [bit, i] = util.bitPosAndIndex(@bitmap, hash, shift)
    (@bitmap & bit) != 0 && @array[i].get(shift + 5, hash, key)

  with: (shift, hash, key) ->
    [bit, i] = util.bitPosAndIndex(@bitmap, hash, shift)

    if (@bitmap & bit) == 0
      newNode = new LeafNode(hash, key)
      n = util.bitCount(@bitmap)
      if n < 8
        newArray = this.arrayWithInsertion(i, newNode)
        new BitmapIndexedNode(@bitmap | bit, newArray, @size + 1)
      else
        table = new Array(32)

        new ArrayNode(table, util.mask(hash, shift), newNode, @size + 1)
    else
      v = @array[i]
      node = v.with(shift + 5, hash, key, value)
      newSize = @size + node.size - v.size
      new BitmapIndexedNode(@bitmap, util.arrayWith(@array, i, node), newSize)

  without: (shift, hash, key) ->
    [bit, i] = util.bitPosAndIndex(@bitmap, hash, shift)
