diff --git a/src/main/scala/strawman/collection/Iterable.scala b/src/main/scala/strawman/collection/Iterable.scala index 5e4b1e82737a..530b9af7f949 100644 --- a/src/main/scala/strawman/collection/Iterable.scala +++ b/src/main/scala/strawman/collection/Iterable.scala @@ -285,6 +285,9 @@ trait IterableOps[+A, +CC[X], +C] extends Any { /** Flatmap */ def flatMap[B](f: A => IterableOnce[B]): CC[B] = fromIterable(View.FlatMap(coll, f)) + def flatten[B](implicit ev: A => IterableOnce[B]): CC[B] = + fromIterable(View.FlatMap(coll, ev)) + /** Returns a new $coll containing the elements from the left hand operand followed by the elements from the * right hand operand. The element type of the $coll is the most specific superclass encompassing * the element types of the two operands. diff --git a/src/main/scala/strawman/collection/package.scala b/src/main/scala/strawman/collection/package.scala index 480bbdd9ff2b..e90cdfc91b3e 100644 --- a/src/main/scala/strawman/collection/package.scala +++ b/src/main/scala/strawman/collection/package.scala @@ -1,6 +1,6 @@ package strawman -import scala.{Any, AnyVal, Array, Char, IllegalArgumentException, IndexOutOfBoundsException, Int, NoSuchElementException, Unit, UnsupportedOperationException} +import scala.{Any, AnyVal, Array, Boolean, Char, IllegalArgumentException, IndexOutOfBoundsException, Int, NoSuchElementException, Unit, UnsupportedOperationException} import scala.Predef.String import scala.reflect.ClassTag @@ -71,6 +71,13 @@ package object collection extends LowPriority { } } + implicit def optionToIterableOnce[A](maybeA: scala.Option[A]): IterableOnce[A] = + new Iterator[A] { + private var _hasNext = maybeA.nonEmpty + def next(): A = if (_hasNext) { _hasNext = false; maybeA.get } else Iterator.empty.next() + def hasNext: Boolean = _hasNext + } + } class LowPriority { diff --git a/src/test/scala/strawman/collection/test/FlattenTest.scala b/src/test/scala/strawman/collection/test/FlattenTest.scala new file mode 100644 index 000000000000..a67e35d40f22 --- /dev/null +++ b/src/test/scala/strawman/collection/test/FlattenTest.scala @@ -0,0 +1,23 @@ +package strawman +package collection.test + +import org.junit.Test +import strawman.collection.Seq +import strawman.collection.immutable.{ImmutableArray, List} + +import scala.{Int, Some, Unit} +import scala.Predef.{$conforms, assert} + +class FlattenTest { + + def f(xs: Seq[Seq[Int]], ys: Seq[Int]): Unit = { + assert(xs.flatten == ys) + assert(ys.flatMap(y => Some(y)) == ys.map(y => Some(y)).flatten) + } + + @Test + def flattenTest: Unit = { + f(List(ImmutableArray(1, 2, 3)), List(1, 2, 3)) + } + +}