src/Pure/PIDE/document.scala
changeset 40478 4bae781b8f7c
parent 39698 625a3bc4417b
child 40479 cc06f5528bb1
equal deleted inserted replaced
40477:780c27276593 40478:4bae781b8f7c
    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