use super::Event;
use crate::Container;
use crate::container::{SizableContainer, DrainContainer, PushInto};
pub trait Extract<T, C> {
fn extract(self) -> Vec<(T, C)>;
}
impl<T: Ord, C: SizableContainer> Extract<T, C> for ::std::sync::mpsc::Receiver<Event<T, C>>
where
for<'a> C: Container + DrainContainer<Item<'a>: Ord> + PushInto<C::Item<'a>>,
{
fn extract(self) -> Vec<(T, C)> {
let mut staged = std::collections::BTreeMap::new();
for event in self {
if let Event::Messages(time, data) = event {
staged.entry(time)
.or_insert_with(Vec::new)
.push(data);
}
}
let mut result = Vec::new();
for (time, mut dataz) in staged.into_iter() {
let mut to_sort = Vec::new();
for data in dataz.iter_mut() {
to_sort.extend(data.drain());
}
to_sort.sort();
let mut sorted = C::default();
for datum in to_sort.into_iter() {
sorted.push_into(datum);
}
if !sorted.is_empty() {
result.push((time, sorted));
}
}
result
}
}