equal
deleted
inserted
replaced
110 def text(lines: List[Line]): String = lines.mkString("", "\n", "") |
110 def text(lines: List[Line]): String = lines.mkString("", "\n", "") |
111 } |
111 } |
112 |
112 |
113 sealed case class Document(lines: List[Line]) |
113 sealed case class Document(lines: List[Line]) |
114 { |
114 { |
115 lazy val text_range: Text.Range = Text.Range(0, Document.length(lines)) |
115 lazy val text_length: Text.Offset = Document.length(lines) |
|
116 def text_range: Text.Range = Text.Range(0, text_length) |
|
117 |
116 lazy val text: String = Document.text(lines) |
118 lazy val text: String = Document.text(lines) |
117 |
119 |
118 def try_get_text(range: Text.Range): Option[String] = |
120 def try_get_text(range: Text.Range): Option[String] = |
119 if (text_range.contains(range)) Some(text.substring(range.start, range.stop)) |
121 if (text_range.contains(range)) Some(text.substring(range.start, range.stop)) |
120 else None |
122 else None |
158 (0 /: lines.iterator.take(l)) { case (n, line) => n + line.text.length + 1 } |
160 (0 /: lines.iterator.take(l)) { case (n, line) => n + line.text.length + 1 } |
159 Some(line_offset + c) |
161 Some(line_offset + c) |
160 } |
162 } |
161 else None |
163 else None |
162 } |
164 } |
163 else if (l == n && c == 0) Some(text_range.length) |
165 else if (l == n && c == 0) Some(text_length) |
164 else None |
166 else None |
165 } |
167 } |
166 |
168 |
167 def change(remove: Range, insert: String): Option[(List[Text.Edit], Document)] = |
169 def change(remove: Range, insert: String): Option[(List[Text.Edit], Document)] = |
168 { |
170 { |