use cachekit::builder::{CacheBuilder, CachePolicy};
fn main() {
println!("=== CacheBuilder Examples ===\n");
println!("1. LRU Cache");
let mut lru = CacheBuilder::new(3).build::<u64, String>(CachePolicy::Lru);
lru.insert(1, "one".to_string());
lru.insert(2, "two".to_string());
lru.insert(3, "three".to_string());
lru.get(&1);
lru.insert(4, "four".to_string());
println!(" contains 1? {} (was accessed)", lru.contains(&1));
println!(" contains 2? {} (evicted as LRU)", lru.contains(&2));
println!(" contains 4? {} (just inserted)", lru.contains(&4));
println!();
println!("2. FIFO Cache");
let mut fifo = CacheBuilder::new(3).build::<u64, String>(CachePolicy::Fifo);
fifo.insert(1, "one".to_string());
fifo.insert(2, "two".to_string());
fifo.insert(3, "three".to_string());
fifo.get(&1);
fifo.insert(4, "four".to_string());
println!(" contains 1? {} (evicted as oldest)", fifo.contains(&1));
println!(" contains 2? {} (still present)", fifo.contains(&2));
println!();
println!("3. LRU-K Cache (K=2)");
let mut lru_k = CacheBuilder::new(3).build::<u64, String>(CachePolicy::LruK { k: 2 });
lru_k.insert(1, "one".to_string());
lru_k.insert(2, "two".to_string());
lru_k.insert(3, "three".to_string());
lru_k.get(&1);
lru_k.insert(4, "four".to_string());
println!(
" contains 1? {} (accessed twice, promoted)",
lru_k.contains(&1)
);
println!(" len: {}", lru_k.len());
println!();
println!("4. LFU Cache");
let mut lfu = CacheBuilder::new(3).build::<u64, String>(CachePolicy::Lfu { bucket_hint: None });
lfu.insert(1, "one".to_string());
lfu.insert(2, "two".to_string());
lfu.insert(3, "three".to_string());
lfu.get(&1);
lfu.get(&1);
lfu.get(&1);
lfu.insert(4, "four".to_string());
println!(" contains 1? {} (highest frequency)", lfu.contains(&1));
println!(" len: {}", lfu.len());
println!();
println!("5. 2Q Cache (25% probation)");
let mut two_q = CacheBuilder::new(4).build::<u64, String>(CachePolicy::TwoQ {
probation_frac: 0.25,
});
two_q.insert(1, "one".to_string());
two_q.insert(2, "two".to_string());
two_q.insert(3, "three".to_string());
two_q.insert(4, "four".to_string());
two_q.get(&1);
println!(" capacity: {}", two_q.capacity());
println!(" len: {}", two_q.len());
println!();
println!("6. Common Operations");
let mut cache = CacheBuilder::new(10).build::<u64, String>(CachePolicy::Lru);
cache.insert(1, "original".to_string());
let old = cache.insert(1, "updated".to_string());
println!(" insert returned previous: {:?}", old);
if let Some(value) = cache.get(&1) {
println!(" get(&1): {}", value);
}
println!(" contains(&1): {}", cache.contains(&1));
println!(" contains(&99): {}", cache.contains(&99));
println!(
" len: {}, capacity: {}, is_empty: {}",
cache.len(),
cache.capacity(),
cache.is_empty()
);
cache.clear();
println!(" after clear - is_empty: {}", cache.is_empty());
}