aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/continuations/ScalaConcurrentCPSFallback.scala
blob: 018ad05da1c3def7b20eb679db27aca1c35b05b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
    }

}