13
13
package scala
14
14
package collection
15
15
16
- import mutable .{ Buffer , Builder , ArrayBuffer }
16
+ import mutable .{ArrayBuffer , Buffer , Builder }
17
17
import generic .CanBuildFrom
18
- import scala .annotation .unchecked .{ uncheckedVariance => uV }
19
- import scala .language .{implicitConversions , higherKinds }
18
+ import scala .annotation .unchecked .{uncheckedVariance => uV }
19
+ import scala .language .{higherKinds , implicitConversions }
20
20
import scala .reflect .ClassTag
21
+ import scala .runtime .AbstractFunction1
21
22
22
23
/** A template trait for collections which can be traversed either once only
23
24
* or one or more times.
@@ -115,32 +116,39 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
115
116
116
117
// for internal use
117
118
protected [this ] def reversed = {
118
- object reverser extends Function1 [A , Unit ] {
119
+ // avoid the LazyRef as we don't have an @eager object
120
+ class reverser extends AbstractFunction1 [A , Unit ] {
119
121
var elems : List [A ] = Nil
120
122
override def apply (v1 : A ): Unit = elems ::= v1
121
123
}
124
+ val reverser = new reverser
122
125
self foreach reverser
123
126
reverser.elems
124
127
}
125
128
126
129
def size : Int = {
127
130
// we can't guard with isEmpty as some implementation have
128
131
// def isEmpty = size == 0
129
- object counter extends Function1 [A , Unit ] {
132
+
133
+ // avoid the LazyRef as we don't have an @eager object
134
+ class counter extends AbstractFunction1 [A , Unit ] {
130
135
var result = 0
131
136
override def apply (v1 : A ): Unit = result += 1
132
137
}
138
+ val counter = new counter
133
139
self foreach counter
134
140
counter.result
135
141
}
136
142
137
143
def nonEmpty : Boolean = ! isEmpty
138
144
139
145
def count (p : A => Boolean ): Int = {
140
- object counter extends Function1 [A , Unit ] {
146
+ // avoid the LazyRef as we don't have an @eager object
147
+ class counter extends AbstractFunction1 [A , Unit ] {
141
148
var result = 0
142
149
override def apply (v1 : A ): Unit = if (p(v1)) result += 1
143
150
}
151
+ val counter = new counter
144
152
this foreach counter
145
153
counter.result
146
154
}
@@ -182,10 +190,12 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
182
190
def : \ [B ](z : B )(op : (A , B ) => B ): B = foldRight(z)(op)
183
191
184
192
def foldLeft [B ](z : B )(op : (B , A ) => B ): B = {
185
- object folder extends Function1 [A , Unit ] {
193
+ // avoid the LazyRef as we don't have an @eager object
194
+ class folder extends AbstractFunction1 [A , Unit ] {
186
195
var result = z
187
196
override def apply (v1 : A ): Unit = result = op(result,v1)
188
197
}
198
+ val folder = new folder
189
199
this foreach folder
190
200
folder.result
191
201
}
@@ -211,7 +221,8 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
211
221
if (isEmpty)
212
222
throw new UnsupportedOperationException (" empty.reduceLeft" )
213
223
214
- object reducer extends Function1 [A , Unit ] {
224
+ // avoid the LazyRef as we don't have an @eager object
225
+ class reducer extends AbstractFunction1 [A , Unit ] {
215
226
var first = true
216
227
var acc : B = 0 .asInstanceOf [B ]
217
228
@@ -222,6 +233,7 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
222
233
}
223
234
else acc = op(acc, x)
224
235
}
236
+ val reducer = new reducer
225
237
self foreach reducer
226
238
reducer.acc
227
239
}
@@ -268,11 +280,12 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
268
280
def maxBy [B ](f : A => B )(implicit cmp : Ordering [B ]): A = {
269
281
if (isEmpty)
270
282
throw new UnsupportedOperationException (" empty.maxBy" )
271
- object maxer extends Function1 [A , Unit ] {
283
+
284
+ // avoid the LazyRef as we don't have an @eager object
285
+ class maxer extends AbstractFunction1 [A , Unit ] {
272
286
var maxF : B = null .asInstanceOf [B ]
273
287
var maxElem : A = null .asInstanceOf [A ]
274
288
var first = true
275
-
276
289
override def apply (elem : A ): Unit = {
277
290
val fx = f(elem)
278
291
if (first || cmp.gt(fx, maxF)) {
@@ -281,18 +294,21 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
281
294
first = false
282
295
}
283
296
}
297
+
284
298
}
299
+ val maxer = new maxer
285
300
self foreach maxer
286
301
maxer.maxElem
287
302
}
288
303
def minBy [B ](f : A => B )(implicit cmp : Ordering [B ]): A = {
289
304
if (isEmpty)
290
305
throw new UnsupportedOperationException (" empty.minBy" )
291
- object miner extends Function1 [A , Unit ] {
306
+
307
+ // avoid the LazyRef as we don't have an @eager object
308
+ class miner extends AbstractFunction1 [A , Unit ] {
292
309
var minF : B = null .asInstanceOf [B ]
293
310
var minElem : A = null .asInstanceOf [A ]
294
311
var first = true
295
-
296
312
override def apply (elem : A ): Unit = {
297
313
val fx = f(elem)
298
314
if (first || cmp.lt(fx, minF)) {
@@ -301,7 +317,9 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
301
317
first = false
302
318
}
303
319
}
320
+
304
321
}
322
+ val miner = new miner
305
323
self foreach miner
306
324
miner.minElem
307
325
}
@@ -388,7 +406,8 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
388
406
*/
389
407
def addString (b : StringBuilder , start : String , sep : String , end : String ): StringBuilder = {
390
408
b append start
391
- object appender extends Function1 [A , Unit ] {
409
+
410
+ class appender extends AbstractFunction1 [A , Unit ] {
392
411
var first = true
393
412
override def apply (x : A ): Unit = {
394
413
if (first) {
@@ -401,6 +420,7 @@ trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
401
420
}
402
421
}
403
422
}
423
+ val appender = new appender
404
424
self foreach appender
405
425
b append end
406
426
b
0 commit comments