Key): Deferred<Value?> fun set(key: Key, value: Value): Deferred<Unit> } Aside: Kotlin Coroutines Deferred indicates a promise to return a value in the future
Cache<Key, Value> { override fun get(key: Key): Deferred<Value?> { val firstCache = this; return async(CommonPool) { firstCache.get(key).await() ?: let { secondCache.get(key).await()?.apply { firstCache.set(key, this).await() } } } } cache. val ueTr ansf or m er ( t r ansf or m , i nver seTr ansf or m ) f i r st Cache. com pose( secondCache) First cache Second cache miss get(key) value get(key) mappedValue value transform
or m ) cache. val ueTr ansf or m er ( t r ansf or m , i nver seTr ansf or m ) Original cache get(key) mappedValue value transform set(key, mappedValue) inverseTransform set(key, value)