src/Pure/PIDE/markup_tree.scala
changeset 45456 9ba615ac75fb
parent 45455 4f974c0c5c2f
child 45457 615ba724b269
equal deleted inserted replaced
45455:4f974c0c5c2f 45456:9ba615ac75fb
    13 import scala.collection.immutable.SortedMap
    13 import scala.collection.immutable.SortedMap
    14 
    14 
    15 
    15 
    16 object Markup_Tree
    16 object Markup_Tree
    17 {
    17 {
    18   /* branches sorted by quasi-order -- overlapping ranges appear as equivalent */
    18   type Select[A] = PartialFunction[Text.Markup, A]
       
    19 
       
    20   val empty: Markup_Tree = new Markup_Tree(Branches.empty)
    19 
    21 
    20   object Branches
    22   object Branches
    21   {
    23   {
    22     type Entry = (Text.Markup, Markup_Tree)
    24     type Entry = (Text.Markup, Markup_Tree)
    23     type T = SortedMap[Text.Range, Entry]
    25     type T = SortedMap[Text.Range, Entry]
    24 
    26 
    25     val empty = SortedMap.empty[Text.Range, Entry](Text.Range.Ordering)
    27     val empty: T = SortedMap.empty(Text.Range.Ordering)
    26 
    28 
    27     def update(branches: T, entry: Entry): T = branches + (entry._1.range -> entry)
    29     def update(branches: T, entry: Entry): T = branches + (entry._1.range -> entry)
    28     def single(entry: Entry): T = update(empty, entry)
    30     def single(entry: Entry): T = update(empty, entry)
    29 
    31 
    30     def overlapping(range: Text.Range, branches: T): T =  // FIXME special cases!?
    32     def overlapping(range: Text.Range, branches: T): T =  // FIXME special cases!?
    36         case Some(end) if range overlaps end._1.range => update(bs, end)
    38         case Some(end) if range overlaps end._1.range => update(bs, end)
    37         case _ => bs
    39         case _ => bs
    38       }
    40       }
    39     }
    41     }
    40   }
    42   }
    41 
       
    42   val empty = new Markup_Tree(Branches.empty)
       
    43 
       
    44   type Select[A] = PartialFunction[Text.Markup, A]
       
    45 }
    43 }
    46 
    44 
    47 
    45 
    48 sealed case class Markup_Tree(val branches: Markup_Tree.Branches.T)
    46 class Markup_Tree private(branches: Markup_Tree.Branches.T)
    49 {
    47 {
    50   import Markup_Tree._
    48   import Markup_Tree._
    51 
    49 
    52   override def toString =
    50   override def toString =
    53     branches.toList.map(_._2) match {
    51     branches.toList.map(_._2) match {