equal
deleted
inserted
replaced
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 = |