Skip to content

Instantly share code, notes, and snippets.

@johnynek
Created December 22, 2014 20:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save johnynek/a0c8d2e747e02a9a6397 to your computer and use it in GitHub Desktop.
Save johnynek/a0c8d2e747e02a9a6397 to your computer and use it in GitHub Desktop.
Why doesn't scala give scanLeft on TraversableOnce?
/**
* This won't work because of the "situation" with scala collections. TraversableOnce actually
* needs like 12 methods implemented.
*/
class ScanLeft[A, B](it: TraversableOnce[A], init: B, fn: (B, A) => B) extends TraversableOnce[B] {
override def foreach[U](effect: B => U): Unit = {
var bstate = init
effect(bstate)
it.foreach { a: A =>
bstate = fn(bstate, a)
effect(bstate)
}
}
}
@viktorklang
Copy link

implicit class ScanLeft[A, Repr <: TraversableOnce[A]](val repr: Repr) extends AnyVal {  
  def scanLeft[B, That](z: B)(op: (B, A) => B)(implicit bf: scala.collection.generic.CanBuildFrom[Repr, B, That]): That = {
    val b = bf(repr)
    if (repr.isTraversableAgain) b.sizeHint(repr.size)
    var acc = z
    b += acc
    for (x <- repr) {
      acc = op(acc, x)
      b += acc
    }
    b.result
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment