@@ -15,6 +15,7 @@ package scala.collection
1515import java .util .function .{Consumer , DoubleConsumer , IntConsumer , LongConsumer }
1616import java .util .{PrimitiveIterator , Spliterator , Iterator => JIterator }
1717import java .{lang => jl }
18+ import language .experimental .captureChecking
1819
1920import scala .collection .Stepper .EfficientSplit
2021
@@ -38,6 +39,8 @@ import scala.collection.Stepper.EfficientSplit
3839 * @tparam A the element type of the Stepper
3940 */
4041trait Stepper [@ specialized(Double , Int , Long ) + A ] {
42+ this : Stepper [A ]^ =>
43+
4144 /** Check if there's an element available. */
4245 def hasStep : Boolean
4346
@@ -183,9 +186,11 @@ object Stepper {
183186
184187/** A Stepper for arbitrary element types. See [[Stepper ]]. */
185188trait AnyStepper [+ A ] extends Stepper [A ] {
189+ this : AnyStepper [A ]^ =>
190+
186191 def trySplit (): AnyStepper [A ]
187192
188- def spliterator [B >: A ]: Spliterator [B ] = new AnyStepper .AnyStepperSpliterator (this )
193+ def spliterator [B >: A ]: Spliterator [B ]^ { this } = new AnyStepper .AnyStepperSpliterator (this )
189194
190195 def javaIterator [B >: A ]: JIterator [B ] = new JIterator [B ] {
191196 def hasNext : Boolean = hasStep
@@ -194,10 +199,10 @@ trait AnyStepper[+A] extends Stepper[A] {
194199}
195200
196201object AnyStepper {
197- class AnyStepperSpliterator [A ](s : AnyStepper [A ]) extends Spliterator [A ] {
202+ class AnyStepperSpliterator [A ](s : AnyStepper [A ]^ ) extends Spliterator [A ] {
198203 def tryAdvance (c : Consumer [_ >: A ]): Boolean =
199204 if (s.hasStep) { c.accept(s.nextStep()); true } else false
200- def trySplit (): Spliterator [A ] = {
205+ def trySplit (): Spliterator [A ]^ { this } = {
201206 val sp = s.trySplit()
202207 if (sp == null ) null else sp.spliterator
203208 }
@@ -253,17 +258,19 @@ object AnyStepper {
253258
254259/** A Stepper for Ints. See [[Stepper ]]. */
255260trait IntStepper extends Stepper [Int ] {
261+ this : IntStepper ^ =>
262+
256263 def trySplit (): IntStepper
257264
258- def spliterator [B >: Int ]: Spliterator .OfInt = new IntStepper .IntStepperSpliterator (this )
265+ def spliterator [B >: Int ]: Spliterator .OfInt ^ { this } = new IntStepper .IntStepperSpliterator (this )
259266
260267 def javaIterator [B >: Int ]: PrimitiveIterator .OfInt = new PrimitiveIterator .OfInt {
261268 def hasNext : Boolean = hasStep
262269 def nextInt (): Int = nextStep()
263270 }
264271}
265272object IntStepper {
266- class IntStepperSpliterator (s : IntStepper ) extends Spliterator .OfInt {
273+ class IntStepperSpliterator (s : IntStepper ^ ) extends Spliterator .OfInt {
267274 def tryAdvance (c : IntConsumer ): Boolean =
268275 if (s.hasStep) { c.accept(s.nextStep()); true } else false
269276 // Override for efficiency: don't wrap the function and call the `tryAdvance` overload
@@ -272,7 +279,7 @@ object IntStepper {
272279 case _ => if (s.hasStep) { c.accept(jl.Integer .valueOf(s.nextStep())); true } else false
273280 }
274281 // override required for dotty#6152
275- override def trySplit (): Spliterator .OfInt = {
282+ override def trySplit (): Spliterator .OfInt ^ { this } = {
276283 val sp = s.trySplit()
277284 if (sp == null ) null else sp.spliterator
278285 }
@@ -291,18 +298,19 @@ object IntStepper {
291298
292299/** A Stepper for Doubles. See [[Stepper ]]. */
293300trait DoubleStepper extends Stepper [Double ] {
301+ this : DoubleStepper ^ =>
294302 def trySplit (): DoubleStepper
295303
296- def spliterator [B >: Double ]: Spliterator .OfDouble = new DoubleStepper .DoubleStepperSpliterator (this )
304+ def spliterator [B >: Double ]: Spliterator .OfDouble ^ { this } = new DoubleStepper .DoubleStepperSpliterator (this )
297305
298- def javaIterator [B >: Double ]: PrimitiveIterator .OfDouble = new PrimitiveIterator .OfDouble {
306+ def javaIterator [B >: Double ]: PrimitiveIterator .OfDouble ^ { this } = new PrimitiveIterator .OfDouble {
299307 def hasNext : Boolean = hasStep
300308 def nextDouble (): Double = nextStep()
301309 }
302310}
303311
304312object DoubleStepper {
305- class DoubleStepperSpliterator (s : DoubleStepper ) extends Spliterator .OfDouble {
313+ class DoubleStepperSpliterator (s : DoubleStepper ^ ) extends Spliterator .OfDouble {
306314 def tryAdvance (c : DoubleConsumer ): Boolean =
307315 if (s.hasStep) { c.accept(s.nextStep()); true } else false
308316 // Override for efficiency: don't wrap the function and call the `tryAdvance` overload
@@ -311,7 +319,7 @@ object DoubleStepper {
311319 case _ => if (s.hasStep) { c.accept(java.lang.Double .valueOf(s.nextStep())); true } else false
312320 }
313321 // override required for dotty#6152
314- override def trySplit (): Spliterator .OfDouble = {
322+ override def trySplit (): Spliterator .OfDouble ^ { this } = {
315323 val sp = s.trySplit()
316324 if (sp == null ) null else sp.spliterator
317325 }
@@ -330,18 +338,20 @@ object DoubleStepper {
330338
331339/** A Stepper for Longs. See [[Stepper ]]. */
332340trait LongStepper extends Stepper [Long ] {
333- def trySplit (): LongStepper
341+ this : LongStepper ^ =>
342+
343+ def trySplit (): LongStepper ^ {this }
334344
335- def spliterator [B >: Long ]: Spliterator .OfLong = new LongStepper .LongStepperSpliterator (this )
345+ def spliterator [B >: Long ]: Spliterator .OfLong ^ { this } = new LongStepper .LongStepperSpliterator (this )
336346
337- def javaIterator [B >: Long ]: PrimitiveIterator .OfLong = new PrimitiveIterator .OfLong {
347+ def javaIterator [B >: Long ]: PrimitiveIterator .OfLong ^ { this } = new PrimitiveIterator .OfLong {
338348 def hasNext : Boolean = hasStep
339349 def nextLong (): Long = nextStep()
340350 }
341351}
342352
343353object LongStepper {
344- class LongStepperSpliterator (s : LongStepper ) extends Spliterator .OfLong {
354+ class LongStepperSpliterator (s : LongStepper ^ ) extends Spliterator .OfLong {
345355 def tryAdvance (c : LongConsumer ): Boolean =
346356 if (s.hasStep) { c.accept(s.nextStep()); true } else false
347357 // Override for efficiency: don't wrap the function and call the `tryAdvance` overload
@@ -350,7 +360,7 @@ object LongStepper {
350360 case _ => if (s.hasStep) { c.accept(java.lang.Long .valueOf(s.nextStep())); true } else false
351361 }
352362 // override required for dotty#6152
353- override def trySplit (): Spliterator .OfLong = {
363+ override def trySplit (): Spliterator .OfLong ^ { this } = {
354364 val sp = s.trySplit()
355365 if (sp == null ) null else sp.spliterator
356366 }
0 commit comments