use std::cell::RefCell;
use std::collections::VecDeque;
use std::rc::{Rc, Weak};
pub struct Sink<T> {
queue: Weak<RefCell<VecDeque<T>>>,
}
impl<T> Sink<T> {
pub fn push<U: Into<T>>(&self, msg: U) {
if let Some(queue) = self.queue.upgrade() {
queue.borrow_mut().push_back(msg.into())
}
}
}
impl<T> Clone for Sink<T> {
fn clone(&self) -> Sink<T> {
Sink {
queue: self.queue.clone(),
}
}
}
pub struct MsgIter<T> {
queue: Rc<RefCell<VecDeque<T>>>,
}
impl<T> Iterator for MsgIter<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
self.queue.borrow_mut().pop_front()
}
}
pub fn message_iterator<T>() -> (Sink<T>, MsgIter<T>) {
let queue = Rc::new(RefCell::new(VecDeque::new()));
(
Sink {
queue: Rc::downgrade(&queue),
},
MsgIter { queue },
)
}