workflow_egui/runtime/
channel.rs1use 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}