#[cfg(test)] mod tests;
use ::StreamerMut;
pub struct GroupMut<'a, T: 'a> {
slice: &'a mut [T],
start: usize,
}
impl<'a, 'it, T> StreamerMut<'it, &'it mut [T]> for GroupMut<'a, T> where T: PartialEq {
fn next(&'it mut self) -> Option<&'it mut [T]> {
let end = {
let first = self.slice.get(self.start)?;
self.start + self.slice[self.start..].iter().take_while(|i| *i == first).count()
};
let result = &mut self.slice[self.start..end];
self.start = end;
Some(result)
}
}
impl<'a, T> GroupMut<'a, T> {
pub fn new(slice: &'a mut [T]) -> GroupMut<'a, T> {
GroupMut{ slice, start: 0 }
}
}
pub struct GroupByMut<'a, T: 'a, F> where F: Fn(&T, &T) -> bool {
slice: &'a mut [T],
start: usize,
condition: F,
}
impl<'a, 'it, T, F> StreamerMut<'it, &'it mut [T]> for GroupByMut<'a, T, F>
where T: PartialEq, F: Fn(&T, &T) -> bool
{
fn next(&'it mut self) -> Option<&'it mut [T]> {
let end = {
let first = self.slice.get(self.start)?;
self.start + self.slice[self.start..].iter().take_while(|i| (self.condition)(i, &first)).count()
};
let result = &mut self.slice[self.start..end];
self.start = end;
Some(result)
}
}
impl<'a, T, F> GroupByMut<'a, T, F> where F: Fn(&T, &T) -> bool {
pub fn new(slice: &'a mut [T], condition: F) -> GroupByMut<'a, T, F> {
GroupByMut{ slice, start: 0, condition }
}
}
pub struct GroupByKeyMut<'a, T: 'a, K, F> where F: Fn(&T) -> K {
slice: &'a mut [T],
start: usize,
condition: F,
}
impl<'a, 'it, T, K, F> StreamerMut<'it, &'it mut [T]> for GroupByKeyMut<'a, T, K, F>
where K: PartialEq, F: Fn(&T) -> K
{
fn next(&'it mut self) -> Option<&'it mut [T]> {
let end = {
let first = (self.condition)(self.slice.get(self.start)?);
self.start + self.slice[self.start..].iter().take_while(|i| (self.condition)(i) == first).count()
};
let result = &mut self.slice[self.start..end];
self.start = end;
Some(result)
}
}
impl<'a, T, K, F> GroupByKeyMut<'a, T, K, F> where F: Fn(&T) -> K {
pub fn new(slice: &'a mut [T], condition: F) -> GroupByKeyMut<'a, T, K, F> {
GroupByKeyMut{ slice, start: 0, condition }
}
}