| author | wenzelm | 
| Mon, 19 Apr 2010 17:57:07 +0200 | |
| changeset 36207 | a94bbede91c7 | 
| parent 36011 | 3ff725ac13a4 | 
| child 36781 | a991deb77cbb | 
| permissions | -rw-r--r-- | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
/* Title: Pure/General/linear_set.scala  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
Author: Makarius  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
3  | 
Author: Fabian Immler, TU Munich  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
|
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
Sets with canonical linear order, or immutable linked-lists.  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
*/  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
7  | 
|
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
package isabelle  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
10  | 
import scala.collection.SetLike  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
11  | 
import scala.collection.generic.{SetFactory, CanBuildFrom, GenericSetTemplate, GenericCompanion}
 | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
12  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
13  | 
|
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
14  | 
object Linear_Set extends SetFactory[Linear_Set]  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
15  | 
{
 | 
| 32465 | 16  | 
private case class Rep[A](  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
17  | 
val start: Option[A], val end: Option[A], val nexts: Map[A, A], prevs: Map[A, A])  | 
| 32465 | 18  | 
|
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
19  | 
private def empty_rep[A] = Rep[A](None, None, Map(), Map())  | 
| 32465 | 20  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
21  | 
private def make[A](start: Option[A], end: Option[A], nexts: Map[A, A], prevs: Map[A, A])  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
22  | 
    : Linear_Set[A] = new Linear_Set[A] { override val rep = Rep(start, end, nexts, prevs) }
 | 
| 32465 | 23  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
24  | 
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Linear_Set[A]] = setCanBuildFrom[A]  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
25  | 
override def empty[A] = new Linear_Set[A]  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
|
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
class Duplicate(s: String) extends Exception(s)  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
28  | 
class Undefined(s: String) extends Exception(s)  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
29  | 
}  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
30  | 
|
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
31  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
32  | 
class Linear_Set[A]  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
33  | 
extends scala.collection.immutable.Set[A]  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
34  | 
with GenericSetTemplate[A, Linear_Set]  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
35  | 
with SetLike[A, Linear_Set[A]]  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
36  | 
{
 | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
37  | 
override def companion: GenericCompanion[Linear_Set] = Linear_Set  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
38  | 
|
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
39  | 
|
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
40  | 
/* representation */  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
41  | 
|
| 32465 | 42  | 
protected val rep = Linear_Set.empty_rep[A]  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
43  | 
|
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
44  | 
|
| 32465 | 45  | 
/* auxiliary operations */  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
46  | 
|
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
47  | 
def next(elem: A): Option[A] = rep.nexts.get(elem)  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
48  | 
def prev(elem: A): Option[A] = rep.prevs.get(elem)  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
49  | 
|
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
50  | 
def insert_after(hook: Option[A], elem: A): Linear_Set[A] =  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
51  | 
if (contains(elem)) throw new Linear_Set.Duplicate(elem.toString)  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
52  | 
else  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
53  | 
      hook match {
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
54  | 
case None =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
55  | 
          rep.start match {
 | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
56  | 
case None => Linear_Set.make(Some(elem), Some(elem), Map(), Map())  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
57  | 
case Some(elem1) =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
58  | 
Linear_Set.make(Some(elem), rep.end,  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
59  | 
rep.nexts + (elem -> elem1), rep.prevs + (elem1 -> elem))  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
60  | 
}  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
61  | 
case Some(elem1) =>  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
62  | 
if (!contains(elem1)) throw new Linear_Set.Undefined(elem1.toString)  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
63  | 
else  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
64  | 
            rep.nexts.get(elem1) match {
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
65  | 
case None =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
66  | 
Linear_Set.make(rep.start, Some(elem),  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
67  | 
rep.nexts + (elem1 -> elem), rep.prevs + (elem -> elem1))  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
68  | 
case Some(elem2) =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
69  | 
Linear_Set.make(rep.start, rep.end,  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
70  | 
rep.nexts + (elem1 -> elem) + (elem -> elem2),  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
71  | 
rep.prevs + (elem2 -> elem) + (elem -> elem1))  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
72  | 
}  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
73  | 
}  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
74  | 
|
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
75  | 
def delete_after(hook: Option[A]): Linear_Set[A] =  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
76  | 
    hook match {
 | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
77  | 
case None =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
78  | 
        rep.start match {
 | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
79  | 
          case None => throw new Linear_Set.Undefined("")
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
80  | 
case Some(elem1) =>  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
81  | 
            rep.nexts.get(elem1) match {
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
82  | 
case None => empty  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
83  | 
case Some(elem2) =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
84  | 
Linear_Set.make(Some(elem2), rep.end, rep.nexts - elem1, rep.prevs - elem2)  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
85  | 
}  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
86  | 
}  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
87  | 
case Some(elem1) =>  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
88  | 
if (!contains(elem1)) throw new Linear_Set.Undefined(elem1.toString)  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
89  | 
else  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
90  | 
          rep.nexts.get(elem1) match {
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
91  | 
            case None => throw new Linear_Set.Undefined("")
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
92  | 
case Some(elem2) =>  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
93  | 
              rep.nexts.get(elem2) match {
 | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
94  | 
case None =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
95  | 
Linear_Set.make(rep.start, Some(elem1), rep.nexts - elem1, rep.prevs - elem2)  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
96  | 
case Some(elem3) =>  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
97  | 
Linear_Set.make(rep.start, rep.end,  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
98  | 
rep.nexts - elem2 + (elem1 -> elem3),  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
99  | 
rep.prevs - elem2 + (elem3 -> elem1))  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
100  | 
}  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
101  | 
}  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
102  | 
}  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
103  | 
|
| 
32577
 
892ebdaf19b4
added append_after (tuned version of former insert_after of Seq);
 
wenzelm 
parents: 
32576 
diff
changeset
 | 
104  | 
def append_after(hook: Option[A], elems: Seq[A]): Linear_Set[A] =  | 
| 32591 | 105  | 
(elems :\ this)((elem, set) => set.insert_after(hook, elem))  | 
| 
32577
 
892ebdaf19b4
added append_after (tuned version of former insert_after of Seq);
 
wenzelm 
parents: 
32576 
diff
changeset
 | 
106  | 
|
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
107  | 
def delete_between(from: Option[A], to: Option[A]): Linear_Set[A] =  | 
| 
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
108  | 
  {
 | 
| 32591 | 109  | 
if (isEmpty) this  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
110  | 
    else {
 | 
| 32465 | 111  | 
val next =  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
112  | 
if (from == rep.end) None  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
113  | 
else if (from == None) rep.start  | 
| 
32576
 
20b261654e33
double linking for improved performance of "prev";
 
wenzelm 
parents: 
32465 
diff
changeset
 | 
114  | 
else from.map(rep.nexts(_))  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
115  | 
if (next == to) this  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
116  | 
else delete_after(from).delete_between(from, to)  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
117  | 
}  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
118  | 
}  | 
| 
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
119  | 
|
| 32465 | 120  | 
|
121  | 
/* Set methods */  | 
|
122  | 
||
123  | 
override def stringPrefix = "Linear_Set"  | 
|
124  | 
||
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
125  | 
override def isEmpty: Boolean = !rep.start.isDefined  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
126  | 
override def size: Int = if (isEmpty) 0 else rep.nexts.size + 1  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
127  | 
|
| 34304 | 128  | 
def contains(elem: A): Boolean =  | 
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
129  | 
!isEmpty && (rep.end.get == elem || rep.nexts.isDefinedAt(elem))  | 
| 34304 | 130  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
131  | 
  private def iterator_from(start: Option[A]): Iterator[A] = new Iterator[A] {
 | 
| 34304 | 132  | 
private var next_elem = start  | 
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
133  | 
def hasNext = next_elem.isDefined  | 
| 34301 | 134  | 
def next =  | 
135  | 
      next_elem match {
 | 
|
136  | 
case Some(elem) =>  | 
|
137  | 
next_elem = rep.nexts.get(elem)  | 
|
138  | 
elem  | 
|
139  | 
        case None => throw new NoSuchElementException("next on empty iterator")
 | 
|
140  | 
}  | 
|
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
141  | 
}  | 
| 32465 | 142  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
143  | 
override def iterator: Iterator[A] = iterator_from(rep.start)  | 
| 34304 | 144  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
145  | 
def iterator(elem: A): Iterator[A] =  | 
| 
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
146  | 
if (contains(elem)) iterator_from(Some(elem))  | 
| 34304 | 147  | 
else throw new Linear_Set.Undefined(elem.toString)  | 
| 32465 | 148  | 
|
| 
36011
 
3ff725ac13a4
adapted to Scala 2.8.0 Beta1 -- with notable changes to scala.collection;
 
wenzelm 
parents: 
34304 
diff
changeset
 | 
149  | 
def + (elem: A): Linear_Set[A] = insert_after(rep.end, elem)  | 
| 32465 | 150  | 
|
151  | 
def - (elem: A): Linear_Set[A] =  | 
|
152  | 
if (!contains(elem)) throw new Linear_Set.Undefined(elem.toString)  | 
|
153  | 
else delete_after(prev(elem))  | 
|
| 
32464
 
5b9731f83569
added linear_set.scala from http://isabelle.in.tum.de/repos/isabelle-jedit/rev/d567692f9717
 
wenzelm 
parents:  
diff
changeset
 | 
154  | 
}  |