use crate::prelude::*;
pub type SVec = sorted_vec::SortedSet<usize>;
pub type Vector3f = nalgebra::Vector3<f32>;
pub type Matrix3f = nalgebra::Matrix3<f32>;
pub type Pos = nalgebra::Point3<f32>;
pub type Vel = nalgebra::Vector3<f32>;
pub type Force = nalgebra::Vector3<f32>;
pub trait IndexIterator: ExactSizeIterator<Item = usize> {}
impl<T> IndexIterator for T where T: ExactSizeIterator<Item = usize> {}
pub trait AtomIterator<'a>: ExactSizeIterator<Item = &'a Atom> {}
impl<'a, T> AtomIterator<'a> for T where T: ExactSizeIterator<Item = &'a Atom> {}
pub trait AtomMutIterator<'a>: ExactSizeIterator<Item = &'a mut Atom> {}
impl<'a, T> AtomMutIterator<'a> for T where T: ExactSizeIterator<Item = &'a mut Atom> {}
pub trait PosIterator<'a>: ExactSizeIterator<Item = &'a Pos> {}
impl<'a, T> PosIterator<'a> for T where T: ExactSizeIterator<Item = &'a Pos> {}
pub trait PosMutIterator<'a>: ExactSizeIterator<Item = &'a mut Pos> {}
impl<'a, T> PosMutIterator<'a> for T where T: ExactSizeIterator<Item = &'a mut Pos> {}
pub trait IdPosIterator<'a>: ExactSizeIterator<Item = (usize, &'a Pos)> {}
impl<'a, T> IdPosIterator<'a> for T where T: ExactSizeIterator<Item = (usize, &'a Pos)> {}
pub trait IdPosMutIterator<'a>: ExactSizeIterator<Item = (usize, &'a mut Pos)> {}
impl<'a, T> IdPosMutIterator<'a> for T where T: ExactSizeIterator<Item = (usize, &'a mut Pos)> {}
pub trait ParticleIterator<'a>: ExactSizeIterator<Item = Particle<'a>> {}
impl<'a, T> ParticleIterator<'a> for T where T: ExactSizeIterator<Item = Particle<'a>> {}
pub trait ParticleMutIterator<'a>: ExactSizeIterator<Item = ParticleMut<'a>> {}
impl<'a, T> ParticleMutIterator<'a> for T where T: ExactSizeIterator<Item = ParticleMut<'a>> {}
pub trait VelIterator<'a>: ExactSizeIterator<Item = &'a Vel> {}
impl<'a, T> VelIterator<'a> for T where T: ExactSizeIterator<Item = &'a Vel> {}
pub trait VelMutIterator<'a>: ExactSizeIterator<Item = &'a mut Vel> {}
impl<'a, T> VelMutIterator<'a> for T where T: ExactSizeIterator<Item = &'a mut Vel> {}
pub trait ForceIterator<'a>: ExactSizeIterator<Item = &'a Force> {}
impl<'a, T> ForceIterator<'a> for T where T: ExactSizeIterator<Item = &'a Force> {}
pub trait ForceMutIterator<'a>: ExactSizeIterator<Item = &'a mut Force> {}
impl<'a, T> ForceMutIterator<'a> for T where T: ExactSizeIterator<Item = &'a mut Force> {}