async_oneshot/
lib.rs

1//! A fast, small, full-featured async-aware oneshot channel
2//!
3//! Unique feature: wait for receiver to be waiting.
4//!
5//! Also supports the full range of things you'd expect.
6#![no_std]
7extern crate alloc;
8use alloc::sync::Arc;
9
10mod inner;
11pub(crate) use inner::Inner;
12
13mod sender;
14pub use sender::Sender;
15
16mod receiver;
17pub use receiver::Receiver;
18
19/// Create a new oneshot channel pair.
20pub fn oneshot<T>() -> (Sender<T>, Receiver<T>) {
21    let inner = Arc::new(Inner::new());
22    let sender = Sender::new(inner.clone());
23    let receiver = Receiver::new(inner);
24    (sender, receiver)
25}
26
27/// An empty struct that signifies the channel is closed.
28#[derive(Clone, Copy, Debug, Eq, PartialEq)]
29pub struct Closed();
30
31/// We couldn't receive a message.
32#[derive(Debug)]
33pub enum TryRecvError<T> {
34    /// The Sender didn't send us a message yet.
35    Empty(Receiver<T>),
36    /// The Sender has dropped.
37    Closed,
38}
39