use tokio::sync::broadcast::{channel, error::RecvError, Sender};
#[derive(Debug, Clone, Copy)]
enum Empty {}
#[derive(Debug, Clone)]
pub struct Barrier {
inner: Sender<Empty>,
bypass: bool,
}
impl Barrier {
pub async fn wait(self) {
if self.bypass {
return;
}
let mut receiver = self.inner.subscribe();
drop(self.inner);
match receiver.recv().await {
Ok(_) => unreachable!(),
Err(RecvError::Lagged(_)) => unreachable!(),
Err(RecvError::Closed) => (),
}
}
pub fn new(bypass: bool) -> Self {
Self {
inner: channel(1).0,
bypass,
}
}
}