1- use std:: future:: Future ;
2- use std:: pin :: Pin ;
1+ use std:: future;
2+ use std:: rc :: Rc ;
33use std:: sync:: mpsc:: { self , Receiver , RecvError , SendError , Sender , TryRecvError } ;
44use std:: sync:: { Arc , Mutex } ;
5- use std:: task:: { Context , Poll , Waker } ;
5+ use std:: task:: { Poll , Waker } ;
66
77use crate :: event_loop:: EventLoopClosed ;
88
@@ -39,7 +39,10 @@ pub fn channel<T: 'static>() -> (AsyncSender<T>, AsyncReceiver<T>) {
3939 sender,
4040 waker : Arc :: clone ( & waker) ,
4141 } ;
42- let receiver = AsyncReceiver { receiver, waker } ;
42+ let receiver = AsyncReceiver {
43+ receiver : Rc :: new ( receiver) ,
44+ waker,
45+ } ;
4346
4447 ( sender, receiver)
4548}
@@ -71,15 +74,13 @@ impl<T: 'static> Clone for AsyncSender<T> {
7174}
7275
7376pub struct AsyncReceiver < T : ' static > {
74- receiver : Receiver < T > ,
77+ receiver : Rc < Receiver < T > > ,
7578 waker : Arc < Mutex < Option < Waker > > > ,
7679}
7780
78- impl < T : ' static > Future for AsyncReceiver < T > {
79- type Output = Result < T , RecvError > ;
80-
81- fn poll ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Self :: Output > {
82- match self . receiver . try_recv ( ) {
81+ impl < T : ' static > AsyncReceiver < T > {
82+ pub async fn next ( & mut self ) -> Result < T , RecvError > {
83+ future:: poll_fn ( |cx| match self . receiver . try_recv ( ) {
8384 Ok ( event) => Poll :: Ready ( Ok ( event) ) ,
8485 Err ( TryRecvError :: Empty ) => {
8586 * self . waker . lock ( ) . unwrap ( ) = Some ( cx. waker ( ) . clone ( ) ) ;
@@ -91,6 +92,7 @@ impl<T: 'static> Future for AsyncReceiver<T> {
9192 }
9293 }
9394 Err ( TryRecvError :: Disconnected ) => Poll :: Ready ( Err ( RecvError ) ) ,
94- }
95+ } )
96+ . await
9597 }
9698}
0 commit comments