src/Tools/jEdit/src/proofdocument/change.scala
author wenzelm
Fri, 01 Jan 2010 21:53:00 +0100
changeset 34827 69852bd3c4c4
parent 34825 7f72547f9b12
child 34833 683ddf358698
permissions -rw-r--r--
tuned Change: eliminated redundant copy of document id;

/*
 * Changes of plain text
 *
 * @author Johannes Hölzl, TU Munich
 * @author Fabian Immler, TU Munich
 */

package isabelle.proofdocument


sealed abstract class Edit
{
  val start: Int
  def before(offset: Int): Int
  def after(offset: Int): Int
}


case class Insert(start: Int, text: String) extends Edit
{
  def before(offset: Int): Int =
    if (start > offset) offset
    else (offset - text.length) max start

  def after(offset: Int): Int =
    if (start <= offset) offset + text.length else offset
}


case class Remove(start: Int, text: String) extends Edit
{
  def before(offset: Int): Int =
    if (start <= offset) offset + text.length else offset

  def after(offset: Int): Int =
    if (start > offset) offset
    else (offset - text.length) max start
}
// TODO: merge multiple inserts?


class Change(
  val parent: Option[Change],
  val edits: List[Edit],
  val result: Future[Document.Result])
{
  // FIXME iterator
  def ancestors(done: Change => Boolean): List[Change] =
    if (done(this)) Nil
    else this :: parent.map(_.ancestors(done)).getOrElse(Nil)
  def ancestors: List[Change] = ancestors(_ => false)

  def document: Document = result.join._1
  def document_edits: List[Document.Structure_Edit] = result.join._2
}