more precise implementation of trait methods -- oddly this seems to require copy/paste for +, ++;
authorwenzelm
Tue, 23 Jun 2009 12:42:45 +0200
changeset 3177420745ab5b79a
parent 31761 3585bebe49a8
child 31775 c2c2d380729d
more precise implementation of trait methods -- oddly this seems to require copy/paste for +, ++;
misc tuning;
src/Pure/General/scan.scala
     1.1 --- a/src/Pure/General/scan.scala	Tue Jun 23 10:22:11 2009 +0200
     1.2 +++ b/src/Pure/General/scan.scala	Tue Jun 23 12:42:45 2009 +0200
     1.3 @@ -19,11 +19,8 @@
     1.4      private case class Tree(val branches: Map[Char, (String, Tree)])
     1.5      private val empty_tree = Tree(Map())
     1.6  
     1.7 -    private def make(tree: Tree): Lexicon =
     1.8 -      new Lexicon { override val main_tree = tree }
     1.9 -
    1.10      val empty: Lexicon = new Lexicon
    1.11 -    def apply(strs: String*): Lexicon = (empty /: strs) ((lex, str) => lex + str)
    1.12 +    def apply(elems: String*): Lexicon = empty ++ elems
    1.13    }
    1.14  
    1.15    class Lexicon extends scala.collection.immutable.Set[String] with RegexParsers
    1.16 @@ -31,7 +28,7 @@
    1.17      /* representation */
    1.18  
    1.19      import Lexicon.Tree
    1.20 -    val main_tree: Tree = Lexicon.empty_tree
    1.21 +    private val main_tree: Tree = Lexicon.empty_tree
    1.22  
    1.23  
    1.24      /* auxiliary operations */
    1.25 @@ -75,34 +72,42 @@
    1.26      def size: Int = content(main_tree, Nil).length
    1.27      def elements: Iterator[String] = content(main_tree, Nil).sort(_ <= _).elements
    1.28  
    1.29 -    def contains(str: String): Boolean =
    1.30 -      lookup(str) match {
    1.31 +    def contains(elem: String): Boolean =
    1.32 +      lookup(elem) match {
    1.33          case Some((tip, _)) => tip
    1.34          case _ => false
    1.35        }
    1.36  
    1.37 -    def +(str: String): Lexicon =
    1.38 -    {
    1.39 -      val len = str.length
    1.40 -      def extend(tree: Tree, i: Int): Tree =
    1.41 -      {
    1.42 -        if (i < len) {
    1.43 -          val c = str.charAt(i)
    1.44 -          val end = (i + 1 == len)
    1.45 -          tree.branches.get(c) match {
    1.46 -            case Some((s, tr)) =>
    1.47 -              Tree(tree.branches + (c -> (if (end) str else s, extend(tr, i + 1))))
    1.48 -            case None =>
    1.49 -              Tree(tree.branches + (c -> (if (end) str else "", extend(Lexicon.empty_tree, i + 1))))
    1.50 -          }
    1.51 -        } else tree
    1.52 +    def + (elem: String): Lexicon =
    1.53 +      if (contains(elem)) this
    1.54 +      else {
    1.55 +        val len = elem.length
    1.56 +        def extend(tree: Tree, i: Int): Tree =
    1.57 +          if (i < len) {
    1.58 +            val c = elem.charAt(i)
    1.59 +            val end = (i + 1 == len)
    1.60 +            tree.branches.get(c) match {
    1.61 +              case Some((s, tr)) =>
    1.62 +                Tree(tree.branches +
    1.63 +                  (c -> (if (end) elem else s, extend(tr, i + 1))))
    1.64 +              case None =>
    1.65 +                Tree(tree.branches +
    1.66 +                  (c -> (if (end) elem else "", extend(Lexicon.empty_tree, i + 1))))
    1.67 +            }
    1.68 +          } else tree
    1.69 +        val old = this
    1.70 +        new Lexicon { override val main_tree = extend(old.main_tree, 0) }
    1.71        }
    1.72 -      if (contains(str)) this
    1.73 -      else Lexicon.make(extend(main_tree, 0))
    1.74 -    }
    1.75 +
    1.76 +    override def + (elem1: String, elem2: String, elems: String*): Lexicon =
    1.77 +      this + elem1 + elem2 ++ elems
    1.78 +    override def ++ (elems: Iterable[String]): Lexicon =
    1.79 +      (this /: elems) ((s, elem) => s + elem)
    1.80 +    override def ++ (elems: Iterator[String]): Lexicon =
    1.81 +      (this /: elems) ((s, elem) => s + elem)
    1.82  
    1.83      def empty[A]: Set[A] = error("Undefined")
    1.84 -    def -(str: String): Lexicon = error("Undefined")
    1.85 +    def - (str: String): Lexicon = error("Undefined")
    1.86  
    1.87  
    1.88      /* RegexParsers methods */