From cbdfd0fe237fde8ed1fd86f25caca8ba36170072 Mon Sep 17 00:00:00 2001 From: Derek Williams Date: Mon, 13 Jun 2011 20:25:31 -0600 Subject: [PATCH 1/3] Fix Future type issues --- .../test/scala/akka/dispatch/FutureSpec.scala | 30 +++++-------------- .../src/main/scala/akka/dispatch/Future.scala | 16 ++-------- .../src/main/scala/akka/japi/JavaAPI.scala | 8 ++--- 3 files changed, 14 insertions(+), 40 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala index d54bd1c12f..4bb58852cb 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala @@ -62,22 +62,8 @@ class FutureSpec extends JUnitSuite { def shouldFutureCompose { val actor1 = actorOf[TestActor].start() val actor2 = actorOf(new Actor { def receive = { case s: String ⇒ self reply s.toUpperCase } }).start() - val future1 = actor1 ? "Hello" mapTo manifest[String] flatMap ((s: String) ⇒ actor2 ? s) - val future2 = actor1 ? "Hello" mapTo manifest[String] flatMap (actor2 ? (_: String)) - val future3 = actor1 ? "Hello" mapTo manifest[Int] flatMap (actor2 ? (_: Int)) - assert((future1.get: Any) === "WORLD") - assert((future2.get: Any) === "WORLD") - intercept[ClassCastException] { future3.get } - actor1.stop() - actor2.stop() - } - - @Test - def shouldFutureComposePatternMatch { - val actor1 = actorOf[TestActor].start() - val actor2 = actorOf(new Actor { def receive = { case s: String ⇒ self reply s.toUpperCase } }).start() - val future1 = actor1 ? "Hello" collect { case (s: String) ⇒ s } flatMap (actor2 ? _) - val future2 = actor1 ? "Hello" collect { case (n: Int) ⇒ n } flatMap (actor2 ? _) + val future1 = actor1 ? "Hello" flatMap { case s: String ⇒ actor2 ? s } + val future2 = actor1 ? "Hello" flatMap { case i: Int ⇒ actor2 ? i } assert((future1.get: Any) === "WORLD") intercept[MatchError] { future2.get } actor1.stop() @@ -124,15 +110,15 @@ class FutureSpec extends JUnitSuite { }).start() val future1 = for { - Res(a: Int) ← actor.?(Req("Hello")).mapTo[Res[Int]] - Res(b: String) ← actor.?(Req(a)).mapTo[Res[String]] - Res(c: String) ← actor.?(Req(7)).mapTo[Res[String]] + Res(a: Int) ← actor ? Req("Hello") + Res(b: String) ← actor ? Req(a) + Res(c: String) ← actor ? Req(7) } yield b + "-" + c val future2 = for { - Res(a: Int) ← actor.?(Req("Hello")) - Res(b: Int) ← actor.?(Req(a)).mapTo[Res[Int]] - Res(c: Int) ← actor.?(Req(7)).mapTo[Res[Int]] + Res(a: Int) ← actor ? Req("Hello") + Res(b: Int) ← actor ? Req(a) + Res(c: Int) ← actor ? Req(7) } yield b + "-" + c assert(future1.get === "10-14") diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index 3e8bd0515b..b089c7debc 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -575,7 +575,7 @@ sealed trait Future[+T] { } } - /*final def withFilter(p: T ⇒ Boolean) = new FutureWithFilter[T](this, p) + final def withFilter(p: T ⇒ Boolean) = new FutureWithFilter[T](this, p) final class FutureWithFilter[+A](self: Future[A], p: A ⇒ Boolean) { def foreach(f: A ⇒ Unit): Unit = self filter p foreach f @@ -584,8 +584,7 @@ sealed trait Future[+T] { def withFilter(q: A ⇒ Boolean): FutureWithFilter[A] = new FutureWithFilter[A](self, x ⇒ p(x) && q(x)) } - final def filter(p: T ⇒ Boolean): Future[T] = { */ - final def filter(p: Any ⇒ Boolean): Future[T] = { + final def filter(p: T ⇒ Boolean): Future[T] = { val f = new DefaultPromise[T](timeoutInNanos, NANOS) onComplete { ft ⇒ val optv = ft.value @@ -621,17 +620,6 @@ sealed trait Future[+T] { } else None } - /* Java API */ - final def onComplete[A >: T](proc: Procedure[Future[A]]): this.type = onComplete(proc(_)) - - final def map[A >: T, B](f: JFunc[A, B]): Future[B] = map(f(_)) - - final def flatMap[A >: T, B](f: JFunc[A, Future[B]]): Future[B] = flatMap(f(_)) - - final def foreach[A >: T](proc: Procedure[A]): Unit = foreach(proc(_)) - - final def filter(p: JFunc[Any, Boolean]): Future[Any] = filter(p(_)) - } object Promise { diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index f5c4ccdcaa..05d52d2fac 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -3,28 +3,28 @@ package akka.japi /** * A Function interface. Used to create first-class-functions is Java (sort of). */ -trait Function[T, R] { +abstract class Function[-T, +R] extends (T) => R { def apply(param: T): R } /** * A Function interface. Used to create 2-arg first-class-functions is Java (sort of). */ -trait Function2[T1, T2, R] { +abstract class Function2[-T1, -T2, +R] extends (T1, T2) => R { def apply(arg1: T1, arg2: T2): R } /** * A Procedure is like a Function, but it doesn't produce a return value */ -trait Procedure[T] { +abstract class Procedure[-T] extends (T) => Unit { def apply(param: T): Unit } /** * A Procedure is like a Function, but it doesn't produce a return value */ -trait Procedure2[T1, T2] { +abstract class Procedure2[-T1, -T2] extends (T1, T2) => Unit { def apply(param: T1, param2: T2): Unit } From c62e6096d3b4f223434bf3b4c53bfc9aa62d58f2 Mon Sep 17 00:00:00 2001 From: Derek Williams Date: Mon, 13 Jun 2011 20:39:31 -0600 Subject: [PATCH 2/3] Didn't test that change, reverted to my original --- akka-actor/src/main/scala/akka/japi/JavaAPI.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index 05d52d2fac..76cac73fe2 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -3,28 +3,28 @@ package akka.japi /** * A Function interface. Used to create first-class-functions is Java (sort of). */ -abstract class Function[-T, +R] extends (T) => R { +abstract class Function[-T, +R] extends scala.Function1[T, R] { def apply(param: T): R } /** * A Function interface. Used to create 2-arg first-class-functions is Java (sort of). */ -abstract class Function2[-T1, -T2, +R] extends (T1, T2) => R { +abstract class Function2[-T1, -T2, +R] extends scala.Function2[T1, T2, R] { def apply(arg1: T1, arg2: T2): R } /** * A Procedure is like a Function, but it doesn't produce a return value */ -abstract class Procedure[-T] extends (T) => Unit { +abstract class Procedure[-T] extends scala.Function1[T, Unit] { def apply(param: T): Unit } /** * A Procedure is like a Function, but it doesn't produce a return value */ -abstract class Procedure2[-T1, -T2] extends (T1, T2) => Unit { +abstract class Procedure2[-T1, -T2] extends scala.Function2[T1, T2, Unit] { def apply(param: T1, param2: T2): Unit } From e18cc7bac6ca8734b75485acd616cd08be507f6d Mon Sep 17 00:00:00 2001 From: Derek Williams Date: Mon, 13 Jun 2011 22:31:06 -0600 Subject: [PATCH 3/3] revert changes to java api --- .../src/test/scala/akka/dispatch/FutureSpec.scala | 4 ++-- akka-actor/src/main/scala/akka/dispatch/Future.scala | 11 +++++++++++ akka-actor/src/main/scala/akka/japi/JavaAPI.scala | 8 ++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala index 4bb58852cb..df829177b9 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala @@ -62,8 +62,8 @@ class FutureSpec extends JUnitSuite { def shouldFutureCompose { val actor1 = actorOf[TestActor].start() val actor2 = actorOf(new Actor { def receive = { case s: String ⇒ self reply s.toUpperCase } }).start() - val future1 = actor1 ? "Hello" flatMap { case s: String ⇒ actor2 ? s } - val future2 = actor1 ? "Hello" flatMap { case i: Int ⇒ actor2 ? i } + val future1 = actor1 ? "Hello" flatMap { _ match { case s: String ⇒ actor2 ? s } } + val future2 = actor1 ? "Hello" flatMap { _ match { case i: Int ⇒ actor2 ? i } } assert((future1.get: Any) === "WORLD") intercept[MatchError] { future2.get } actor1.stop() diff --git a/akka-actor/src/main/scala/akka/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala index b089c7debc..02cd02f1df 100644 --- a/akka-actor/src/main/scala/akka/dispatch/Future.scala +++ b/akka-actor/src/main/scala/akka/dispatch/Future.scala @@ -620,6 +620,17 @@ sealed trait Future[+T] { } else None } + /* Java API */ + final def onComplete[A >: T](proc: Procedure[Future[A]]): this.type = onComplete(proc(_)) + + final def map[A >: T, B](f: JFunc[A, B]): Future[B] = map(f(_)) + + final def flatMap[A >: T, B](f: JFunc[A, Future[B]]): Future[B] = flatMap(f(_)) + + final def foreach[A >: T](proc: Procedure[A]): Unit = foreach(proc(_)) + + final def filter(p: JFunc[Any, Boolean]): Future[Any] = filter(p(_)) + } object Promise { diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index 76cac73fe2..f5c4ccdcaa 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -3,28 +3,28 @@ package akka.japi /** * A Function interface. Used to create first-class-functions is Java (sort of). */ -abstract class Function[-T, +R] extends scala.Function1[T, R] { +trait Function[T, R] { def apply(param: T): R } /** * A Function interface. Used to create 2-arg first-class-functions is Java (sort of). */ -abstract class Function2[-T1, -T2, +R] extends scala.Function2[T1, T2, R] { +trait Function2[T1, T2, R] { def apply(arg1: T1, arg2: T2): R } /** * A Procedure is like a Function, but it doesn't produce a return value */ -abstract class Procedure[-T] extends scala.Function1[T, Unit] { +trait Procedure[T] { def apply(param: T): Unit } /** * A Procedure is like a Function, but it doesn't produce a return value */ -abstract class Procedure2[-T1, -T2] extends scala.Function2[T1, T2, Unit] { +trait Procedure2[T1, T2] { def apply(param: T1, param2: T2): Unit }