use std::sync::Arc; use dashmap::DashSet; #[derive(Clone, Default)] struct LeaseStorage(Arc>); // A lease that automatically releases the item when dropped pub struct Lease { item: T, storage: LeaseStorage, } impl Drop for Lease { fn drop(&mut self) { self.storage.0.remove(&self.item); } } #[derive(Clone, Default)] pub struct LeaseHandler { storage: LeaseStorage, } impl LeaseHandler { pub fn new() -> Self { Self { storage: LeaseStorage(Arc::new(DashSet::new())), } } pub fn acquire(&self, item: T) -> Result, ()> { if self.storage.0.insert(item.clone()) { Ok(Lease { item, storage: self.storage.clone(), }) } else { Err(()) } } }