mod streamer;
pub use streamer::StreamerMut;
mod cartesian_product_mut;
use cartesian_product_mut::CartesianProductMut;
mod pairs_mut;
use pairs_mut::PairsMut;
mod group_mut;
use group_mut::{GroupMut, GroupByMut, GroupByKeyMut};
#[macro_export]
macro_rules! stream {
{ $iter:expr => $item:pat in $b:block } => {{
let mut it = $iter;
while let Some($item) = it.next() {
$b
}
}}
}
pub trait SliceTools {
fn cartesian_product_mut<'a, S, T: 'a, U: 'a>(&'a mut self, slice: &'a mut S) -> CartesianProductMut<'a, T, U>
where Self: AsMut<[T]>, S: AsMut<[U]>
{
CartesianProductMut::new(self.as_mut(), slice.as_mut())
}
fn pairs_mut<'a, T: 'a>(&'a mut self) -> PairsMut<'a, T>
where Self: AsMut<[T]>
{
PairsMut::new(self.as_mut())
}
fn group_mut<'a, T: 'a>(&'a mut self) -> GroupMut<'a, T>
where Self: AsMut<[T]>, T: PartialEq
{
GroupMut::new(self.as_mut())
}
fn group_by_key_mut<'a, T: 'a, K, F>(&'a mut self, condition: F) -> GroupByKeyMut<'a, T, K, F>
where Self: AsMut<[T]>, K: PartialEq, F: Fn(&T) -> K
{
GroupByKeyMut::new(self.as_mut(), condition)
}
fn group_by_mut<'a, T: 'a, F>(&'a mut self, condition: F) -> GroupByMut<'a, T, F>
where Self: AsMut<[T]>, T: PartialEq, F: Fn(&T, &T) -> bool
{
GroupByMut::new(self.as_mut(), condition)
}
}
impl<T> SliceTools for T {}