How do I add a foreachWithIndex
method on Scala collections?
This is what I could come up with so far:
implicit def iforeach[A, CC <: TraversableLike[A, CC]](coll: CC) = new {
def foreachWithIndex[B](f: (A, Int) => B): Unit = {
var i = 0
for (c <- coll) {
f(c, i)
i += 1
}
}
}
This doesn't work:
Vector(9, 11, 34).foreachWithIndex { (el, i) =>
println(el, i)
}
Raises the following error:
error: value foreachWithIndex is not a member of scala.collection.immutable.Vector[Int]
Vector(9, 11, 34).foreachWithIndex { (el, i) =>
However the code works when I explicitly apply the conversion method:
iforeach[Int, Vector[Int]](Vector(9, 11, 34)).foreachWithIndex { (el, i) =>
println(el, i)
}
Output:
(9,0)
(11,1)
(34,2)
How do I make it make it work without explicit application of a conversion method? Thanks.
You need to extend Iterable:
output:
See this post by Rex Kerr for more information.
The short answer is that you have to parameterize
CC
if you do it that way or the type inferencer can't figure out whatA
is. The other short answer is do it the way I describe in the answer to this question.To expand a little bit more, there's really no reason that you need
CC <: TraversableLike
--just have it take aTraversable
and start withiforeach[A](coll: Traversable[A])
! You don't need to use fancy type bounds in order to use a superclass/supertrait. If you want to do something more complicated where you return another collection with collection type preserved, then you need to use builders and such, which I describe in the other question.If what you're interested in is only iterating with an index, you might as well just skip the whole pimping part and do something like