52 |
52 |
53 /* results */ |
53 /* results */ |
54 |
54 |
55 object Results |
55 object Results |
56 { |
56 { |
57 type Entry = (Long, XML.Tree) |
57 type Entry = (Long, XML.Elem) |
58 val empty: Results = new Results(SortedMap.empty) |
58 val empty: Results = new Results(SortedMap.empty) |
59 def make(args: TraversableOnce[Results.Entry]): Results = (empty /: args)(_ + _) |
59 def make(args: TraversableOnce[Results.Entry]): Results = (empty /: args)(_ + _) |
60 def merge(args: TraversableOnce[Results]): Results = (empty /: args)(_ ++ _) |
60 def merge(args: TraversableOnce[Results]): Results = (empty /: args)(_ ++ _) |
61 } |
61 } |
62 |
62 |
63 final class Results private(private val rep: SortedMap[Long, XML.Tree]) |
63 final class Results private(private val rep: SortedMap[Long, XML.Elem]) |
64 { |
64 { |
65 def is_empty: Boolean = rep.isEmpty |
65 def is_empty: Boolean = rep.isEmpty |
66 def defined(serial: Long): Boolean = rep.isDefinedAt(serial) |
66 def defined(serial: Long): Boolean = rep.isDefinedAt(serial) |
67 def get(serial: Long): Option[XML.Tree] = rep.get(serial) |
67 def get(serial: Long): Option[XML.Elem] = rep.get(serial) |
68 def iterator: Iterator[Results.Entry] = rep.iterator |
68 def iterator: Iterator[Results.Entry] = rep.iterator |
69 |
69 |
70 def + (entry: Results.Entry): Results = |
70 def + (entry: Results.Entry): Results = |
71 if (defined(entry._1)) this |
71 if (defined(entry._1)) this |
72 else new Results(rep + entry) |
72 else new Results(rep + entry) |
185 |
185 |
186 /* state */ |
186 /* state */ |
187 |
187 |
188 object State |
188 object State |
189 { |
189 { |
190 def get_result(states: List[State], serial: Long): Option[XML.Tree] = |
190 def get_result(states: List[State], serial: Long): Option[XML.Elem] = |
191 states.find(st => st.results.defined(serial)).map(st => st.results.get(serial).get) |
191 states.find(st => st.results.defined(serial)).map(st => st.results.get(serial).get) |
192 |
192 |
193 def get_result_proper(states: List[State], props: Properties.T): Option[Results.Entry] = |
193 def get_result_proper(states: List[State], props: Properties.T): Option[Results.Entry] = |
194 for { |
194 for { |
195 serial <- Markup.Serial.unapply(props) |
195 serial <- Markup.Serial.unapply(props) |
196 tree @ XML.Elem(_, body) <- get_result(states, serial) |
196 elem <- get_result(states, serial) |
197 if body.nonEmpty |
197 if elem.body.nonEmpty |
198 } yield (serial -> tree) |
198 } yield serial -> elem |
199 |
199 |
200 def merge_results(states: List[State]): Results = |
200 def merge_results(states: List[State]): Results = |
201 Results.merge(states.map(_.results)) |
201 Results.merge(states.map(_.results)) |
202 |
202 |
203 def merge_exports(states: List[State]): Exports = |
203 def merge_exports(states: List[State]): Exports = |