use crate::ConnectionId;
use std::collections::VecDeque;
#[derive(Debug)]
pub struct Waiters<T> {
current: VecDeque<(ConnectionId, T)>,
}
impl<T> Waiters<T> {
pub fn with_capacity(max_connections: usize) -> Waiters<T> {
Waiters {
current: VecDeque::with_capacity(max_connections),
}
}
pub fn waiters(&self) -> &VecDeque<(ConnectionId, T)> {
&self.current
}
pub fn register(&mut self, id: ConnectionId, request: T) {
let request = (id, request);
self.current.push_back(request);
}
pub fn take(&mut self) -> Option<VecDeque<(ConnectionId, T)>> {
if self.current.is_empty() {
return None;
}
let next = VecDeque::new();
Some(std::mem::replace(&mut self.current, next))
}
pub fn remove(&mut self, id: ConnectionId) -> Vec<T> {
let mut requests = Vec::new();
while let Some(index) = self.current.iter().position(|x| x.0 == id) {
let request = self.current.swap_remove_back(index).map(|v| v.1).unwrap();
requests.push(request)
}
requests
}
pub fn get_mut(&mut self) -> &mut VecDeque<(ConnectionId, T)> {
&mut self.current
}
}