Scala Library: scala.collection.generic.IsTraversableOnce
scala.collection.generic.IsTraversableOnce
trait IsTraversableOnce[Repr] extends AnyRef
Type class witnessing that a collection representation type Repr
has elements
of type A
and has a conversion to GenTraversableOnce[A]
.
This type enables simple enrichment of GenTraversableOnce
s with extension
methods which can make full use of the mechanics of the Scala collections
framework in their implementation.
Example usage,
class FilterMapImpl[A, Repr](val r: GenTraversableOnce[A]) {
final def filterMap[B, That](f: A => Option[B])(implicit cbf: CanBuildFrom[Repr, B, That]): That = {
val b = cbf()
for(e <- r.seq) f(e) foreach (b +=)
b.result
}
}
implicit def filterMap[Repr, A](r: Repr)(implicit fr: IsTraversableOnce[Repr]): FilterMapImpl[fr.A,Repr] =
new FilterMapImpl[fr.A, Repr](fr.conversion(r))
val l = List(1, 2, 3, 4, 5)
List(1, 2, 3, 4, 5) filterMap (i => if(i % 2 == 0) Some(i) else None)
// == List(2, 4)
- Source
- Since
- 2.10
Type Members
abstract type A
The type of elements we can traverse over.
Abstract Value Members From scala.collection.generic.IsTraversableOnce
abstract val conversion: (Repr) ⇒ GenTraversableOnce[A]
A conversion from the representation type Repr
to a GenTraversableOnce[A]
.
(defined at scala.collection.generic.IsTraversableOnce)
Full Source:
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala
package collection
package generic
/** Type class witnessing that a collection representation type `Repr` has
* elements of type `A` and has a conversion to `GenTraversableOnce[A]`.
*
* This type enables simple enrichment of `GenTraversableOnce`s with extension
* methods which can make full use of the mechanics of the Scala collections
* framework in their implementation.
*
* Example usage,
* {{{
* class FilterMapImpl[A, Repr](val r: GenTraversableOnce[A]) {
* final def filterMap[B, That](f: A => Option[B])(implicit cbf: CanBuildFrom[Repr, B, That]): That = {
* val b = cbf()
* for(e <- r.seq) f(e) foreach (b +=)
* b.result
* }
* }
* implicit def filterMap[Repr, A](r: Repr)(implicit fr: IsTraversableOnce[Repr]): FilterMapImpl[fr.A,Repr] =
* new FilterMapImpl[fr.A, Repr](fr.conversion(r))
*
* val l = List(1, 2, 3, 4, 5)
* List(1, 2, 3, 4, 5) filterMap (i => if(i % 2 == 0) Some(i) else None)
* // == List(2, 4)
* }}}
*
* @author Miles Sabin
* @author J. Suereth
* @since 2.10
*/
trait IsTraversableOnce[Repr] {
/** The type of elements we can traverse over. */
type A
/** A conversion from the representation type `Repr` to a `GenTraversableOnce[A]`. */
val conversion: Repr => GenTraversableOnce[A]
}
object IsTraversableOnce {
import scala.language.higherKinds
implicit val stringRepr: IsTraversableOnce[String] { type A = Char } =
new IsTraversableOnce[String] {
type A = Char
val conversion = implicitly[String => GenTraversableOnce[Char]]
}
implicit def genTraversableLikeRepr[C[_], A0](implicit conv: C[A0] => GenTraversableOnce[A0]): IsTraversableOnce[C[A0]] { type A = A0 } =
new IsTraversableOnce[C[A0]] {
type A = A0
val conversion = conv
}
}
Interested in Scala?
I send out weekly, personalized emails with articles and conference talks.
Subscribe now.