def map(f: Offset => Offset): Range = Range(f(start), f(stop)) def +(i: Offset): Range = if (i == 0) thiselse map(_ + i) def -(i: Offset): Range = if (i == 0) thiselse map(_ - i)
def is_singularity: Boolean = start == stop def inflate_singularity: Range = if (is_singularity) Range(start, start + 1) elsethis
def touches(i: Offset): Boolean = start <= i && i <= stop
def contains(i: Offset): Boolean = start == i || start < i && i < stop def contains(that: Range): Boolean = this.contains(that.start) && that.stop <= this.stop def overlaps(that: Range): Boolean = this.contains(that.start) || that.contains(this.start) def compare(that: Range): Int = if (overlaps(that)) 0 elsethis.start compare that.start
def apart(that: Range): Boolean =
(this.start max that.start) > (this.stop min that.stop)
def restrict(that: Range): Range =
Range(this.start max that.start, this.stop min that.stop)
def apply(ranges: List[Range]): Perspective = { val result = new mutable.ListBuffer[Range] var last: Option[Range] = None def ship(next: Option[Range]): Unit = { result ++= last; last = next }
for (range <- ranges.sortBy(_.start)) {
last match { case None => ship(Some(range)) case Some(last_range) =>
last_range.try_join(range) match { case None => ship(Some(range)) case joined => last = joined
}
}
}
ship(None) new Perspective(result.toList)
}
}
finalclass Perspective private( val ranges: List[Range] // visible text partitioning in canonical order
) { def is_empty: Boolean = ranges.isEmpty def range: Range = if (is_empty) Range.zero else Range(ranges.head.start, ranges.last.stop)
overridedef hashCode: Int = ranges.hashCode overridedef equals(that: Any): Boolean =
that match { case other: Perspective => ranges == other.ranges case _ => false
} overridedef toString: String = ranges.toString
}
def edit(string: String, shift: Offset): (Option[Edit], String) = if (!can_edit(string, shift)) (Some(this), string) elseif (is_insert) (None, insert(start - shift, string)) else { val i = start - shift val count = text.length min (string.length - i) val rest = if (count == text.length) None else Some(Edit.remove(start, text.substring(count)))
(rest, remove(i, count, string))
}
}
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.17Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.