use std::sync::{ atomic::{AtomicBool, Ordering}, Arc, }; #[derive(Debug, Clone, Default)] pub struct CancellationToken { cancelled: Arc, } impl CancellationToken { pub fn new() -> Self { Self::default() } pub fn cancel(&self) { self.cancelled.store(true, Ordering::SeqCst); } #[must_use] pub fn is_cancelled(&self) -> bool { self.cancelled.load(Ordering::SeqCst) } } #[cfg(test)] mod tests { use super::*; #[test] fn token_starts_uncancelled() { assert!(!CancellationToken::new().is_cancelled()); } #[test] fn cancel_is_idempotent_and_visible_through_clones() { let token = CancellationToken::new(); let clone = token.clone(); token.cancel(); token.cancel(); assert!(token.is_cancelled()); assert!(clone.is_cancelled()); } }