use crate::QueueError;
pub trait QueueProducer<T> {
fn try_push(&self, value: T) -> Result<(), (T, QueueError)>;
fn push(&self, value: T) -> Result<(), QueueError>;
fn push_with_seq(&self, value: T) -> Result<usize, QueueError>;
}
pub trait QueueConsumer<T> {
fn try_pop(&self) -> Result<T, QueueError>;
fn pop(&self) -> Result<T, QueueError>;
fn pop_with_seq(&self) -> Result<(T, usize), QueueError>;
fn peek(&self) -> Result<T, QueueError>;
fn peek_with_seq(&self) -> Result<(T, usize), QueueError>;
fn pop_if<F>(&self, predicate: F) -> Result<T, QueueError>
where
F: FnMut(&T, usize) -> bool;
fn consume<F>(&self, consumer: F) -> usize
where
F: FnMut(T, usize) -> bool;
fn is_empty(&self) -> bool;
fn size(&self) -> usize;
}
pub trait QueueFactory<T> {
type Producer: QueueProducer<T>;
type Consumer: QueueConsumer<T>;
fn channel(&self) -> (Self::Producer, Self::Consumer) {
(self.producer(), self.consumer())
}
fn producer(&self) -> Self::Producer;
fn consumer(&self) -> Self::Consumer;
}