src/Pure/PIDE/text.scala
changeset 43425 0a5612040a8b
parent 38725 3d9d5ff80f6f
child 43428 b41dea5772c6
equal deleted inserted replaced
43424:eeba70379f1a 43425:0a5612040a8b
    23   }
    23   }
    24 
    24 
    25   sealed case class Range(val start: Offset, val stop: Offset)
    25   sealed case class Range(val start: Offset, val stop: Offset)
    26   {
    26   {
    27     // denotation: {start} Un {i. start < i & i < stop}
    27     // denotation: {start} Un {i. start < i & i < stop}
    28     require(start <= stop)
    28     if (start > stop)
       
    29       error("Bad range: [" + start.toString + ":" + stop.toString + "]")
    29 
    30 
    30     override def toString = "[" + start.toString + ":" + stop.toString + "]"
    31     override def toString = "[" + start.toString + ":" + stop.toString + "]"
    31 
    32 
    32     def map(f: Offset => Offset): Range = Range(f(start), f(stop))
    33     def map(f: Offset => Offset): Range = Range(f(start), f(stop))
    33     def +(i: Offset): Range = map(_ + i)
    34     def +(i: Offset): Range = map(_ + i)
    69 
    70 
    70     /* transform offsets */
    71     /* transform offsets */
    71 
    72 
    72     private def transform(do_insert: Boolean, i: Offset): Offset =
    73     private def transform(do_insert: Boolean, i: Offset): Offset =
    73       if (i < start) i
    74       if (i < start) i
    74       else if (is_insert == do_insert) i + text.length
    75       else if (do_insert) i + text.length
    75       else (i - text.length) max start
    76       else (i - text.length) max start
    76 
    77 
    77     def convert(i: Offset): Offset = transform(true, i)
    78     def convert(i: Offset): Offset = transform(is_insert, i)
    78     def revert(i: Offset): Offset = transform(false, i)
    79     def revert(i: Offset): Offset = transform(!is_insert, i)
       
    80     def convert(range: Range): Range = range.map(convert)
       
    81     def revert(range: Range): Range = range.map(revert)
    79 
    82 
    80 
    83 
    81     /* edit strings */
    84     /* edit strings */
    82 
    85 
    83     private def insert(i: Offset, string: String): String =
    86     private def insert(i: Offset, string: String): String =