use super::cache::SummaryIndex;
use super::types::{SummaryNode, SummaryRange};
impl SummaryIndex {
pub async fn summary_for<F, Fut>(
&mut self,
range: SummaryRange,
producer: F,
) -> anyhow::Result<SummaryNode>
where
F: FnOnce(SummaryRange) -> Fut,
Fut: std::future::Future<Output = anyhow::Result<SummaryNode>>,
{
if let Some(node) = self.tree.get(&range).cloned() {
self.touch_lru(range);
return Ok(node);
}
let node = producer(range).await?;
self.insert(range, node.clone());
Ok(node)
}
}