
com.malliina.concurrent.Futures.scala Maven / Gradle / Ivy
package com.malliina.concurrent
import com.malliina.util.Utils
import scala.concurrent._
import scala.concurrent.duration.Duration
trait Futures {
def before[T, TO](other: Future[TO])(f: Future[T])(implicit ec: ExecutionContext): Future[T] =
promisedFuture[T](p => {
f.onComplete(result => if (!p.isCompleted) p.tryComplete(result))
other.onComplete(_ => {
if (!p.isCompleted)
p.tryFailure(
new TimeoutException(s"Unable to complete task within the given time limit.")
)
})
})
/** Constructs a future that is completed according to `keepPromise`. This pattern
* can be used to convert callback-based APIs to Future-based ones. For example,
* parameter `keepPromise` can call some callback-based API, and the callback
* implementation can complete the supplied promise.
*
* @param keepPromise code that completes the promise
* @tparam T type of value to complete promise with
* @return the future completion value
*/
def promisedFuture[T](keepPromise: Promise[T] => Unit): Future[T] = {
val p = Promise[T]()
keepPromise(p)
p.future
}
}
object Futures extends Futures
© 2015 - 2025 Weber Informatics LLC | Privacy Policy