equal
deleted
inserted
replaced
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 { |