1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
import scala.actors.MigrationSystem._
import scala.actors.Actor._
import scala.actors.{ Actor, StashingActor, ActorRef, Props, MigrationSystem, PoisonPill }
import java.util.concurrent.{ TimeUnit, CountDownLatch }
import scala.collection.mutable.ArrayBuffer
import scala.concurrent.util.duration._
import scala.concurrent.{ Promise, Await }
object Test {
val finishedSingle, finishedSingle1, finishedLoop, finishedLoop1 = Promise[Boolean]
def testDoubleReceive() = {
println("Original")
// Snippet that shows how to get rid of receive calls in Scala Actors.
// This snippet is used in the Actors Migration Kit.
val myActor = actor {
println("do before")
receive {
case "hello" =>
println("receive 1")
}
println("do in between")
receive {
case "hello" =>
println("receive 1")
}
println("do after")
finishedSingle.success(true)
}
myActor ! "hello"
myActor ! "hello"
Await.ready(finishedSingle.future, 5 seconds)
println("Transformed")
val myActorReact = actor {
println("do before")
react (({
case "hello" =>
println("receive 1")
}: PartialFunction[Any, Unit]).andThen { x =>
println("do in between")
react (({
case "hello" =>
println("receive 1")
}: PartialFunction[Any, Unit]).andThen { x =>
println("do after")
finishedSingle1.success(true)
})
})
}
myActorReact ! "hello"
myActorReact ! "hello"
Await.ready(finishedSingle1.future, 5 seconds)
}
def testLoopReceive() = {
println("Test Loop Receive")
// Snippet that shows how to get rid of receive calls in loops.
// This snippet is used in the Actors Migration Kit.
println("Original")
val myActor = actor {
var c = true
while (c) {
println("do before body")
receive {
case "hello" =>
println("receive 1")
case "exit" =>
c = false
}
println("do after receive")
}
println("after loop")
finishedLoop.success(true)
}
myActor ! "hello"
myActor ! "exit"
Await.ready(finishedLoop.future, 5 seconds)
println("Transformed")
val myActorReact = actor {
var c = true
loopWhile(c) {
println("do before body")
react (({
case "hello" =>
println("receive 1")
case "exit" =>
c = false
}: PartialFunction[Any, Unit]).andThen { x =>
println("do after receive")
if (c == false) {
println("after loop")
finishedLoop1.success(true)
}
})
}
}
myActorReact ! "hello"
myActorReact ! "exit"
Await.ready(finishedLoop1.future, 5 seconds)
}
def main(args: Array[String]) = {
testDoubleReceive()
testLoopReceive()
}
}
|