87 } |
87 } |
88 |
88 |
89 private def overlapping(range: Text.Range): Stream[(Text.Range, Branches.Entry)] = |
89 private def overlapping(range: Text.Range): Stream[(Text.Range, Branches.Entry)] = |
90 Branches.overlapping(range, branches).toStream |
90 Branches.overlapping(range, branches).toStream |
91 |
91 |
92 def select[A](root_range: Text.Range) |
92 def select[A](root_range: Text.Range)(result: PartialFunction[Text.Info[Any], A]) |
93 (result: PartialFunction[Text.Info[Any], A])(default: A): Iterator[Text.Info[A]] = |
93 : Stream[Text.Info[Option[A]]] = |
94 { |
94 { |
95 def stream(last: Text.Offset, stack: List[(Text.Info[A], Stream[(Text.Range, Branches.Entry)])]) |
95 def stream( |
96 : Stream[Text.Info[A]] = |
96 last: Text.Offset, |
|
97 stack: List[(Text.Info[Option[A]], Stream[(Text.Range, Branches.Entry)])]) |
|
98 : Stream[Text.Info[Option[A]]] = |
97 { |
99 { |
98 stack match { |
100 stack match { |
99 case (parent, (range, (info, tree)) #:: more) :: rest => |
101 case (parent, (range, (info, tree)) #:: more) :: rest => |
100 val subrange = range.restrict(root_range) |
102 val subrange = range.restrict(root_range) |
101 val subtree = tree.overlapping(subrange) |
103 val subtree = tree.overlapping(subrange) |
102 val start = subrange.start |
104 val start = subrange.start |
103 |
105 |
104 if (result.isDefinedAt(info)) { |
106 if (result.isDefinedAt(info)) { |
105 val next = Text.Info(subrange, result(info)) |
107 val next = Text.Info[Option[A]](subrange, Some(result(info))) |
106 val nexts = stream(start, (next, subtree) :: (parent, more) :: rest) |
108 val nexts = stream(start, (next, subtree) :: (parent, more) :: rest) |
107 if (last < start) parent.restrict(Text.Range(last, start)) #:: nexts |
109 if (last < start) parent.restrict(Text.Range(last, start)) #:: nexts |
108 else nexts |
110 else nexts |
109 } |
111 } |
110 else stream(last, (parent, subtree #::: more) :: rest) |
112 else stream(last, (parent, subtree #::: more) :: rest) |
115 if (last < stop) parent.restrict(Text.Range(last, stop)) #:: nexts |
117 if (last < stop) parent.restrict(Text.Range(last, stop)) #:: nexts |
116 else nexts |
118 else nexts |
117 |
119 |
118 case Nil => |
120 case Nil => |
119 val stop = root_range.stop |
121 val stop = root_range.stop |
120 if (last < stop) Stream(Text.Info(Text.Range(last, stop), default)) |
122 if (last < stop) Stream(Text.Info(Text.Range(last, stop), None)) |
121 else Stream.empty |
123 else Stream.empty |
122 } |
124 } |
123 } |
125 } |
124 stream(root_range.start, List((Text.Info(root_range, default), overlapping(root_range)))) |
126 stream(root_range.start, List((Text.Info(root_range, None), overlapping(root_range)))) |
125 .iterator |
|
126 } |
127 } |
127 |
128 |
128 def swing_tree(parent: DefaultMutableTreeNode) |
129 def swing_tree(parent: DefaultMutableTreeNode) |
129 (swing_node: Text.Info[Any] => DefaultMutableTreeNode) |
130 (swing_node: Text.Info[Any] => DefaultMutableTreeNode) |
130 { |
131 { |