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 trait IndexIterator: Iterator<Item = usize> {}
impl<T> IndexIterator for T where T: Iterator<Item = usize> {}
pub trait AtomIterator<'a>: Iterator<Item = &'a Atom> {}
impl<'a, T> AtomIterator<'a> for T where T: Iterator<Item = &'a Atom> {}
pub trait AtomMutIterator<'a>: Iterator<Item = &'a mut Atom> {}
impl<'a, T> AtomMutIterator<'a> for T where T: Iterator<Item = &'a mut Atom> {}
pub trait PosIterator<'a>: Iterator<Item = &'a Pos> {}
impl<'a, T> PosIterator<'a> for T where T: Iterator<Item = &'a Pos> {}
pub trait PosMutIterator<'a>: Iterator<Item = &'a mut Pos> {}
impl<'a, T> PosMutIterator<'a> for T where T: Iterator<Item = &'a mut Pos> {}
pub trait IdPosIterator<'a>: Iterator<Item = (usize, &'a Pos)> {}
impl<'a, T> IdPosIterator<'a> for T where T: Iterator<Item = (usize, &'a Pos)> {}
pub trait IdPosMutIterator<'a>: Iterator<Item = (usize, &'a mut Pos)> {}
impl<'a, T> IdPosMutIterator<'a> for T where T: Iterator<Item = (usize, &'a mut Pos)> {}