       else
         @position.column += output.length
 
-    @bufferedSourcePositions.push(@sourcePosition.copy())
-    @bufferedPositions.push(@position.copy())
-    @bufferedOutputs.push(output)
+    @bufferedOutputs.push(
+      content: output
+      position: @position.copy()
+      sourcePosition: @sourcePosition.copy()
+    )

    return if position.isZero()

    until @sourcePosition.compare(position) >= 0
      lastReadPosition = @position
      lastReadSourcePosition = @sourcePosition
      {value, done} = @next()
      break if done

    overshoot = position.column - lastReadSourcePosition.column
    lastReadPosition.column += overshoot
    @transformDelegate.reset(lastReadPosition, position)
    @position = lastReadPosition
    @sourcePosition = position

  getPosition: ->

    return if position.isZero()

    until @position.compare(position) >= 0
      lastPosition = @position
      lastSourcePosition = @sourcePosition
      {done} = @next()
      return if done

    unless @position.compare(position) is 0
      overshoot = position.column - lastPosition.column
      lastSourcePosition.column += overshoot
      @position = position
      @sourcePosition = lastSourcePosition
    @transformDelegate.reset(@position, @sourcePosition)

  seekToSourcePosition: (position) ->
