specs_time 0.6.1

time resource for specs
Documentation
use std::marker::PhantomData;

use num_traits::{Float, FromPrimitive};
use specs_bundler::{Bundle, Bundler};

use super::{Time, TimeSystem};

pub struct TimeBundle<'deps, T> {
    pub deps: Vec<&'deps str>,
    _marker: PhantomData<T>,
}

impl<'deps, T> Default for TimeBundle<'deps, T> {
    #[inline]
    fn default() -> Self {
        TimeBundle::new(&[])
    }
}

impl<'deps, T> TimeBundle<'deps, T> {
    #[inline]
    pub fn new(deps: &[&'deps str]) -> Self {
        TimeBundle {
            deps: deps.to_vec(),
            _marker: PhantomData,
        }
    }
}

impl<'deps, 'world, 'a, 'b, T> Bundle<'world, 'a, 'b> for TimeBundle<'deps, T>
where
    T: 'static + Sync + Send + Float + FromPrimitive,
{
    type Error = ();

    #[inline]
    fn bundle(
        self,
        mut bundler: Bundler<'world, 'a, 'b>,
    ) -> Result<Bundler<'world, 'a, 'b>, Self::Error> {
        bundler.world.insert(Time::<T>::default());

        bundler.dispatcher_builder.add(
            TimeSystem::<T>::new(),
            TimeSystem::<T>::name(),
            self.deps.as_slice(),
        );

        Ok(bundler)
    }
}