use specs::prelude::*;
pub trait AtomCreationModifier {
fn mutate(updater: &LazyUpdate, new_atom: Entity);
}
pub trait AtomCreator : AtomCreationModifier + Copy + Send + Sync + Default {}
impl<T> AtomCreator for T where T : AtomCreationModifier + Copy + Send + Sync + Default {}
pub trait Species : AtomCreator {}
impl<T> Species for T where T : AtomCreator {}
#[macro_export]
macro_rules! species {
($species_name:ident, $transition: ident, $mass: literal) => {
#[derive(Copy, Clone, Default)]
pub struct $species_name;
impl $crate::atom_sources::species::AtomCreationModifier for $species_name {
fn mutate(updater: &specs::LazyUpdate, new_atom: specs::Entity) {
updater.insert(new_atom, $transition::default());
}
}
};
}