use std::sync::{
Arc,
atomic::{AtomicBool, Ordering},
};
#[derive(Debug, Clone, Default)]
pub struct CancelToken(Arc<AtomicBool>);
impl CancelToken {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn cancel(&self) {
self.0.store(true, Ordering::Release);
}
#[must_use]
pub fn is_cancelled(&self) -> bool {
self.0.load(Ordering::Acquire)
}
#[must_use]
pub fn as_flag(&self) -> &AtomicBool {
&self.0
}
}
#[cfg(test)]
mod tests {
use super::CancelToken;
#[test]
fn every_clone_sees_a_cancel() {
let token = CancelToken::new();
let clone = token.clone();
assert!(!clone.is_cancelled());
token.cancel();
assert!(clone.is_cancelled());
assert!(clone.as_flag().load(std::sync::atomic::Ordering::Relaxed));
}
}