aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2013-04-26 18:11:59 +0200
committerPhilipp Haller <hallerp@gmail.com>2013-04-26 18:11:59 +0200
commit782d4c8bed1bf2da2e28becbec3d168d1c11d1fa (patch)
treece6b53d1e68c51639216dc50713a94f9dcac5930
parent9d134adc8e448906ee6ab6cb4db59320557a880c (diff)
downloadscala-async-782d4c8bed1bf2da2e28becbec3d168d1c11d1fa.tar.gz
scala-async-782d4c8bed1bf2da2e28becbec3d168d1c11d1fa.tar.bz2
scala-async-782d4c8bed1bf2da2e28becbec3d168d1c11d1fa.zip
Refactor TryBasedFutureSystem
-rw-r--r--src/main/scala/scala/async/FutureSystem.scala51
1 files changed, 19 insertions, 32 deletions
diff --git a/src/main/scala/scala/async/FutureSystem.scala b/src/main/scala/scala/async/FutureSystem.scala
index 7e14c44..8230a0e 100644
--- a/src/main/scala/scala/async/FutureSystem.scala
+++ b/src/main/scala/scala/async/FutureSystem.scala
@@ -78,6 +78,21 @@ trait TryBasedFutureSystem extends FutureSystem {
trait OpsWithTry extends Ops {
import c.universe._
+ protected def completePromWithTry[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit]
+
+ def completeProm[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] =
+ completePromWithTry(prom, reify(scala.util.Success(value.splice)))
+
+ def completePromWithExceptionTopLevel[A: WeakTypeTag](prom: Expr[Prom[A]], exception: Expr[Throwable]): Expr[Unit] =
+ completePromWithTry(prom, reify(scala.util.Failure(exception.splice)))
+
+ def completePromWithFailedResult[A: WeakTypeTag](prom: Expr[Prom[A]], resultName: TermName): Expr[Unit] = {
+ val result = c.Expr[scala.util.Try[A]](
+ TypeApply(Select(Ident(resultName), newTermName("asInstanceOf")),
+ List(TypeTree(weakTypeOf[scala.util.Try[A]]))))
+ completePromWithTry(prom, result)
+ }
+
/** `methodSym( (_: Foo).bar(null: A, null: B)` will return the symbol of `bar`, after overload resolution. */
private def methodSym(apply: c.Expr[Any]): Symbol = {
val tree2: Tree = c.typeCheck(apply.tree)
@@ -136,26 +151,11 @@ object ScalaConcurrentFutureSystem extends TryBasedFutureSystem {
future.splice.onComplete(fun.splice)(execContext.splice)
}
- def completeProm[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] = reify {
- prom.splice.success(value.splice)
- c.literalUnit.splice
- }
-
- def completePromWithExceptionTopLevel[A: WeakTypeTag](prom: Expr[Prom[A]], exception: Expr[Throwable]): Expr[Unit] = reify {
- prom.splice.failure(exception.splice)
+ protected def completePromWithTry[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] = reify {
+ prom.splice.complete(value.splice)
c.literalUnit.splice
}
- def completePromWithFailedResult[A: WeakTypeTag](prom: Expr[Prom[A]], resultName: TermName): Expr[Unit] = {
- val result = c.Expr[scala.util.Try[A]](
- TypeApply(Select(Ident(resultName), newTermName("asInstanceOf")),
- List(TypeTree(weakTypeOf[scala.util.Try[A]]))))
- reify {
- prom.splice.complete(result.splice)
- c.literalUnit.splice
- }
- }
-
def castTo[A: WeakTypeTag](future: Expr[Fut[Any]]): Expr[Fut[A]] = reify {
future.splice.asInstanceOf[Fut[A]]
}
@@ -199,24 +199,11 @@ object IdentityFutureSystem extends TryBasedFutureSystem {
c.literalUnit.splice
}
- def completeProm[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[A]): Expr[Unit] = reify {
- prom.splice.a = value.splice
+ protected def completePromWithTry[A: WeakTypeTag](prom: Expr[Prom[A]], value: Expr[scala.util.Try[A]]): Expr[Unit] = reify {
+ prom.splice.a = value.splice.get
c.literalUnit.splice
}
- def completePromWithExceptionTopLevel[A: WeakTypeTag](prom: Expr[Prom[A]], exception: Expr[Throwable]): Expr[Unit] = reify {
- throw exception.splice
- }
-
- def completePromWithFailedResult[A: WeakTypeTag](prom: Expr[Prom[A]], resultName: TermName): Expr[Unit] = {
- val result = c.Expr[scala.util.Try[A]](
- TypeApply(Select(Ident(resultName), newTermName("asInstanceOf")),
- List(TypeTree(weakTypeOf[scala.util.Try[A]]))))
- reify {
- throw result.splice.asInstanceOf[scala.util.Failure[A]].exception
- }
- }
-
def castTo[A: WeakTypeTag](future: Expr[Fut[Any]]): Expr[Fut[A]] = ???
}
}