equal
deleted
inserted
replaced
15 { |
15 { |
16 /* formal identifiers */ |
16 /* formal identifiers */ |
17 |
17 |
18 type ID = Long |
18 type ID = Long |
19 |
19 |
20 object ID { |
20 object ID |
|
21 { |
21 def apply(id: ID): String = Markup.Long.apply(id) |
22 def apply(id: ID): String = Markup.Long.apply(id) |
22 def unapply(s: String): Option[ID] = Markup.Long.unapply(s) |
23 def unapply(s: String): Option[ID] = Markup.Long.unapply(s) |
23 } |
24 } |
24 |
25 |
25 type Version_ID = ID |
26 type Version_ID = ID |
32 |
33 |
33 /** document structure **/ |
34 /** document structure **/ |
34 |
35 |
35 /* named nodes -- development graph */ |
36 /* named nodes -- development graph */ |
36 |
37 |
37 type Node_Text_Edit = (String, List[Text.Edit]) // FIXME None: remove |
38 type Text_Edit = |
|
39 (String, // node name |
|
40 Option[List[Text.Edit]]) // None: remove, Some: insert/remove text |
38 |
41 |
39 type Edit[C] = |
42 type Edit[C] = |
40 (String, // node name |
43 (String, // node name |
41 Option[List[(Option[C], Option[C])]]) // None: remove, Some: insert/remove commands |
44 Option[List[(Option[C], Option[C])]]) // None: remove, Some: insert/remove commands |
42 |
45 |
131 val init = new Change(Future.value(Version.init), Nil, Future.value(Nil, Version.init)) |
134 val init = new Change(Future.value(Version.init), Nil, Future.value(Nil, Version.init)) |
132 } |
135 } |
133 |
136 |
134 class Change( |
137 class Change( |
135 val previous: Future[Version], |
138 val previous: Future[Version], |
136 val edits: List[Node_Text_Edit], |
139 val edits: List[Text_Edit], |
137 val result: Future[(List[Edit[Command]], Version)]) |
140 val result: Future[(List[Edit[Command]], Version)]) |
138 { |
141 { |
139 val version: Future[Version] = result.map(_._2) |
142 val version: Future[Version] = result.map(_._2) |
140 def is_finished: Boolean = previous.is_finished && version.is_finished |
143 def is_finished: Boolean = previous.is_finished && version.is_finished |
141 } |
144 } |
265 case Some(assgn) => assgn.is_finished |
268 case Some(assgn) => assgn.is_finished |
266 case None => false |
269 case None => false |
267 } |
270 } |
268 |
271 |
269 def extend_history(previous: Future[Version], |
272 def extend_history(previous: Future[Version], |
270 edits: List[Node_Text_Edit], |
273 edits: List[Text_Edit], |
271 result: Future[(List[Edit[Command]], Version)]): (Change, State) = |
274 result: Future[(List[Edit[Command]], Version)]): (Change, State) = |
272 { |
275 { |
273 val change = new Change(previous, edits, result) |
276 val change = new Change(previous, edits, result) |
274 (change, copy(history = history + change)) |
277 (change, copy(history = history + change)) |
275 } |
278 } |
282 change.is_finished && is_assigned(change.version.get_finished)) |
285 change.is_finished && is_assigned(change.version.get_finished)) |
283 require(found_stable.isDefined) |
286 require(found_stable.isDefined) |
284 val stable = found_stable.get |
287 val stable = found_stable.get |
285 val latest = history.undo_list.head |
288 val latest = history.undo_list.head |
286 |
289 |
|
290 // FIXME proper treatment of deleted nodes |
287 val edits = |
291 val edits = |
288 (pending_edits /: history.undo_list.takeWhile(_ != stable))((edits, change) => |
292 (pending_edits /: history.undo_list.takeWhile(_ != stable))((edits, change) => |
289 (for ((a, eds) <- change.edits if a == name) yield eds).flatten ::: edits) |
293 (for ((a, Some(eds)) <- change.edits if a == name) yield eds).flatten ::: edits) |
290 lazy val reverse_edits = edits.reverse |
294 lazy val reverse_edits = edits.reverse |
291 |
295 |
292 new Snapshot |
296 new Snapshot |
293 { |
297 { |
294 val version = stable.version.get_finished |
298 val version = stable.version.get_finished |