All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalariform.utils.TextEdits.scala Maven / Gradle / Ivy

The newest version!
package scalariform.utils

case class TextEdit(position: Int, length: Int, replacement: String) {
  require(position >= 0, "position must be positive: " + position)
  require(length >= 0)
  override lazy val toString = {
    val replacementDisplay = replacement.replace("\n", """\n""").replace("\r", """\r""")
    getClass.getSimpleName + "(position = " + position + ", length = " + length + ", replacement = '" + replacementDisplay + "')"
  }

  def shift(n: Int) = copy(position = position + n)

}

object TextEditProcessor {

  /**
   * @param edits must be ordered and non-overlapping
   */
  def runEdits(s: String, edits: TextEdit*): String = runEdits(s, edits.toList)

  /**
   * @param edits must be ordered and non-overlapping
   */
  def runEdits(s: String, edits: List[TextEdit]): String = {
    val sb = new StringBuilder
    var pos = 0
    var editsRemaining = edits
    while (pos < s.length) {
      if (editsRemaining.isEmpty) {
        sb.append(s(pos))
        pos += 1
      } else {
        val edit = editsRemaining.head
        if (pos == edit.position) {
          editsRemaining = editsRemaining.tail
          pos += edit.length
          sb.append(edit.replacement)
        } else {
          sb.append(s(pos))
          pos += 1
        }
      }
    }
    var processEditsAtEnd = true
    while (processEditsAtEnd) {
      if (editsRemaining.isEmpty)
        processEditsAtEnd = false
      else {
        val edit = editsRemaining.head
        if (pos == edit.position) {
          editsRemaining = editsRemaining.tail
          pos += edit.length
          sb.append(edit.replacement)
        } else
          processEditsAtEnd = false
      }
    }
    require(editsRemaining.isEmpty)
    sb.toString
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy