in common/src/main/scala/utils/LruCache.scala [36:64]
def apply(key: Any)(generateValue: => Future[V])(implicit ec: ExecutionContext): Future[V] = {
def insert = {
val newEntry = new Entry(Promise[V](), timeToLive.fromNow)
val valueFuture =
store.put(key, newEntry) match {
case null =>
generateValue
case entry => if (entry.isAlive) {
entry.future
} else {
generateValue
}
}
valueFuture.onComplete { value =>
newEntry.promise.tryComplete(value)
//Remove any cached entries that were exceptions
if(value.isFailure) store.remove(key, newEntry)
}
newEntry.promise.future
}
store.get(key) match {
case null =>
insert
case entry if entry.isAlive =>
entry.future
case entry => insert
}
}