diff --git a/keywords-Yield/src/main/scala/com/thoughtworks/dsl/keywords/Yield.scala b/keywords-Yield/src/main/scala/com/thoughtworks/dsl/keywords/Yield.scala index d1964f829..3ef191a89 100644 --- a/keywords-Yield/src/main/scala/com/thoughtworks/dsl/keywords/Yield.scala +++ b/keywords-Yield/src/main/scala/com/thoughtworks/dsl/keywords/Yield.scala @@ -3,6 +3,7 @@ package com.thoughtworks.dsl.keywords import com.thoughtworks.dsl.Dsl import com.thoughtworks.dsl.Dsl.Keyword import com.thoughtworks.dsl.keywords.Yield.From +import com.thoughtworks.enableIf import com.thoughtworks.enableMembersIf import scala.collection._ @@ -68,6 +69,17 @@ private[keywords] object YieldScalaVersions { trait LowPriorityYield1 extends LowPriorityYield3 { + @enableIf(scala.util.Properties.versionNumberString.matches("""^2\.11\..*$""")) + implicit def seqViewYieldFromDsl[A, FromCollection <: Traversable[A], Coll1, Coll2]( + implicit canBuildFrom: CanBuildFrom[SeqView[A, Coll1], A, SeqView[A, Coll2]]) + : Dsl[From[FromCollection], SeqView[A, Coll1], Unit] = + new Dsl[From[FromCollection], SeqView[A, Coll1], Unit] { + def cpsApply(keyword: From[FromCollection], generateTail: Unit => SeqView[A, Coll1]): SeqView[A, Coll1] = { + (keyword.elements.toSeq.view ++: generateTail(()))(canBuildFrom).asInstanceOf[SeqView[A, Coll1]] + } + } + + @enableIf(scala.util.Properties.versionNumberString.matches("""^2\.12\..*$""")) implicit def seqViewYieldFromDsl[A, FromCollection <: Traversable[A], Coll1, Coll2]( implicit canBuildFrom: CanBuildFrom[SeqView[A, Coll1], A, SeqView[A, Coll2]]) : Dsl[From[FromCollection], SeqView[A, Coll1], Unit] = @@ -122,6 +134,20 @@ private[keywords] object YieldScalaVersions { } } + implicit def indexedSeqViewYieldFromDsl[A, FromCollection <: View.SomeIterableOps[A]]: Dsl[From[FromCollection], IndexedSeqView[A], Unit] = + new Dsl[From[FromCollection], IndexedSeqView[A], Unit] { + def cpsApply(keyword: From[FromCollection], generateTail: Unit => IndexedSeqView[A]): IndexedSeqView[A] = { + new IndexedSeqView.Concat(keyword.elements.toIndexedSeq, generateTail(())) + } + } + + implicit def seqViewYieldFromDsl[A, FromCollection <: View.SomeIterableOps[A]]: Dsl[From[FromCollection], SeqView[A], Unit] = + new Dsl[From[FromCollection], SeqView[A], Unit] { + def cpsApply(keyword: From[FromCollection], generateTail: Unit => SeqView[A]): SeqView[A] = { + new SeqView.Concat(keyword.elements.toSeq, generateTail(())) + } + } + implicit def seqViewYieldDsl[A, B >: A]: Dsl[Yield[A], SeqView[B], Unit] = new Dsl[Yield[A], SeqView[B], Unit] { def cpsApply(keyword: Yield[A], generateTail: Unit => SeqView[B]): SeqView[B] = { diff --git a/keywords-Yield/src/test/scala/com/thoughtworks/dsl/keywords/YieldSpec.scala b/keywords-Yield/src/test/scala/com/thoughtworks/dsl/keywords/YieldSpec.scala index c640c0c57..92b072110 100644 --- a/keywords-Yield/src/test/scala/com/thoughtworks/dsl/keywords/YieldSpec.scala +++ b/keywords-Yield/src/test/scala/com/thoughtworks/dsl/keywords/YieldSpec.scala @@ -7,12 +7,13 @@ import scala.annotation.tailrec import scala.collection.{LinearSeq, SeqView} import scala.runtime.NonLocalReturnControl import org.scalatest.freespec.AnyFreeSpec +import org.scalatest.Assertions import org.scalatest.matchers.should.Matchers /** * @author 杨博 (Yang Bo) */ -class YieldSpec extends AnyFreeSpec with Matchers { +class YieldSpec extends AnyFreeSpec with Matchers with Assertions { { !Yield(1) @@ -303,9 +304,28 @@ class YieldSpec extends AnyFreeSpec with Matchers { "view" - { - def shouldCompile = { - !Yield("naked") - Vector.empty[String].view + "indexed seq view" in { + def generator = { + !Yield("naked") + Vector.empty[String].view + } + assert(generator.toList == List("naked")) + } + + "yield from indexed seq view" in { + def generator = { + !Yield(100, 101) + Vector.empty[Int].view + } + assert(generator.toList == List(100, 101)) + } + + "yield from seq view" in { + def generator = { + !Yield(100, 101) + Seq.empty[Int].view + } + assert(generator.toList == List(100, 101)) } "local method" in {