+

+
+# Cancelable
+
+[](https://crates.io/crates/cancelable)
+[](https://docs.rs/cancelable)
+[](https://crates.io/crates/cancelable)
+[](https://github.com/microsoft/oxidizer/actions/workflows/main.yml)
+[](https://codecov.io/gh/microsoft/oxidizer)
+[](../../LICENSE)
+

+
+
+
+Cooperative cancellation via tokens.
+
+This module provides [`CancellationTokenSource`][__link0] and [`CancellationToken`][__link1],
+modeled after the equivalent C# types. A source controls cancellation and
+hands out lightweight, cloneable tokens for observers to check.
+
+## Linked sources
+
+A linked source cancels when *any* of its parent tokens are canceled,
+enabling composition of multiple cancellation signals:
+
+```rust
+use cancelable::CancellationTokenSource;
+
+let first = CancellationTokenSource::new();
+let second = CancellationTokenSource::new();
+
+let linked = CancellationTokenSource::linked(&[first.token(), second.token()]);
+let token = linked.token();
+
+assert!(!token.is_cancelled());
+second.cancel();
+assert!(token.is_cancelled());
+```
+
+## Subscribers
+
+Register callbacks that fire exactly once when cancellation occurs:
+
+```rust
+use cancelable::CancellationTokenSource;
+
+let source = CancellationTokenSource::new();
+source.subscribe(|| println!("Operation canceled"));
+source.cancel();
+```
+
+## Futures
+
+The [`WithCancellationExt`][__link2] trait adds a
+[`with_cancellation`][__link3] combinator
+to any [`Future`][__link4], pairing it with a [`CancellationToken`][__link5] so that each
+poll checks for cancellation before and after driving the inner future.
+
+```rust
+use cancelable::{CancellationTokenSource, WithCancellationExt};
+
+let source = CancellationTokenSource::new();
+let token = source.token();
+
+let result = async { 42 }.with_cancellation(token).await?;
+assert_eq!(result, 42);
+```
+
+
+