aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala')
-rw-r--r--src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala b/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala
new file mode 100644
index 0000000..018ad05
--- /dev/null
+++ b/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 Typesafe Inc. <http://www.typesafe.com>
+ */
+
+package scala.async
+package continuations
+
+import scala.util.continuations._
+import scala.concurrent.{Future, Promise, ExecutionContext}
+
+trait ScalaConcurrentCPSFallback {
+ self: AsyncBaseWithCPSFallback =>
+
+ 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](awaitable: futureSystem.Fut[T]): T @cps[Future[Any]] =
+ shift {
+ (k: (T => Future[Any])) =>
+ val fr = Promise[Any]()
+ awaitable onComplete {
+ case tr => fr completeWith k(tr.get)
+ }
+ fr.future
+ }
+
+}