aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2013-02-26 01:16:40 +0100
committerPhilipp Haller <hallerp@gmail.com>2013-04-12 18:53:28 +0200
commitffd7b9649cde61553f16c25f64c3072ecfa6c713 (patch)
tree54f458e8e9061c8537a0972ca827a56cc0ce9548 /src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala
parent1a8b72a0d1ee16ddcff637df57c2b22e2976b853 (diff)
downloadscala-async-ffd7b9649cde61553f16c25f64c3072ecfa6c713.tar.gz
scala-async-ffd7b9649cde61553f16c25f64c3072ecfa6c713.tar.bz2
scala-async-ffd7b9649cde61553f16c25f64c3072ecfa6c713.zip
Remove CPS dependency from default async implementation
- move all CPS-related code to `continuations` sub package - fix CPS-based async implementation - enable testing of CPS-based async implementation
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
+ }
+
+}