@@ -7,28 +7,45 @@ import collection.mutable
7
7
*/
8
8
abstract class SimpleIdentitySet [+ Elem <: AnyRef ] {
9
9
def size : Int
10
- final def isEmpty : Boolean = size == 0
11
10
def + [E >: Elem <: AnyRef ](x : E ): SimpleIdentitySet [E ]
12
11
def - [E >: Elem <: AnyRef ](x : E ): SimpleIdentitySet [Elem ]
13
12
def contains [E >: Elem <: AnyRef ](x : E ): Boolean
14
13
def foreach (f : Elem => Unit ): Unit
15
14
def exists [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean
16
15
def /: [A , E >: Elem <: AnyRef ](z : A )(f : (A , E ) => A ): A
17
16
def toList : List [Elem ]
17
+
18
+ final def isEmpty : Boolean = size == 0
19
+
20
+ def forall [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean = ! exists(! p(_))
21
+
22
+ def filter (p : Elem => Boolean ): SimpleIdentitySet [Elem ] =
23
+ val z : SimpleIdentitySet [Elem ] = SimpleIdentitySet .empty
24
+ (z /: this )((s, x) => if p(x) then s + x else s)
25
+
18
26
def ++ [E >: Elem <: AnyRef ](that : SimpleIdentitySet [E ]): SimpleIdentitySet [E ] =
19
27
if (this .size == 0 ) that
20
28
else if (that.size == 0 ) this
21
29
else ((this : SimpleIdentitySet [E ]) /: that)(_ + _)
30
+
22
31
def -- [E >: Elem <: AnyRef ](that : SimpleIdentitySet [E ]): SimpleIdentitySet [E ] =
23
32
if (that.size == 0 ) this
24
33
else
25
34
((SimpleIdentitySet .empty: SimpleIdentitySet [E ]) /: this ) { (s, x) =>
26
35
if (that.contains(x)) s else s + x
27
36
}
28
- override def toString : String = toList.mkString(" ( " , " , " , " ) " )
37
+ override def toString : String = toList.mkString(" { " , " , " , " } " )
29
38
}
30
39
31
40
object SimpleIdentitySet {
41
+
42
+ def apply [Elem <: AnyRef ](elems : Elem * ): SimpleIdentitySet [Elem ] =
43
+ elems.foldLeft(empty : SimpleIdentitySet [Elem ])(_ + _)
44
+
45
+ extension [E <: AnyRef ](xs : SimpleIdentitySet [E ])
46
+ def intersect (ys : SimpleIdentitySet [E ]): SimpleIdentitySet [E ] =
47
+ xs.filter(ys.contains)
48
+
32
49
object empty extends SimpleIdentitySet [Nothing ] {
33
50
def size : Int = 0
34
51
def + [E <: AnyRef ](x : E ): SimpleIdentitySet [E ] =
0 commit comments