232 { |
232 { |
233 val state: State |
233 val state: State |
234 val version: Version |
234 val version: Version |
235 val node: Node |
235 val node: Node |
236 val is_outdated: Boolean |
236 val is_outdated: Boolean |
237 def command_state(command: Command): Command.State |
|
238 def convert(i: Text.Offset): Text.Offset |
237 def convert(i: Text.Offset): Text.Offset |
239 def convert(range: Text.Range): Text.Range |
238 def convert(range: Text.Range): Text.Range |
240 def revert(i: Text.Offset): Text.Offset |
239 def revert(i: Text.Offset): Text.Offset |
241 def revert(range: Text.Range): Text.Range |
240 def revert(range: Text.Range): Text.Range |
242 def cumulate_markup[A](range: Text.Range, info: A, elements: Option[Set[String]], |
241 def cumulate_markup[A](range: Text.Range, info: A, elements: Option[Set[String]], |
463 { |
462 { |
464 val state = State.this |
463 val state = State.this |
465 val version = stable.version.get_finished |
464 val version = stable.version.get_finished |
466 val node = version.nodes(name) |
465 val node = version.nodes(name) |
467 val is_outdated = !(pending_edits.isEmpty && latest == stable) |
466 val is_outdated = !(pending_edits.isEmpty && latest == stable) |
468 def command_state(command: Command): Command.State = state.command_state(version, command) |
|
469 |
467 |
470 def convert(offset: Text.Offset) = (offset /: edits)((i, edit) => edit.convert(i)) |
468 def convert(offset: Text.Offset) = (offset /: edits)((i, edit) => edit.convert(i)) |
471 def revert(offset: Text.Offset) = (offset /: reverse_edits)((i, edit) => edit.revert(i)) |
469 def revert(offset: Text.Offset) = (offset /: reverse_edits)((i, edit) => edit.revert(i)) |
472 def convert(range: Text.Range) = (range /: edits)((r, edit) => edit.convert(r)) |
470 def convert(range: Text.Range) = (range /: edits)((r, edit) => edit.convert(r)) |
473 def revert(range: Text.Range) = (range /: reverse_edits)((r, edit) => edit.revert(r)) |
471 def revert(range: Text.Range) = (range /: reverse_edits)((r, edit) => edit.revert(r)) |
476 result: PartialFunction[(A, Text.Markup), A]): Stream[Text.Info[A]] = |
474 result: PartialFunction[(A, Text.Markup), A]): Stream[Text.Info[A]] = |
477 { |
475 { |
478 val former_range = revert(range) |
476 val former_range = revert(range) |
479 for { |
477 for { |
480 (command, command_start) <- node.command_range(former_range).toStream |
478 (command, command_start) <- node.command_range(former_range).toStream |
481 Text.Info(r0, a) <- command_state(command).markup. |
479 Text.Info(r0, a) <- state.command_state(version, command).markup. |
482 cumulate[A]((former_range - command_start).restrict(command.range), info, elements, |
480 cumulate[A]((former_range - command_start).restrict(command.range), info, elements, |
483 { |
481 { |
484 case (a, Text.Info(r0, b)) |
482 case (a, Text.Info(r0, b)) |
485 if result.isDefinedAt((a, Text.Info(convert(r0 + command_start), b))) => |
483 if result.isDefinedAt((a, Text.Info(convert(r0 + command_start), b))) => |
486 result((a, Text.Info(convert(r0 + command_start), b))) |
484 result((a, Text.Info(convert(r0 + command_start), b))) |