use std::any::TypeId;
use std::iter::Iterator;
use std::marker::PhantomData;
use std::sync::Arc;
use crate::*;
pub trait Message: util::AsAny + Send + Sync + 'static {
fn type_id(&self) -> MessageTypeId {
MessageTypeId(self.as_any_ref().type_id())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct MessageTypeId(pub TypeId);
impl MessageTypeId {
pub fn of<M: Message>() -> Self {
Self(TypeId::of::<M>())
}
}
pub trait ErasedMessageHandler {
fn call(&mut self, msg: Arc<dyn Message>) -> Result<(), MessageHandlerError>;
}
pub struct MessageHandler<M: ?Sized, F> {
f: F,
_marker: PhantomData<fn(Arc<M>)>,
}
impl<M: Message, F: FnMut(Arc<M>)> ErasedMessageHandler for MessageHandler<M, F> {
fn call(&mut self, msg: Arc<dyn Message>) -> Result<(), MessageHandlerError> {
(self.f)(
msg.as_any_arc()
.downcast()
.map_err(|_| MessageHandlerError::WrongMessageType)?,
);
Ok(())
}
}
impl<F: FnMut(Arc<dyn Message>)> ErasedMessageHandler for MessageHandler<dyn Message, F> {
fn call(&mut self, msg: Arc<dyn Message>) -> Result<(), MessageHandlerError> {
(self.f)(msg);
Ok(())
}
}
impl<H: ErasedMessageHandler + ?Sized> ErasedMessageHandler for &mut H {
fn call(&mut self, msg: Arc<dyn Message>) -> Result<(), MessageHandlerError> {
(**self).call(msg)
}
}
impl<H: ErasedMessageHandler + ?Sized> ErasedMessageHandler for Box<H> {
fn call(&mut self, msg: Arc<dyn Message>) -> Result<(), MessageHandlerError> {
(**self).call(msg)
}
}
pub trait IntoMessageHandler<M: Message + ?Sized>: Sized {
type Handler: ErasedMessageHandler;
fn into_message_handler(self) -> Self::Handler;
}
impl<M: Message, F: FnMut(Arc<M>)> IntoMessageHandler<M> for F {
type Handler = MessageHandler<M, F>;
fn into_message_handler(self) -> Self::Handler {
MessageHandler {
f: self,
_marker: PhantomData,
}
}
}
impl<F: FnMut(Arc<dyn Message>)> IntoMessageHandler<dyn Message> for F {
type Handler = MessageHandler<dyn Message, F>;
fn into_message_handler(self) -> Self::Handler {
MessageHandler {
f: self,
_marker: PhantomData,
}
}
}
impl<M: Message, F: FnMut(Arc<M>)> IntoMessageHandler<M> for MessageHandler<M, F> {
type Handler = Self;
fn into_message_handler(self) -> Self::Handler {
self
}
}
impl<F: FnMut(Arc<dyn Message>)> IntoMessageHandler<dyn Message>
for MessageHandler<dyn Message, F>
{
type Handler = Self;
fn into_message_handler(self) -> Self::Handler {
self
}
}
impl<M: Message + ?Sized> IntoMessageHandler<M> for &mut dyn ErasedMessageHandler {
type Handler = Self;
fn into_message_handler(self) -> Self::Handler {
self
}
}
impl<M: Message + ?Sized> IntoMessageHandler<M> for Box<dyn ErasedMessageHandler> {
type Handler = Self;
fn into_message_handler(self) -> Self::Handler {
self
}
}
pub enum MessageHandlerError {
WrongMessageType,
}
pub trait MessageIterator: Iterator<Item = Arc<dyn Message>> {
fn handle<'f, M, H>(self, f: impl IntoMessageHandler<M, Handler = H>) -> HandleMessage<'f, Self>
where
Self: Sized,
M: Message + ?Sized,
H: ErasedMessageHandler + 'f,
{
HandleMessage {
iter: self,
f: Box::new(f.into_message_handler()),
}
}
fn run(self)
where
Self: Sized,
{
self.for_each(|_| {});
}
}
pub struct MessageIter<'s> {
pub(crate) sub: &'s dyn ErasedSubscription,
}
impl Iterator for MessageIter<'_> {
type Item = Arc<dyn Message>;
fn next(&mut self) -> Option<Self::Item> {
self.sub.recv_message()
}
}
impl MessageIterator for MessageIter<'_> {}
pub struct HandleMessage<'f, I> {
iter: I,
f: Box<dyn ErasedMessageHandler + 'f>,
}
impl<I: Iterator<Item = Arc<dyn Message>>> Iterator for HandleMessage<'_, I> {
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
let msg = self.iter.next();
if let Some(msg) = msg.clone() {
let _ = self.f.call(msg);
}
msg
}
}
impl<I: Iterator<Item = Arc<dyn Message>>> MessageIterator for HandleMessage<'_, I> {}
impl<I: MessageIterator + ?Sized> MessageIterator for Box<I> {}
impl<I: MessageIterator + ?Sized> MessageIterator for &mut I {}