Dalinar
02/01/2019, 6:06 AMfun <T> future(context: CoroutineContext = CommonPool, block: suspend () -> T): CompletableFuture<T> =
CompletableFutureCoroutine<T>(context).also { block.startCoroutine(completion = it) }
class CompletableFutureCoroutine<T>(override val context: CoroutineContext) : CompletableFuture<T>(), Continuation<T> {
override fun resumeWith(result: Result<T>) {
result
.onSuccess { complete(it) }
.onFailure { completeExceptionally(it) }
}
}
suspend fun <T> CompletableFuture<T>.await(): T =
suspendCoroutine { cont: Continuation<T> ->
whenComplete { result, exception ->
if (exception == null) // the future has been completed normally
cont.resume(result)
else // the future has completed with an exception
cont.resumeWithException(exception)
}
}
I mean, is it correct apart from the CommonPool
part? should I just replace CommonPool
with EmptyCoroutineContext
?gildor
02/03/2019, 2:44 PMDalinar
02/03/2019, 2:46 PMgildor
02/03/2019, 2:46 PMgildor
02/03/2019, 2:46 PMDalinar
02/03/2019, 2:46 PMgildor
02/03/2019, 2:47 PMDalinar
02/03/2019, 2:47 PMgildor
02/03/2019, 2:48 PM