use std::collections::VecDeque;
pub trait Transport<T> {
fn deliver(&mut self, op: T);
fn poll(&mut self) -> Vec<T>;
fn has_pending(&self) -> bool;
}
pub struct InProcTransport<T> {
buf: VecDeque<T>,
}
impl<T> Default for InProcTransport<T> {
fn default() -> Self {
Self {
buf: VecDeque::new(),
}
}
}
impl<T> InProcTransport<T> {
pub fn new() -> Self {
Self::default()
}
}
impl<T> Transport<T> for InProcTransport<T> {
fn deliver(&mut self, op: T) {
self.buf.push_back(op);
}
fn poll(&mut self) -> Vec<T> {
self.buf.drain(..).collect()
}
fn has_pending(&self) -> bool {
!self.buf.is_empty()
}
}
pub struct FramedTransport<T> {
buf: VecDeque<T>,
frame_size: usize,
}
impl<T> FramedTransport<T> {
pub fn new(frame_size: usize) -> Self {
Self {
buf: VecDeque::new(),
frame_size: frame_size.max(1),
}
}
}
impl<T> Transport<T> for FramedTransport<T> {
fn deliver(&mut self, op: T) {
self.buf.push_back(op);
}
fn poll(&mut self) -> Vec<T> {
let n = self.frame_size.min(self.buf.len());
self.buf.drain(..n).collect()
}
fn has_pending(&self) -> bool {
!self.buf.is_empty()
}
}