use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use cljrs_ir::IrFunction;
pub enum IrCacheEntry {
NotAttempted,
Unsupported,
Cached(Arc<IrFunction>),
}
static IR_CACHE: RwLock<Option<HashMap<u64, IrCacheEntry>>> = RwLock::new(None);
pub fn get_cached(id: u64) -> Option<Arc<IrFunction>> {
let guard = IR_CACHE.read().unwrap();
let cache = guard.as_ref()?;
match cache.get(&id) {
Some(IrCacheEntry::Cached(ir)) => Some(ir.clone()),
_ => None,
}
}
pub fn should_attempt(id: u64) -> bool {
let guard = IR_CACHE.read().unwrap();
match guard.as_ref() {
Some(cache) => !cache.contains_key(&id),
None => true,
}
}
pub fn store_cached(id: u64, ir: Arc<IrFunction>) {
let mut guard = IR_CACHE.write().unwrap();
let cache = guard.get_or_insert_with(HashMap::new);
cache.insert(id, IrCacheEntry::Cached(ir));
}
pub fn store_unsupported(id: u64) {
let mut guard = IR_CACHE.write().unwrap();
let cache = guard.get_or_insert_with(HashMap::new);
cache.insert(id, IrCacheEntry::Unsupported);
}