pekko/akka-docs-dev/rst/scala/code/docs/stream/GraphCyclesSpec.scala

104 lines
2.5 KiB
Scala
Raw Normal View History

2014-12-18 14:55:15 +01:00
package docs.stream
import akka.stream.{ OverflowStrategy, ActorFlowMaterializer }
2014-12-18 14:55:15 +01:00
import akka.stream.scaladsl._
import akka.stream.testkit.AkkaSpec
class GraphCyclesSpec extends AkkaSpec {
implicit val mat = ActorFlowMaterializer()
2014-12-18 14:55:15 +01:00
"Cycle demonstration" must {
val source = Source(() => Iterator.from(0))
"include a deadlocked cycle" in {
//#deadlocked
// WARNING! The graph below deadlocks!
FlowGraph { implicit b =>
import FlowGraphImplicits._
b.allowCycles()
val merge = Merge[Int]
val bcast = Broadcast[Int]
source ~> merge ~> Flow[Int].map { (s) => println(s); s } ~> bcast ~> Sink.ignore
bcast ~> merge
}
//#deadlocked
}
"include an unfair cycle" in {
//#unfair
// WARNING! The graph below stops consuming from "source" after a few steps
FlowGraph { implicit b =>
import FlowGraphImplicits._
b.allowCycles()
val merge = MergePreferred[Int]
val bcast = Broadcast[Int]
source ~> merge ~> Flow[Int].map { (s) => println(s); s } ~> bcast ~> Sink.ignore
bcast ~> merge.preferred
}
//#unfair
}
"include a dropping cycle" in {
//#dropping
FlowGraph { implicit b =>
import FlowGraphImplicits._
b.allowCycles()
val merge = Merge[Int]
val bcast = Broadcast[Int]
source ~> merge ~> Flow[Int].map { (s) => println(s); s } ~> bcast ~> Sink.ignore
bcast ~> Flow[Int].buffer(10, OverflowStrategy.dropHead) ~> merge
}
//#dropping
}
"include a dead zipping cycle" in {
//#zipping-dead
// WARNING! The graph below never processes any elements
FlowGraph { implicit b =>
import FlowGraphImplicits._
b.allowCycles()
val zip = ZipWith[Int, Int, Int]((left, right) => right)
val bcast = Broadcast[Int]
source ~> zip.left ~> Flow[Int].map { (s) => println(s); s } ~> bcast ~> Sink.ignore
bcast ~> zip.right
}
//#zipping-dead
}
"include a live zipping cycle" in {
//#zipping-live
FlowGraph { implicit b =>
import FlowGraphImplicits._
b.allowCycles()
val zip = ZipWith[Int, Int, Int]((left, right) => left)
val bcast = Broadcast[Int]
val concat = Concat[Int]
source ~> zip.left ~> Flow[Int].map { (s) => println(s); s } ~> bcast ~> Sink.ignore
bcast ~> concat.second ~> zip.right
Source.single(0) ~> concat.first
}
//#zipping-live
}
}
}