use std::collections::BTreeMap;
use std::sync::{Arc, Mutex};
use crate::QueryError;
use crate::ast::{Query, parse_query};
use crate::edn::Edn;
#[derive(Clone, Debug, Default)]
pub struct QueryCache {
entries: Arc<Mutex<BTreeMap<Edn, Arc<Query>>>>,
}
impl QueryCache {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn parse(&self, form: &Edn) -> Result<Arc<Query>, QueryError> {
let mut entries = self
.entries
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
if let Some(hit) = entries.get(form) {
return Ok(Arc::clone(hit));
}
let parsed = Arc::new(parse_query(form)?);
entries.insert(form.clone(), Arc::clone(&parsed));
Ok(parsed)
}
#[must_use]
pub fn len(&self) -> usize {
self.entries
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}