       @inputExtent = @inputExtent.traverse(rightNeighbor.inputExtent)
       @content = (@content ? "") + (rightNeighbor.content ? "")
       @content = null if @content is "" and @outputExtent.isPositive()
-      true
+      result = {inputExtent: rightNeighbor.inputExtent, outputExtent: rightNeighbor.outputExtent}
+      rightNeighbor.inputExtent = rightNeighbor.outputExtent = Point.zero()
+      result
 
   assign: ({@inputExtent, @outputExtent, @content}) ->
 

    {splitNodes, inputOffset, outputOffset, childIndex}

  merge: (rightNeighbor) ->
    totalChildCount = @children.length + rightNeighbor.children.length
    if totalChildCount <= BRANCHING_THRESHOLD + 1
      if last(@children).merge(rightNeighbor.children[0])
        rightNeighbor.children.shift()
        totalChildCount--

    if totalChildCount <= BRANCHING_THRESHOLD
      @inputExtent = @inputExtent.traverse(rightNeighbor.inputExtent)
      @outputExtent = @outputExtent.traverse(rightNeighbor.outputExtent)
      @children.push(rightNeighbor.children...)
      true

  assign: ({@inputExtent, @outputExtent, @children}) ->


      rightMergeIndex += splitChildren.length - 1

    if leftNeighbor = @children[leftMergeIndex - 1]
      leftNeighbor.merge(@children[leftMergeIndex])
      if isEmpty(@children[leftMergeIndex])
        @children[leftMergeIndex].assign(leftNeighbor)
        @children.splice(leftMergeIndex - 1, 1)
        childIndex--
        rightMergeIndex--

    if rightNeighbor = @children[rightMergeIndex + 1]
      @children[rightMergeIndex].merge(rightNeighbor)
      if isEmpty(rightNeighbor)
        @children.splice(rightMergeIndex + 1, 1)

    splitIndex = Math.ceil(@children.length / BRANCHING_THRESHOLD)
