238 def command_state(command: Command): Command.State |
238 def command_state(command: Command): Command.State |
239 def convert(i: Text.Offset): Text.Offset |
239 def convert(i: Text.Offset): Text.Offset |
240 def convert(range: Text.Range): Text.Range |
240 def convert(range: Text.Range): Text.Range |
241 def revert(i: Text.Offset): Text.Offset |
241 def revert(i: Text.Offset): Text.Offset |
242 def revert(range: Text.Range): Text.Range |
242 def revert(range: Text.Range): Text.Range |
|
243 def cumulate_markup[A](info: Text.Info[A])(result: Markup_Tree.Cumulate[A]) |
|
244 : Stream[Text.Info[A]] |
243 def select_markup[A](range: Text.Range)(result: Markup_Tree.Select[A]) |
245 def select_markup[A](range: Text.Range)(result: Markup_Tree.Select[A]) |
244 : Stream[Text.Info[Option[A]]] |
246 : Stream[Text.Info[Option[A]]] |
245 } |
247 } |
246 |
248 |
247 type Assign = |
249 type Assign = |
469 def convert(offset: Text.Offset) = (offset /: edits)((i, edit) => edit.convert(i)) |
471 def convert(offset: Text.Offset) = (offset /: edits)((i, edit) => edit.convert(i)) |
470 def revert(offset: Text.Offset) = (offset /: reverse_edits)((i, edit) => edit.revert(i)) |
472 def revert(offset: Text.Offset) = (offset /: reverse_edits)((i, edit) => edit.revert(i)) |
471 def convert(range: Text.Range) = (range /: edits)((r, edit) => edit.convert(r)) |
473 def convert(range: Text.Range) = (range /: edits)((r, edit) => edit.convert(r)) |
472 def revert(range: Text.Range) = (range /: reverse_edits)((r, edit) => edit.revert(r)) |
474 def revert(range: Text.Range) = (range /: reverse_edits)((r, edit) => edit.revert(r)) |
473 |
475 |
|
476 def cumulate_markup[A](root: Text.Info[A])(result: Markup_Tree.Cumulate[A]) |
|
477 : Stream[Text.Info[A]] = |
|
478 { |
|
479 val former_range = revert(root.range) |
|
480 for { |
|
481 (command, command_start) <- node.command_range(former_range).toStream |
|
482 Text.Info(r0, a) <- command_state(command).markup. |
|
483 cumulate(Text.Info((former_range - command_start).restrict(command.range), root.info)) { |
|
484 case (a, Text.Info(r0, b)) |
|
485 if result.isDefinedAt((a, Text.Info(convert(r0 + command_start), b))) => |
|
486 result((a, Text.Info(convert(r0 + command_start), b))) |
|
487 } |
|
488 } yield Text.Info(convert(r0 + command_start), a) |
|
489 } |
|
490 |
474 def select_markup[A](range: Text.Range)(result: Markup_Tree.Select[A]) |
491 def select_markup[A](range: Text.Range)(result: Markup_Tree.Select[A]) |
475 : Stream[Text.Info[Option[A]]] = |
492 : Stream[Text.Info[Option[A]]] = |
476 { |
493 { |
477 val former_range = revert(range) |
494 val former_range = revert(range) |
478 for { |
495 for { |