#![cfg(features = "future")]
use moka::future::Cache;
#[async_std::main]
async fn main() {
const NUM_TASKS: usize = 16;
const NUM_KEYS_PER_TASK: usize = 64;
fn value(n: usize) -> String {
format!("value {}", n)
}
let cache = Cache::new(10_000);
let tasks: Vec<_> = (0..NUM_TASKS)
.map(|i| {
let my_cache = cache.clone();
let start = i * NUM_KEYS_PER_TASK;
let end = (i + 1) * NUM_KEYS_PER_TASK;
async_std::task::spawn(async move {
for key in start..end {
if key % 8 == 0 {
my_cache.blocking_insert(key, value(key));
} else {
my_cache.insert(key, value(key)).await;
}
assert_eq!(my_cache.get(&key), Some(value(key)));
}
for key in (start..end).step_by(4) {
if key % 8 == 0 {
my_cache.blocking_invalidate(&key).await;
} else {
my_cache.invalidate(&key).await;
}
}
})
})
.collect();
futures_util::future::join_all(tasks).await;
for key in 0..(NUM_TASKS * NUM_KEYS_PER_TASK) {
if key % 4 == 0 {
assert_eq!(cache.get(&key), None);
} else {
assert_eq!(cache.get(&key), Some(value(key)));
}
}
}