use std::collections::VecDeque;
use key::Key;
pub struct Bucket<TKey: Key, TValue> {
data: VecDeque<(TKey, TValue)>,
max_size: usize,
}
impl<TKey: Key, TValue> Bucket<TKey, TValue> {
pub fn new(max_size: usize) -> Bucket<TKey, TValue> {
Bucket {
data: VecDeque::with_capacity(max_size),
max_size: max_size,
}
}
pub fn update(&mut self, key: TKey, value: TValue) -> Option<(TKey, TValue)> {
let mut index_to_remove = None;
for (i, k) in self.data.iter().map(|&(ref k,_)| k.clone()).enumerate() {
if k == key {
index_to_remove = Some(i);
}
}
let res = {
if let Some(i) = index_to_remove {
self.data.remove(i)
}
else if self.data.len() == self.max_size {
self.data.pop_front()
}
else {
None
}
};
self.data.push_back((key, value));
res
}
pub fn data(&self) -> &VecDeque<(TKey, TValue)> {
&self.data
}
}