use super::Event;
pub trait Extract<T: Ord, D: Ord> {
fn extract(self) -> Vec<(T, Vec<D>)>;
}
impl<T: Ord, D: Ord> Extract<T,D> for ::std::sync::mpsc::Receiver<Event<T, D>> {
fn extract(self) -> Vec<(T, Vec<D>)> {
let mut result = Vec::new();
for event in self {
if let Event::Messages(time, data) = event {
result.push((time, data));
}
}
result.sort_by(|x,y| x.0.cmp(&y.0));
let mut current = 0;
for i in 1 .. result.len() {
if result[current].0 == result[i].0 {
let dataz = ::std::mem::replace(&mut result[i].1, Vec::new());
result[current].1.extend(dataz);
}
else {
current = i;
}
}
for &mut (_, ref mut data) in &mut result {
data.sort();
}
result.retain(|x| !x.1.is_empty());
result
}
}