It does not have to use `Mutex`. It can be fully c...
# announcements
e
It does not have to use
Mutex
. It can be fully concurrent:
Copy code
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()
    }
}