use crate::app::Dispatcher;
#[non_exhaustive]
pub struct Commands<Command> {
pub immediate: Vec<Command>,
pub post_render: Vec<Command>,
}
impl<Command> Default for Commands<Command> {
fn default() -> Self {
Commands {
immediate: vec![],
post_render: vec![],
}
}
}
impl<Command> Commands<Command> {
pub fn push(&mut self, cmd: Command) {
self.immediate.push(cmd);
}
pub fn is_empty(&self) -> bool {
self.immediate.is_empty()
&& self.post_render.is_empty()
}
}
pub trait SideEffect<Message> {
fn process(self, dispatcher: &Dispatcher<Message, Self>) where Self: Sized;
}
impl<Message> SideEffect<Message> for () {
fn process(self, _: &Dispatcher<Message, Self>) { }
}
pub trait Processor<Message, Command>
where
Command: SideEffect<Message>,
{
fn process(&self, cmd: Command, dispatcher: &Dispatcher<Message, Command>);
}
pub struct DefaultProcessor<Message, Command>
where
Command: SideEffect<Message>,
{
message: std::marker::PhantomData<Message>,
command: std::marker::PhantomData<Command>,
}
impl<Message, Command> Default for DefaultProcessor<Message, Command>
where
Command: SideEffect<Message>,
{
fn default() -> Self {
DefaultProcessor {
message: std::marker::PhantomData,
command: std::marker::PhantomData,
}
}
}
impl<Message, Command> Processor<Message, Command> for DefaultProcessor<Message, Command>
where
Command: SideEffect<Message>,
{
fn process(&self, cmd: Command, dispatcher: &Dispatcher<Message, Command>) {
cmd.process(dispatcher);
}
}