workflow_egui/runtime/
channel.rs

1use crate::runtime::runtime;
2use workflow_core::channel::{
3    unbounded, Receiver, RecvError, SendError, Sender as ChannelSender, TryRecvError, TrySendError,
4};
5
6#[derive(Debug, Clone)]
7pub struct Sender<T> {
8    sender: ChannelSender<T>,
9}
10
11impl<T> Sender<T> {
12    pub fn new(sender: ChannelSender<T>) -> Self {
13        Self { sender }
14    }
15
16    pub async fn send(&self, msg: T) -> Result<(), SendError<T>> {
17        self.sender.send(msg).await?;
18        runtime().request_repaint();
19        Ok(())
20    }
21
22    pub fn try_send(&self, msg: T) -> Result<(), TrySendError<T>> {
23        self.sender.try_send(msg)?;
24        runtime().request_repaint();
25
26        Ok(())
27    }
28
29    pub fn receiver_count(&self) -> usize {
30        self.sender.receiver_count()
31    }
32
33    pub fn sender_count(&self) -> usize {
34        self.sender.sender_count()
35    }
36}
37
38#[derive(Debug, Clone)]
39pub struct Channel<T = ()> {
40    pub sender: Sender<T>,
41    pub receiver: Receiver<T>,
42}
43
44impl<T> Channel<T> {
45    pub fn unbounded() -> Self {
46        let (sender, receiver) = unbounded();
47        Self {
48            sender: Sender::new(sender),
49            receiver,
50        }
51    }
52
53    pub fn drain(&self) -> std::result::Result<(), TryRecvError> {
54        while !self.receiver.is_empty() {
55            self.receiver.try_recv()?;
56        }
57        Ok(())
58    }
59
60    pub async fn recv(&self) -> Result<T, RecvError> {
61        self.receiver.recv().await
62    }
63
64    pub fn try_recv(&self) -> Result<T, TryRecvError> {
65        self.receiver.try_recv()
66    }
67
68    pub async fn send(&self, msg: T) -> Result<(), SendError<T>> {
69        self.sender.send(msg).await
70    }
71
72    pub fn try_send(&self, msg: T) -> Result<(), TrySendError<T>> {
73        self.sender.try_send(msg)
74    }
75
76    pub fn len(&self) -> usize {
77        self.receiver.len()
78    }
79
80    pub fn is_empty(&self) -> bool {
81        self.receiver.is_empty()
82    }
83
84    pub fn receiver_count(&self) -> usize {
85        self.sender.receiver_count()
86    }
87
88    pub fn sender_count(&self) -> usize {
89        self.sender.sender_count()
90    }
91
92    pub fn iter(&self) -> ChannelIterator<T> {
93        ChannelIterator::new(self.receiver.clone())
94    }
95}
96
97pub struct ChannelIterator<T> {
98    receiver: Receiver<T>,
99}
100
101impl<T> ChannelIterator<T> {
102    pub fn new(receiver: Receiver<T>) -> Self {
103        ChannelIterator { receiver }
104    }
105}
106
107impl<T> Iterator for ChannelIterator<T> {
108    type Item = T;
109    fn next(&mut self) -> Option<T> {
110        if self.receiver.is_empty() {
111            None
112        } else {
113            self.receiver.try_recv().ok()
114        }
115    }
116}