diff options
Diffstat (limited to 'src/main/scala/scala/async/AsyncWithCPSFallback.scala')
-rw-r--r-- | src/main/scala/scala/async/AsyncWithCPSFallback.scala | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/main/scala/scala/async/AsyncWithCPSFallback.scala b/src/main/scala/scala/async/AsyncWithCPSFallback.scala new file mode 100644 index 0000000..39e43a3 --- /dev/null +++ b/src/main/scala/scala/async/AsyncWithCPSFallback.scala @@ -0,0 +1,31 @@ +package scala.async + +import scala.language.experimental.macros + +import scala.reflect.macros.Context +import scala.util.continuations._ + +object AsyncWithCPSFallback extends AsyncBase { + + import scala.concurrent.{Future, ExecutionContext} + import ExecutionContext.Implicits.global + + lazy val futureSystem = ScalaConcurrentFutureSystem + type FS = ScalaConcurrentFutureSystem.type + + /* Fall-back for `await` when it is called at an unsupported position. + */ + override def awaitFallback[T, U](awaitable: futureSystem.Fut[T], p: futureSystem.Prom[U]): T @cpsParam[U, Unit] = + shift { + (k: (T => U)) => + awaitable onComplete { + case tr => p.success(k(tr.get)) + } + } + + override def fallbackEnabled = true + + def async[T](body: T) = macro asyncImpl[T] + + override def asyncImpl[T: c.WeakTypeTag](c: Context)(body: c.Expr[T]): c.Expr[Future[T]] = super.asyncImpl[T](c)(body) +} |