use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Duration;
use uniflight::Merger;
#[tokio::main]
async fn main() {
let merger = Arc::new(Merger::<String, String>::new());
let execution_count = Arc::new(AtomicUsize::new(0));
let handles: Vec<_> = (0..5)
.map(|_| {
let merger = Arc::clone(&merger);
let counter = Arc::clone(&execution_count);
tokio::spawn(async move {
merger
.execute("user:123", || async {
counter.fetch_add(1, Ordering::SeqCst);
tokio::time::sleep(Duration::from_millis(100)).await;
"UserData { name: Alice }".to_string()
})
.await
})
})
.collect();
for handle in handles {
let result = handle.await.expect("task panicked");
assert_eq!(result, Ok("UserData { name: Alice }".to_string()));
}
assert_eq!(execution_count.load(Ordering::SeqCst), 1);
}