use std::task::{Context, Poll, Waker}; pub struct Signal{ waker: Option, active: bool, } impl Signal{ pub fn new() -> Self{ Self{ waker: None, active: false, } } pub fn wake(&mut self){ self.active = true; if let Some(w) = self.waker.take(){ w.wake(); } } pub fn poll(&mut self, ctx: &mut Context<'_>) -> Poll<()>{ if self.active{ self.active = false; Poll::Ready(()) }else{ self.waker = Some(ctx.waker().clone()); Poll::Pending } } }