summaryrefslogtreecommitdiff
path: root/test/files/jvm/actmig-PinS.scala
blob: 3f07fab12e4c8bd545423472f8ab97d2d567124e (plain) (blame)
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
116
/**
 * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change
 * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov.
 */
import scala.actors._
import scala.concurrent.duration._
import scala.concurrent.{ Promise, Await }

import scala.actors.Actor._

/* PinS, Listing 32.1: A simple actor
 */
object SillyActor extends Actor {
  def act() {
    for (i <- 1 to 5)
      println("I'm acting!")

    println("Post stop")
  }
}

object SeriousActor extends Actor {
  def act() {
    for (i <- 1 to 5)
      println("To be or not to be.")
  }
}

/* PinS, Listing 32.3: An actor that calls react
 */
object NameResolver extends Actor {
  import java.net.{InetAddress, UnknownHostException}

  def act() {
    react {
      case (name: String, actor: Actor) =>
        actor ! getIp(name)
        act()
      case "EXIT" =>
        println("Name resolver exiting.")
        // quit
      case msg =>
        println("Unhandled message: " + msg)
        act()
    }
  }

  def getIp(name: String): Option[InetAddress] = {
    try {
      Some(InetAddress.getByName(name))
    } catch {
      case _: UnknownHostException => None
    }
  }

}

object Test extends App {
  /* PinS, Listing 32.2: An actor that calls receive
   */
  def makeEchoActor(): Actor = actor {
    while (true) {
      receive {
        case 'stop =>
          exit()
        case msg =>
          println("received message: " + msg)
      }
    }
  }

  /* PinS, page 696
   */
  def makeIntActor(): Actor = actor {
    receive {
      case x: Int => // I only want Ints
        println("Got an Int: " + x)
    }
  }

  actor {
    self.trapExit = true
    self.link(SillyActor)
    SillyActor.start()
    react {
      case Exit(SillyActor, _) =>
        self.link(SeriousActor)
        SeriousActor.start()
        react {
          case Exit(SeriousActor, _) =>
            val seriousPromise2 = Promise[Boolean]
            // PinS, page 694
            val seriousActor2 = actor {
              for (i <- 1 to 5)
                println("That is the question.")
              seriousPromise2.success(true)
            }

            Await.ready(seriousPromise2.future, 5 seconds)
            val echoActor = makeEchoActor()
            self.link(echoActor)
            echoActor ! "hi there"
            echoActor ! 15
            echoActor ! 'stop
            react {
              case Exit(_, _) =>
                val intActor = makeIntActor()
                intActor ! "hello"
                intActor ! math.Pi
                // only the following send leads to output
                intActor ! 12
            }
        }
    }
  }
}