use super::EventCore;
use crate::Container;
use crate::Data;
pub trait Extract<T: Ord, D: Ord> {
fn extract(self) -> Vec<(T, Vec<D>)>;
}
impl<T: Ord, D: Ord+Data> Extract<T,D> for ::std::sync::mpsc::Receiver<EventCore<T, Vec<D>>> {
fn extract(self) -> Vec<(T, Vec<D>)> {
let mut result = self.extract_core();
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
}
}
pub trait ExtractCore<T, C> {
fn extract_core(self) -> Vec<(T, C)>;
}
impl<T, C: Container> ExtractCore<T, C> for ::std::sync::mpsc::Receiver<EventCore<T, C>> {
fn extract_core(self) -> Vec<(T, C)> {
let mut result = Vec::new();
for event in self {
if let EventCore::Messages(time, data) = event {
result.push((time, data));
}
}
result.retain(|x| !x.1.is_empty());
result
}
}