use DataHelper;
use EntityData;
use {Process, System};
pub struct LazySystem<T: Process>
{
pub inner: Option<T>,
}
impl<T: Process> LazySystem<T>
{
pub fn new() -> LazySystem<T>
{
LazySystem {
inner: None,
}
}
pub fn init(&mut self, sys: T) -> bool
{
match self.inner {
Some(_) => true,
None => {
self.inner = Some(sys);
false
},
}
}
pub fn init_override(&mut self, sys: T) -> bool
{
let ret = self.is_initialised();
self.inner = Some(sys);
ret
}
#[inline]
pub fn is_initialised(&self) -> bool
{
self.inner.is_some()
}
}
impl<T: Process> Process for LazySystem<T>
{
fn process(&mut self, c: &mut DataHelper<T::Components, T::Services>)
{
if let Some(ref mut sys) = self.inner {
sys.process(c);
}
}
}
impl<T: Process> System for LazySystem<T>
{
type Components = T::Components;
type Services = T::Services;
fn activated(&mut self, e: &EntityData<T::Components>, c: &T::Components, s: &mut T::Services)
{
self.inner.as_mut().map(|sys| sys.activated(e, c, s));
}
fn reactivated(&mut self, e: &EntityData<T::Components>, c: &T::Components, s: &mut T::Services)
{
self.inner.as_mut().map(|sys| sys.reactivated(e, c, s));
}
fn deactivated(&mut self, e: &EntityData<T::Components>, c: &T::Components, s: &mut T::Services)
{
self.inner.as_mut().map(|sys| sys.deactivated(e, c, s));
}
}