diff --git a/geny/src/geny/Generator.scala b/geny/src/geny/Generator.scala index 02f0e4d..7b6fe84 100644 --- a/geny/src/geny/Generator.scala +++ b/geny/src/geny/Generator.scala @@ -83,6 +83,7 @@ trait Generator[+A]{ result } + def scanLeft[B](start: B)(f: (B,A) => B): Generator[B] = new Generator.Scanned(this,start,f) def reduce[B >: A](f: (B, A) => B): B = reduceLeft(f) def reduceLeft[B >: A](f: (B, A) => B): B = { @@ -297,6 +298,16 @@ object Generator{ override def toString = s"$inner.map($func)" } + private class Scanned[+T, V](inner: Generator[V], initial: T, func: (T,V) => T) extends Generator[T]{ + def generate(f: T => Generator.Action) = { + var acc = initial + inner.generate{ v => + acc = func(acc,v) + f(acc) + } + } + } + private class Sliced[+T](inner: Generator[T], start: Int, end: Int) extends Generator[T]{ def generate(f: T => Generator.Action) = { var count = 0 diff --git a/geny/test/src/geny/TestGenerator.scala b/geny/test/src/geny/TestGenerator.scala index 1a7a478..85a76e9 100644 --- a/geny/test/src/geny/TestGenerator.scala +++ b/geny/test/src/geny/TestGenerator.scala @@ -62,6 +62,10 @@ object TestGenerator extends TestSuite{ assert(Generator.from[IndexedSeq, Int](0 until 10).foldLeft(0)(_ + _) == 45) assert(Generator.from[IndexedSeq, Int](0 until 0).foldLeft(0)(_ + _) == 0) } + test("scanLeft"){ + assert(Generator(1,2,3,4).scanLeft(100)(_ + _).toList == List(101,103,106,110)) + assert(Generator[Int]().scanLeft(100)(_ + _).toList == List()) + } test("concat"){