pekko/akka-docs/src/main/paradox/scala/code/docs/agent/AgentDocSpec.scala
Arnout Engelen a4a0d308ad 'git mv' rst resources to md
This is mainly intended to keep the git history as neat as possible.
No actual conversion yet, so now both the rst and the paradox docs
are broken, which will be fixed in the next commits.
2017-05-10 15:44:43 +02:00

156 lines
3.8 KiB
Scala

/**
* Copyright (C) 2009-2017 Lightbend Inc. <http://www.lightbend.com>
*/
package docs.agent
import language.postfixOps
import akka.agent.Agent
import scala.concurrent.duration._
import scala.concurrent.{ Await, ExecutionContext }
import akka.testkit._
import scala.concurrent.Future
class AgentDocSpec extends AkkaSpec {
"create" in {
//#create
import scala.concurrent.ExecutionContext.Implicits.global
import akka.agent.Agent
val agent = Agent(5)
//#create
}
"read value" in {
import scala.concurrent.ExecutionContext.Implicits.global
val agent = Agent(0)
{
//#read-apply
val result = agent()
//#read-apply
result should be(0)
}
{
//#read-get
val result = agent.get
//#read-get
result should be(0)
}
{
//#read-future
val future = agent.future
//#read-future
Await.result(future, 5 seconds) should be(0)
}
}
"send and sendOff" in {
val agent = Agent(0)(ExecutionContext.global)
//#send
// send a value, enqueues this change
// of the value of the Agent
agent send 7
// send a function, enqueues this change
// to the value of the Agent
agent send (_ + 1)
agent send (_ * 2)
//#send
def longRunningOrBlockingFunction = (i: Int) => i * 1 // Just for the example code
def someExecutionContext() = scala.concurrent.ExecutionContext.Implicits.global // Just for the example code
//#send-off
// the ExecutionContext you want to run the function on
implicit val ec = someExecutionContext()
// sendOff a function
agent sendOff longRunningOrBlockingFunction
//#send-off
Await.result(agent.future, 5 seconds) should be(16)
}
"alter and alterOff" in {
val agent = Agent(0)(ExecutionContext.global)
//#alter
// alter a value
val f1: Future[Int] = agent alter 7
// alter a function
val f2: Future[Int] = agent alter (_ + 1)
val f3: Future[Int] = agent alter (_ * 2)
//#alter
def longRunningOrBlockingFunction = (i: Int) => i * 1 // Just for the example code
def someExecutionContext() = ExecutionContext.global // Just for the example code
//#alter-off
// the ExecutionContext you want to run the function on
implicit val ec = someExecutionContext()
// alterOff a function
val f4: Future[Int] = agent alterOff longRunningOrBlockingFunction
//#alter-off
Await.result(f4, 5 seconds) should be(16)
}
"transfer example" in {
//#transfer-example
import scala.concurrent.ExecutionContext.Implicits.global
import akka.agent.Agent
import scala.concurrent.duration._
import scala.concurrent.stm._
def transfer(from: Agent[Int], to: Agent[Int], amount: Int): Boolean = {
atomic { txn =>
if (from.get < amount) false
else {
from send (_ - amount)
to send (_ + amount)
true
}
}
}
val from = Agent(100)
val to = Agent(20)
val ok = transfer(from, to, 50)
val fromValue = from.future // -> 50
val toValue = to.future // -> 70
//#transfer-example
Await.result(fromValue, 5 seconds) should be(50)
Await.result(toValue, 5 seconds) should be(70)
ok should be(true)
}
"monadic example" in {
def println(a: Any) = ()
//#monadic-example
import scala.concurrent.ExecutionContext.Implicits.global
val agent1 = Agent(3)
val agent2 = Agent(5)
// uses foreach
for (value <- agent1)
println(value)
// uses map
val agent3 = for (value <- agent1) yield value + 1
// or using map directly
val agent4 = agent1 map (_ + 1)
// uses flatMap
val agent5 = for {
value1 <- agent1
value2 <- agent2
} yield value1 + value2
//#monadic-example
agent3() should be(4)
agent4() should be(4)
agent5() should be(8)
}
}