use std::sync::Arc;
use tokio::sync::{mpsc, Notify};
use super::target::TargetMessage;
#[derive(Debug, Clone)]
pub struct PageSender {
inner: mpsc::Sender<TargetMessage>,
wake: Option<Arc<Notify>>,
}
impl PageSender {
pub fn new(inner: mpsc::Sender<TargetMessage>, wake: Option<Arc<Notify>>) -> Self {
Self { inner, wake }
}
#[inline]
fn notify(&self) {
if let Some(wake) = &self.wake {
wake.notify_one();
}
}
pub fn try_send(
&self,
msg: TargetMessage,
) -> Result<(), mpsc::error::TrySendError<TargetMessage>> {
let result = self.inner.try_send(msg);
if result.is_ok() {
self.notify();
}
result
}
pub async fn send(
&self,
msg: TargetMessage,
) -> Result<(), mpsc::error::SendError<TargetMessage>> {
let result = self.inner.send(msg).await;
if result.is_ok() {
self.notify();
}
result
}
}