Skip to content

Commit c7bcc3b

Browse files
authored
Merge pull request scala#61 from erikvanoosten/iterator-doc-and-test-improvements
Test IteratorDecorator on infinite iterators
2 parents 233937f + f2e8a68 commit c7bcc3b

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/main/scala/scala/collection/decorators/IteratorDecorator.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import scala.annotation.tailrec
77
*
88
* @define mayNotTerminateInf
99
* Note: may not terminate for infinite iterators.
10+
* @define doesNotTerminateInf
11+
* Note: does not terminate for infinite iterators.
1012
* @define consumesIterator
1113
* After calling this method, one should discard the iterator it was called
1214
* on. Using it is undefined and subject to change.
@@ -144,7 +146,7 @@ class IteratorDecorator[A](val `this`: Iterator[A]) extends AnyVal {
144146
}
145147

146148
/**
147-
* $mayNotTerminateInf
149+
* $doesNotTerminateInf
148150
* @note Reuse: $consumesIterator
149151
*/
150152
def lazyFoldRight[B](z: B)(op: A => Either[B, B => B]): B = {

src/test/scala/scala/collection/decorators/IteratorDecoratorTest.scala

+19
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class IteratorDecoratorTest {
1212
Assert.assertEquals(Seq('a', ',', 'b', ',', 'c'), Iterator('a', 'b', 'c').intersperse(',').toSeq)
1313
Assert.assertEquals(Seq('a'), Iterator('a').intersperse(',').toSeq)
1414
Assert.assertEquals(Seq.empty, Iterator().intersperse(',').toSeq)
15+
// Works with infinite iterators:
16+
Assert.assertEquals(Seq(1, 0, 2, 0, 3), Iterator.from(1).intersperse(0).take(5).toSeq)
1517
}
1618

1719
@Test
@@ -21,6 +23,8 @@ class IteratorDecoratorTest {
2123
Iterator('a', 'b', 'c').intersperse('[', ',', ']').toSeq)
2224
Assert.assertEquals(Seq('[', 'a', ']'), Iterator('a').intersperse('[', ',', ']').toSeq)
2325
Assert.assertEquals(Seq('[', ']'), Iterator().intersperse('[', ',', ']').toSeq)
26+
// Works with infinite iterators:
27+
Assert.assertEquals(Seq(-1, 1, 0, 2, 0, 3), Iterator.from(1).intersperse(-1, 0, 99).take(6).toSeq)
2428
}
2529

2630
@Test
@@ -30,6 +34,9 @@ class IteratorDecoratorTest {
3034
Assert.assertEquals(6, Iterator(1, 2, 3).foldSomeLeft(0)(sumOp))
3135
Assert.assertEquals(6, Iterator(1, 2, 3, 4, 5).foldSomeLeft(0)(sumOp))
3236
Assert.assertEquals(0, Iterator(4, 5).foldSomeLeft(0)(sumOp))
37+
// Works with infinite iterators:
38+
def sumMax4(acc: Int, e: Int): Option[Int] = if (acc == 4) None else Some(acc + e)
39+
Assert.assertEquals(4, Iterator.continually(1).foldSomeLeft(0)(sumMax4))
3340
}
3441

3542
@Test
@@ -43,6 +50,8 @@ class IteratorDecoratorTest {
4350
Assert.assertEquals(9, Iterator(4, 5).lazyFoldLeft(0)(sumOp))
4451
Assert.assertEquals(9, Iterator(4, 5, 1).lazyFoldLeft(0)(sumOp))
4552
Assert.assertEquals(10, Iterator(10, 20, 30).lazyFoldLeft(0)(sumOp))
53+
// Works with infinite iterators:
54+
Assert.assertEquals(5, Iterator.continually(1).lazyFoldLeft(0)(sumOp))
4655
}
4756

4857
@Test
@@ -54,6 +63,8 @@ class IteratorDecoratorTest {
5463
Assert.assertEquals(9, Iterator(4, 5).lazyFoldLeft(0)(delayedSumOp))
5564
Assert.assertEquals(5, Iterator(4, 5, 1).lazyFoldLeft(0)(delayedSumOp))
5665
Assert.assertEquals(5, Iterator(6, 1).lazyFoldLeft(0)(delayedSumOp))
66+
// Works with infinite iterators:
67+
Assert.assertEquals(5, Iterator.continually(1).lazyFoldLeft(0)(delayedSumOp))
5768

5869
// `alwaysGrowingSumOp` returns a new value every time, causing no stop in the iteration.
5970
def alwaysGrowingSumOp(acc: Int, e: => Int): Int = if (acc >= 5) acc + 1 else acc + e
@@ -117,4 +128,12 @@ class IteratorDecoratorTest {
117128
Iterator((1,1), (1,2), (2,3), (1,4)).splitBy(_._1).toSeq
118129
)
119130
}
131+
132+
@Test
133+
def splitByShouldSplitInfiniteIterators(): Unit = {
134+
Assert.assertEquals(
135+
Seq(Seq(0, 0, 0), Seq(1, 1, 1), Seq(2, 2, 2)),
136+
Iterator.from(0).map(_ / 3).splitBy(identity).take(3).toSeq
137+
)
138+
}
120139
}

0 commit comments

Comments
 (0)