Collections Interfaces

Traversers

At the root of the Basis collections hierarchy sits the humble Traverser, interface, which declares just a single method.

trait Traverser[+A] extends Any with Family[Traverser[_]] {
  def traverse(f: A => Unit): Unit
}

But don't let Traverser's minimal makeup mislead you–there's more here than meets the eye:

scala> import basis.collections._
import basis.collections._

scala> val xs = Traverser(1, 2, 3)
xs: basis.collections.Traverser[Int] = List(1, 2, 3)

scala> val ys = xs.map(_.toString)
ys: basis.collections.Traverser[String] = List("1", "2", "3")

Implementing a Traverser

To implement a new Traverser, simply extend the interface and fill-in its traverse method:

case class IntRange(lower: Int, upper: Int) extends Traverser[Int] {
  override def traverse(f: Int => Unit): Unit = {
    var i = lower
    while (i <= upper) { f(i); i += 1 }
  }
}

Traverser deliberately avoids declaring a traditional foreach method. This leaves the namespace open for macros to fill-in precisely defined traversal semantics. You don't have to care about this though; just use foreach, and other collection operators, like you normally would:

scala> val xs = IntRange(1, 3)
xs: IntRange = IntRange(1,3)

scala> xs foreach Predef.println
1
2
3

scala> val sum = xs reduce (_ + _)
sum: Int = 6

scala> val ys = xs map (2.0 * _)
ys: basis.collections.Traverser[Double] = List(2.0, 4.0, 6.0)