@@ -14,7 +14,10 @@ abstract class SimpleIdentitySet[+Elem <: AnyRef] {
14
14
def contains [E >: Elem <: AnyRef ](x : E ): Boolean
15
15
def foreach (f : Elem => Unit ): Unit
16
16
def exists [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean
17
- def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ]
17
+ def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
18
+ var acc : SimpleIdentitySet [B ] = SimpleIdentitySet .empty
19
+ foreach(x => acc += f(x))
20
+ acc
18
21
def /: [A , E >: Elem <: AnyRef ](z : A )(f : (A , E ) => A ): A
19
22
def toList : List [Elem ]
20
23
def iterator : Iterator [Elem ]
@@ -63,7 +66,7 @@ object SimpleIdentitySet {
63
66
def contains [E <: AnyRef ](x : E ): Boolean = false
64
67
def foreach (f : Nothing => Unit ): Unit = ()
65
68
def exists [E <: AnyRef ](p : E => Boolean ): Boolean = false
66
- def map [B <: AnyRef ](f : Nothing => B ): SimpleIdentitySet [B ] = empty
69
+ override def map [B <: AnyRef ](f : Nothing => B ): SimpleIdentitySet [B ] = empty
67
70
def /: [A , E <: AnyRef ](z : A )(f : (A , E ) => A ): A = z
68
71
def toList = Nil
69
72
def iterator = Iterator .empty
@@ -79,7 +82,7 @@ object SimpleIdentitySet {
79
82
def foreach (f : Elem => Unit ): Unit = f(x0.asInstanceOf [Elem ])
80
83
def exists [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean =
81
84
p(x0.asInstanceOf [E ])
82
- def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
85
+ override def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
83
86
Set1 (f(x0.asInstanceOf [Elem ]))
84
87
def /: [A , E >: Elem <: AnyRef ](z : A )(f : (A , E ) => A ): A =
85
88
f(z, x0.asInstanceOf [E ])
@@ -99,8 +102,10 @@ object SimpleIdentitySet {
99
102
def foreach (f : Elem => Unit ): Unit = { f(x0.asInstanceOf [Elem ]); f(x1.asInstanceOf [Elem ]) }
100
103
def exists [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean =
101
104
p(x0.asInstanceOf [E ]) || p(x1.asInstanceOf [E ])
102
- def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
103
- Set2 (f(x0.asInstanceOf [Elem ]), f(x1.asInstanceOf [Elem ]))
105
+ override def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
106
+ val y0 = f(x0.asInstanceOf [Elem ])
107
+ val y1 = f(x1.asInstanceOf [Elem ])
108
+ if y0 eq y1 then Set1 (y0) else Set2 (y0, y1)
104
109
def /: [A , E >: Elem <: AnyRef ](z : A )(f : (A , E ) => A ): A =
105
110
f(f(z, x0.asInstanceOf [E ]), x1.asInstanceOf [E ])
106
111
def toList = x0.asInstanceOf [Elem ] :: x1.asInstanceOf [Elem ] :: Nil
@@ -133,8 +138,12 @@ object SimpleIdentitySet {
133
138
}
134
139
def exists [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean =
135
140
p(x0.asInstanceOf [E ]) || p(x1.asInstanceOf [E ]) || p(x2.asInstanceOf [E ])
136
- def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
137
- Set3 (f(x0.asInstanceOf [Elem ]), f(x1.asInstanceOf [Elem ]), f(x2.asInstanceOf [Elem ]))
141
+ override def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
142
+ val y0 = f(x0.asInstanceOf [Elem ])
143
+ val y1 = f(x1.asInstanceOf [Elem ])
144
+ val y2 = f(x2.asInstanceOf [Elem ])
145
+ if (y0 ne y1) && (y0 ne y2) && (y1 ne y2) then Set3 (y0, y1, y2)
146
+ else super .map(f)
138
147
def /: [A , E >: Elem <: AnyRef ](z : A )(f : (A , E ) => A ): A =
139
148
f(f(f(z, x0.asInstanceOf [E ]), x1.asInstanceOf [E ]), x2.asInstanceOf [E ])
140
149
def toList = x0.asInstanceOf [Elem ] :: x1.asInstanceOf [Elem ] :: x2.asInstanceOf [Elem ] :: Nil
@@ -182,8 +191,6 @@ object SimpleIdentitySet {
182
191
}
183
192
def exists [E >: Elem <: AnyRef ](p : E => Boolean ): Boolean =
184
193
xs.asInstanceOf [Array [E ]].exists(p)
185
- def map [B <: AnyRef ](f : Elem => B ): SimpleIdentitySet [B ] =
186
- SetN (xs.map(x => f(x.asInstanceOf [Elem ]).asInstanceOf [AnyRef ]))
187
194
def /: [A , E >: Elem <: AnyRef ](z : A )(f : (A , E ) => A ): A =
188
195
xs.asInstanceOf [Array [E ]].foldLeft(z)(f)
189
196
def toList : List [Elem ] = {
0 commit comments