use std::collections::VecDeque;
use std::ops::Deref;
use crate::object::ObjectRef;
#[derive(Clone)]
pub struct Event<E>
{
sender: Option<ObjectRef>,
target: Option<ObjectRef>,
data: E,
}
impl<E> Event<E> {
pub fn sender(&self) -> Option<ObjectRef> {
self.sender
}
pub fn target(&self) -> Option<ObjectRef> {
self.target
}
pub fn into_inner(self) -> E {
self.data
}
}
impl<E> Deref for Event<E> {
type Target = E;
fn deref(&self) -> &Self::Target {
&self.data
}
}
pub struct Builder<E>(Event<E>);
impl<E> Builder<E> {
pub fn new(data: E) -> Self {
Self(Event { data, sender: None, target: None })
}
pub fn sender(mut self, sender: ObjectRef) -> Self {
self.0.sender = Some(sender);
self
}
pub fn target(mut self, target: ObjectRef) -> Self {
self.0.target = Some(target);
self
}
pub fn into_inner(self) -> Event<E> {
self.0
}
}
pub struct EventManager<E> {
events: VecDeque<Event<E>>
}
impl<E> EventManager<E> {
pub fn new() -> EventManager<E> {
EventManager {
events: VecDeque::new()
}
}
pub fn send(&mut self, event: Builder<E>) {
self.events.push_back(event.into_inner());
}
pub fn poll(&mut self) -> Option<Event<E>> {
return self.events.pop_front();
}
}