use lru_time_cache::LruCache;
use std::collections::{BTreeMap};
use NameType;
type Map<K,V> = BTreeMap<K,V>;
pub type Bytes = Vec<u8>;
const MAX_REQUEST_COUNT: usize = 1000;
pub type Request = (NameType, u64);
pub struct RefreshAccumulator {
requests: LruCache<Request, Map<NameType, Bytes>>,
}
impl RefreshAccumulator {
pub fn new() -> RefreshAccumulator {
RefreshAccumulator {
requests: LruCache::with_capacity(MAX_REQUEST_COUNT),
}
}
pub fn add_message(&mut self,
threshold: usize,
type_tag: u64,
sender_node: NameType,
sender_group: NameType,
payload: Bytes) -> Option<Vec<Bytes>> {
let request = (sender_group, type_tag);
{
if threshold <= 1 {
return Some(vec![payload]);
}
let map = self.requests.entry(request.clone()).or_insert_with(||Map::new());
map.insert(sender_node, payload);
if map.len() < threshold {
return None;
}
Some(map.iter().map(|(name, msg)| msg.clone()).collect())
}.map(|messages| {
self.requests.remove(&request);
messages
})
}
}