diff options
-rw-r--r-- | src/actors/scala/actors/Actor.scala | 19 | ||||
-rw-r--r-- | src/actors/scala/actors/Future.scala | 2 |
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 } |