use futures::{Future, FutureExt};
use crate::{backend::Backend, request::Request};
pub trait MessageQueue<Message: Send>: Backend<Request<Message, Self::Context>> {
type Context: Default;
type Error;
type Compact;
fn enqueue(
&mut self,
message: Message,
) -> impl Future<Output = Result<(), Self::Error>> + Send {
self.enqueue_request(Request::new(message))
}
fn enqueue_request(
&mut self,
req: Request<Message, Self::Context>,
) -> impl Future<Output = Result<(), Self::Error>> + Send;
fn enqueue_raw_request(
&mut self,
req: Request<Self::Compact, Self::Context>,
) -> impl Future<Output = Result<(), Self::Error>> + Send;
fn dequeue(&mut self) -> impl Future<Output = Result<Option<Message>, Self::Error>> + Send {
self.dequeue_request()
.map(|req| req.map(|r| r.map(|r| r.args)))
}
fn dequeue_request(
&mut self,
) -> impl Future<Output = Result<Option<Request<Message, Self::Context>>, Self::Error>> + Send;
fn size(&mut self) -> impl Future<Output = Result<usize, Self::Error>> + Send;
}