-
Notifications
You must be signed in to change notification settings - Fork 19
/
actors.groovy
54 lines (45 loc) · 1.28 KB
/
actors.groovy
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
@Grab("org.codehaus.gpars:gpars:1.2.1")
import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor
class Dragon extends DefaultActor {
int age
void afterStart() {
age = new Random().nextInt(1000) + 1
}
void act() {
loop {
react { int num ->
if (num > age)
reply 'too old'
else if (num < age)
reply 'too young'
else {
reply 'you win'
terminate()
}
}
}
}
}
class Guesser extends DefaultActor {
String name
Actor server
int myNum
void act() {
loop {
myNum = new Random().nextInt(1000) + 1
server.send myNum
react {
switch (it) {
case 'too old': println "$name: $myNum was too old"; break
case 'too young': println "$name: $myNum was too young"; break
case 'you win': println "$name: I won $myNum"; terminate(); break
}
}
}
}
}
def master = new Dragon().start()
def player = new Guesser(name: 'Guesser', server: master).start()
//this forces main thread to live until both actors stop
[master, player]*.join()