summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2009-04-08 16:06:59 +0000
committerPhilipp Haller <hallerp@gmail.com>2009-04-08 16:06:59 +0000
commite42d7e8399d3893f22a0c2c1e50fd781f37a45b7 (patch)
tree7d5e9acbc7a4258f92ca37c9305b13422af0db19 /src/actors
parent7a458d71310d747914a50715bfba1f20f521f502 (diff)
downloadscala-e42d7e8399d3893f22a0c2c1e50fd781f37a45b7.tar.gz
scala-e42d7e8399d3893f22a0c2c1e50fd781f37a45b7.tar.bz2
scala-e42d7e8399d3893f22a0c2c1e50fd781f37a45b7.zip
Made Future's InputChannel for useful, especial...
Made Future's InputChannel for useful, especially in conjunction with the def svn di/2 in the Actor trait.
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/Actor.scala19
-rw-r--r--src/actors/scala/actors/Future.scala2
2 files changed, 15 insertions, 6 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala
index c84844c594..8deef11398 100644
--- a/src/actors/scala/actors/Actor.scala
+++ b/src/actors/scala/actors/Actor.scala
@@ -659,23 +659,32 @@ trait Actor extends AbstractActor {
* precise type for the reply value.
*/
def !![A](msg: Any, f: PartialFunction[Any, A]): Future[A] = {
- val ftch = new Channel[Any](Actor.self(scheduler))
- send(msg, ftch)
+ val ftch = new Channel[A](Actor.self(scheduler))
+ send(msg, new OutputChannel[Any] {
+ def !(msg: Any) =
+ ftch ! f(msg)
+ def send(msg: Any, replyTo: OutputChannel[Any]) =
+ ftch.send(f(msg), replyTo)
+ def forward(msg: Any) =
+ ftch.forward(f(msg))
+ def receiver =
+ ftch.receiver
+ })
new Future[A](ftch) {
def apply() =
if (isSet) value.get.asInstanceOf[A]
else ch.receive {
- case any => value = Some(f(any)); value.get.asInstanceOf[A]
+ case any => value = Some(any); value.get.asInstanceOf[A]
}
def respond(k: A => Unit): Unit =
if (isSet) k(value.get.asInstanceOf[A])
else ch.react {
- case any => value = Some(f(any)); k(value.get.asInstanceOf[A])
+ case any => value = Some(any); k(value.get.asInstanceOf[A])
}
def isSet = value match {
case None => ch.receiveWithin(0) {
case TIMEOUT => false
- case any => value = Some(f(any)); true
+ case any => value = Some(any); true
}
case Some(_) => true
}
diff --git a/src/actors/scala/actors/Future.scala b/src/actors/scala/actors/Future.scala
index e7ba7573e2..9275ec1b07 100644
--- a/src/actors/scala/actors/Future.scala
+++ b/src/actors/scala/actors/Future.scala
@@ -25,7 +25,7 @@ package scala.actors
* @author Philipp Haller
* @version 0.9.16
*/
-abstract class Future[+T](val ch: InputChannel[Any]) extends Responder[T] with Function0[T] {
+abstract class Future[+T](val ch: InputChannel[T]) extends Responder[T] with Function0[T] {
protected var value: Option[Any] = None
def isSet: Boolean
}