I am trying to enrich all TraversableOnce[String] objects, and I can't figure out the right syntax for building iterators. This is what I have so far:
class Exclaimer[R <: TraversableOnce[String]](val lines:R) {
import scala.collection.generic.CanBuildFrom
def exclaim(implicit bf:CanBuildFrom[R,String,R]):R = {
val b = bf(lines)
lines.foreach(b += _)
b.result
}
}
implicit def WrapExclaimer[R <: TraversableOnce[String]](lines:R) = new Exclaimer(lines)
It works fine for collections (i.e. it returns an collection of the same class as I gave it), but it doesn't work for iterators, because it Cannot construct a collection of type Iterator[java.lang.String] with elements of type String based on a collection of type Iterator[java.lang.String]
. How do I fix this? I'm using Scala 2.9 (edit: I mistakenly wrote 2.8).
Here is some sample output:
scala> List("a","b","c").exclaim
res5: List[java.lang.String] = List(a, b, c)
scala> Vector("a","b","c").exclaim
res6: scala.collection.immutable.Vector[java.lang.String] = Vector(a, b, c)
scala> List("a","b","c").iterator.exclaim
<console>:10: error: Cannot construct a collection of type Iterator[java.lang.String] with elements of type String based on a collection of type Iterator[java.lang.String].
List("a","b","c").iterator.exclaim
^