equal
deleted
inserted
replaced
116 def text(lines: List[Line]): String = lines.mkString("", "\n", "") |
116 def text(lines: List[Line]): String = lines.mkString("", "\n", "") |
117 } |
117 } |
118 |
118 |
119 sealed case class Document(lines: List[Line]) { |
119 sealed case class Document(lines: List[Line]) { |
120 lazy val text_length: Text.Offset = Document.length(lines) |
120 lazy val text_length: Text.Offset = Document.length(lines) |
121 def text_range: Text.Range = Text.Range(0, text_length) |
121 def full_range: Text.Range = Text.Range(0, text_length) |
122 |
122 |
123 lazy val text: String = Document.text(lines) |
123 lazy val text: String = Document.text(lines) |
124 |
124 |
125 def get_text(range: Text.Range): Option[String] = |
125 def get_text(range: Text.Range): Option[String] = |
126 if (text_range.contains(range)) Some(range.substring(text)) else None |
126 if (full_range.contains(range)) Some(range.substring(text)) else None |
|
127 |
|
128 def get_text(range: Line.Range): Option[String] = |
|
129 text_range(range).flatMap(get_text) |
127 |
130 |
128 override def toString: String = text |
131 override def toString: String = text |
129 |
132 |
130 override def equals(that: Any): Boolean = |
133 override def equals(that: Any): Boolean = |
131 that match { |
134 that match { |
167 else None |
170 else None |
168 } |
171 } |
169 else if (l == n && c == 0) Some(text_length) |
172 else if (l == n && c == 0) Some(text_length) |
170 else None |
173 else None |
171 } |
174 } |
|
175 |
|
176 def text_range(line_range: Range): Option[Text.Range] = |
|
177 for { |
|
178 start <- offset(line_range.start) |
|
179 stop <- offset(line_range.stop) |
|
180 } yield Text.Range(start, stop) |
172 |
181 |
173 def change(remove: Range, insert: String): Option[(List[Text.Edit], Document)] = { |
182 def change(remove: Range, insert: String): Option[(List[Text.Edit], Document)] = { |
174 for { |
183 for { |
175 edit_start <- offset(remove.start) |
184 edit_start <- offset(remove.start) |
176 if remove.stop == remove.start || offset(remove.stop).isDefined |
185 if remove.stop == remove.start || offset(remove.stop).isDefined |