elizarov
03/01/2017, 4:11 PMMutex
. It can be fully concurrent:
fun <I, O> memoizeBlocking(f: suspend (I) -> O): suspend (I) -> O {
val cache = ConcurrentHashMap<I, Deferred<O>>()
return { i ->
val deferred = cache.getOrPut(i, {
async(Unconfined) { f(i) }
})
deferred.await()
}
}