scala.collection.generic

IsTraversableLike

trait IsTraversableLike[Repr] extends AnyRef

A trait which can be used to avoid code duplication when defining extension methods that should be applicable both to existing Scala collections (i.e., types extending GenTraversableLike) as well as other (potentially user-defined) types that could be converted to a Scala collection type. This trait makes it possible to treat Scala collections and types that can be implicitly converted to a collection type uniformly. For example, one can provide extension methods that work both on collection types and on Strings (Strings do not extend GenTraversableLike, but can be converted to GenTraversableLike)

IsTraversable provides two members:

  1. type member A, which represents the element type of the target GenTraversableLike[A, Repr]
  2. value member conversion, which provides a way to convert between the type we wish to add extension methods to, Repr, and GenTraversableLike[A, Repr].
Usage

One must provide IsTraversableLike as an implicit parameter type of an implicit conversion. Its usage is shown below. Our objective in the following example is to provide a generic extension method mapReduce to any type that extends or can be converted to GenTraversableLike. In our example, this includes String.

import scala.collection.GenTraversableLike
  import scala.collection.generic.IsTraversableLike

  class ExtensionMethods[A, Repr](coll: GenTraversableLike[A, Repr]) {
    def mapReduce[B](mapper: A => B)(reducer: (B, B) => B): B = {
      val iter = coll.toIterator
      var res = mapper(iter.next())
      while (iter.hasNext)
        res = reducer(res, mapper(iter.next()))
      res
    }
  }

  implicit def withExtensions[Repr](coll: Repr)(implicit traversable: IsTraversableLike[Repr]) =
    new ExtensionMethods(traversable.conversion(coll))

// See it in action!
List(1, 2, 3).mapReduce(_ * 2)(_ + _) // res0: Int = 12
"Yeah, well, you know, that's just, like, your opinion, man.".mapReduce(x => 1)(_ + _) // res1: Int = 59

Here, we begin by creating a class ExtensionMethods which contains our mapReduce extension method. Note that ExtensionMethods takes a constructor argument coll of type GenTraversableLike[A, Repr], where A represents the element type and Repr represents (typically) the collection type. The implementation of mapReduce itself is straightforward.

The interesting bit is the implicit conversion withExtensions, which returns an instance of ExtensionMethods. This implicit conversion can only be applied if there is an implicit value traversable of type IsTraversableLike[Repr] in scope. Since IsTraversableLike provides value member conversion, which gives us a way to convert between whatever type we wish to add an extension method to (in this case, Repr) and GenTraversableLike[A, Repr], we can now convert coll from type Repr to GenTraversableLike[A, Repr]. This allows us to create an instance of the ExtensionMethods class, which we pass our new GenTraversableLike[A, Repr] to.

When the mapReduce method is called on some type of which it is not a member, implicit search is triggered. Because implicit conversion withExtensions is generic, it will be applied as long as an implicit value of type IsTraversableLike[Repr] can be found. Given that IsTraversableLike contains implicit members that return values of type IsTraversableLike, this requirement is typically satisfied, and the chain of interactions described in the previous paragraph is set into action. (See the IsTraversableLike companion object, which contains a precise specification of the available implicits.)

Note: Currently, it's not possible to combine the implicit conversion and the class with the extension methods into an implicit class due to limitations of type inference.

Implementing IsTraversableLike for New Types

One must simply provide an implicit value of type IsTraversableLike specific to the new type, or an implicit conversion which returns an instance of IsTraversableLike specific to the new type.

Below is an example of an implementation of the IsTraversableLike trait where the Repr type is String.

implicit val stringRepr: IsTraversableLike[String] { type A = Char } =
new IsTraversableLike[String] {
  type A = Char
  val conversion = implicitly[String => GenTraversableLike[Char, String]]
}
Since

2.10

Linear Supertypes
AnyRef, Any
Type Hierarchy Learn more about scaladoc diagrams
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. IsTraversableLike
  2. AnyRef
  3. Any
Implicitly
  1. by any2stringadd
  2. by StringFormat
  3. by Ensuring
  4. by ArrowAssoc
  1. Hide All
  2. Show all
Learn more about member selection
Visibility
  1. Public
  2. All

Type Members

  1. abstract type A

    The type of elements we can traverse over.

Abstract Value Members

  1. abstract val conversion: (Repr) ⇒ GenTraversableLike[A, Repr]

    A conversion from the representation type Repr to a GenTraversableLike[A,Repr].

Concrete Value Members

  1. final def !=(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Definition Classes
    AnyRef → Any
  3. def +(other: String): String

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to any2stringadd[IsTraversableLike[Repr]] performed by method any2stringadd in scala.Predef.
    Definition Classes
    any2stringadd
  4. def ->[B](y: B): (IsTraversableLike[Repr], B)

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to ArrowAssoc[IsTraversableLike[Repr]] performed by method ArrowAssoc in scala.Predef.
    Definition Classes
    ArrowAssoc
    Annotations
    @inline()
  5. final def ==(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  6. final def asInstanceOf[T0]: T0

    Definition Classes
    Any
  7. def clone(): AnyRef

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  8. def ensuring(cond: (IsTraversableLike[Repr]) ⇒ Boolean, msg: ⇒ Any): IsTraversableLike[Repr]

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to Ensuring[IsTraversableLike[Repr]] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  9. def ensuring(cond: (IsTraversableLike[Repr]) ⇒ Boolean): IsTraversableLike[Repr]

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to Ensuring[IsTraversableLike[Repr]] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  10. def ensuring(cond: Boolean, msg: ⇒ Any): IsTraversableLike[Repr]

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to Ensuring[IsTraversableLike[Repr]] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  11. def ensuring(cond: Boolean): IsTraversableLike[Repr]

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to Ensuring[IsTraversableLike[Repr]] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  12. final def eq(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  13. def equals(arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  14. def finalize(): Unit

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  15. def formatted(fmtstr: String): String

    Returns string formatted according to given format string.

    Returns string formatted according to given format string. Format strings are as for String.format (@see java.lang.String.format).

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to StringFormat[IsTraversableLike[Repr]] performed by method StringFormat in scala.Predef.
    Definition Classes
    StringFormat
    Annotations
    @inline()
  16. final def getClass(): Class[_]

    Definition Classes
    AnyRef → Any
  17. def hashCode(): Int

    Definition Classes
    AnyRef → Any
  18. final def isInstanceOf[T0]: Boolean

    Definition Classes
    Any
  19. final def ne(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  20. final def notify(): Unit

    Definition Classes
    AnyRef
  21. final def notifyAll(): Unit

    Definition Classes
    AnyRef
  22. final def synchronized[T0](arg0: ⇒ T0): T0

    Definition Classes
    AnyRef
  23. def toString(): String

    Definition Classes
    AnyRef → Any
  24. final def wait(): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  25. final def wait(arg0: Long, arg1: Int): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  26. final def wait(arg0: Long): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  27. def [B](y: B): (IsTraversableLike[Repr], B)

    Implicit information
    This member is added by an implicit conversion from IsTraversableLike[Repr] to ArrowAssoc[IsTraversableLike[Repr]] performed by method ArrowAssoc in scala.Predef.
    Definition Classes
    ArrowAssoc

Inherited from AnyRef

Inherited from Any

Inherited by implicit conversion any2stringadd from IsTraversableLike[Repr] to any2stringadd[IsTraversableLike[Repr]]

Inherited by implicit conversion StringFormat from IsTraversableLike[Repr] to StringFormat[IsTraversableLike[Repr]]

Inherited by implicit conversion Ensuring from IsTraversableLike[Repr] to Ensuring[IsTraversableLike[Repr]]

Inherited by implicit conversion ArrowAssoc from IsTraversableLike[Repr] to ArrowAssoc[IsTraversableLike[Repr]]

Ungrouped