aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2013-04-26 18:36:28 +0200
committerPhilipp Haller <hallerp@gmail.com>2013-04-26 18:36:28 +0200
commit2754ff01ebec6b1603f6ecda5f6fc78d974093a4 (patch)
treef36e0650859f30131e372c8b078b7eabd5c7117e
parent782d4c8bed1bf2da2e28becbec3d168d1c11d1fa (diff)
downloadscala-async-2754ff01ebec6b1603f6ecda5f6fc78d974093a4.tar.gz
scala-async-2754ff01ebec6b1603f6ecda5f6fc78d974093a4.tar.bz2
scala-async-2754ff01ebec6b1603f6ecda5f6fc78d974093a4.zip
Abstract from Try in onComplete of FutureSystem#Ops
Adds `Result[A]` type member to `FutureSystem` and `def resultType[A]` to `FutureSystem#Ops`.
-rw-r--r--src/main/scala/scala/async/Async.scala6
-rw-r--r--src/main/scala/scala/async/FutureSystem.scala9
-rw-r--r--src/main/scala/scala/async/TransformUtils.scala1
3 files changed, 11 insertions, 5 deletions
diff --git a/src/main/scala/scala/async/Async.scala b/src/main/scala/scala/async/Async.scala
index 35d3687..1cfae1b 100644
--- a/src/main/scala/scala/async/Async.scala
+++ b/src/main/scala/scala/async/Async.scala
@@ -108,7 +108,7 @@ abstract class AsyncBase {
val onCompleteHandler = {
Function(
- List(ValDef(Modifiers(Flag.PARAM), name.tr, TypeTree(defn.TryAnyType), EmptyTree)),
+ List(ValDef(Modifiers(Flag.PARAM), name.tr, TypeTree(futureSystemOps.resultType[Any]), EmptyTree)),
asyncBlock.onCompleteHandler)
}
val resumeFunTree = asyncBlock.resumeFunTree[T]
@@ -121,14 +121,14 @@ abstract class AsyncBase {
val result = ValDef(NoMods, name.result, TypeTree(futureSystemOps.promType[T]), futureSystemOps.createProm[T].tree)
val execContext = ValDef(NoMods, name.execContext, TypeTree(), futureSystemOps.execContext.tree)
val applyDefDef: DefDef = {
- val applyVParamss = List(List(ValDef(Modifiers(Flag.PARAM), name.tr, TypeTree(defn.TryAnyType), EmptyTree)))
+ val applyVParamss = List(List(ValDef(Modifiers(Flag.PARAM), name.tr, TypeTree(futureSystemOps.resultType[Any]), EmptyTree)))
val applyBody = asyncBlock.onCompleteHandler
DefDef(NoMods, name.apply, Nil, applyVParamss, TypeTree(definitions.UnitTpe), applyBody)
}
val apply0DefDef: DefDef = {
// We extend () => Unit so we can pass this class as the by-name argument to `Future.apply`.
// See SI-1247 for the the optimization that avoids creatio
- val applyVParamss = List(List(ValDef(Modifiers(Flag.PARAM), name.tr, TypeTree(defn.TryAnyType), EmptyTree)))
+ val applyVParamss = List(List(ValDef(Modifiers(Flag.PARAM), name.tr, TypeTree(futureSystemOps.resultType[Any]), EmptyTree)))
val applyBody = asyncBlock.onCompleteHandler
DefDef(NoMods, name.apply, Nil, Nil, TypeTree(definitions.UnitTpe), Apply(Ident(name.resume), Nil))
}
diff --git a/src/main/scala/scala/async/FutureSystem.scala b/src/main/scala/scala/async/FutureSystem.scala
index 8230a0e..5dc04a7 100644
--- a/src/main/scala/scala/async/FutureSystem.scala
+++ b/src/main/scala/scala/async/FutureSystem.scala
@@ -22,6 +22,8 @@ trait FutureSystem {
type Prom[A]
/** A (potentially in-progress) computation */
type Fut[A]
+ /** Result of an asynchronous computation */
+ type Result[A]
/** An execution context, required to create or register an on completion callback on a Future. */
type ExecContext
@@ -34,6 +36,7 @@ trait FutureSystem {
def execContext: Expr[ExecContext]
def promType[A: WeakTypeTag]: Type
+ def resultType[A: WeakTypeTag]: Type
def execContextType: Type
/** Create an empty promise */
@@ -46,7 +49,7 @@ trait FutureSystem {
def future[A: WeakTypeTag](a: Expr[A])(execContext: Expr[ExecContext]): Expr[Fut[A]]
/** Register an call back to run on completion of the given future */
- def onComplete[A, U](future: Expr[Fut[A]], fun: Expr[scala.util.Try[A] => U],
+ def onComplete[A, U](future: Expr[Fut[A]], fun: Expr[Result[A] => U],
execContext: Expr[ExecContext]): Expr[Unit]
/** Complete a promise with a value */
@@ -75,9 +78,13 @@ trait FutureSystem {
trait TryBasedFutureSystem extends FutureSystem {
+ type Result[A] = scala.util.Try[A]
+
trait OpsWithTry extends Ops {
import c.universe._
+ def resultType[A: WeakTypeTag]: Type = c.weakTypeOf[scala.util.Try[A]]
+
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] =
diff --git a/src/main/scala/scala/async/TransformUtils.scala b/src/main/scala/scala/async/TransformUtils.scala
index d6f2643..39847dc 100644
--- a/src/main/scala/scala/async/TransformUtils.scala
+++ b/src/main/scala/scala/async/TransformUtils.scala
@@ -187,7 +187,6 @@ private[async] final case class TransformUtils[C <: Context](c: C) {
}
val TryClass = c.mirror.staticClass("scala.util.Try")
- val TryAnyType = appliedType(TryClass.toType, List(definitions.AnyTpe))
val NonFatalClass = c.mirror.staticModule("scala.util.control.NonFatal")
private def asyncMember(name: String) = {