use std::sync::mpsc::{self, Receiver, Sender};
use std::sync::{Arc, Mutex};
use crate::poison::recover_lock;
pub(crate) struct Channel<T> {
pub(crate) sender: Sender<T>,
pub(crate) receiver: Arc<Mutex<Receiver<T>>>,
}
impl<T> Clone for Channel<T> {
fn clone(&self) -> Self {
Self {
sender: self.sender.clone(),
receiver: Arc::clone(&self.receiver),
}
}
}
impl<T> Channel<T> {
pub(crate) fn new() -> Self {
let (sender, receiver) = mpsc::channel();
Self {
sender,
receiver: Arc::new(Mutex::new(receiver)),
}
}
pub(crate) fn drain(&self) -> Vec<T> {
let guard = recover_lock(&self.receiver);
std::iter::from_fn(|| guard.try_recv().ok()).collect()
}
}