use std::task::Waker;
#[derive(Debug)]
pub struct WakerBatch {
first: Option<Waker>,
rest: Vec<Waker>,
}
impl WakerBatch {
pub const fn new() -> Self {
Self {
first: None,
rest: vec![],
}
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
first: None,
rest: Vec::with_capacity(capacity.saturating_sub(1)),
}
}
pub fn push(&mut self, waker: Waker) {
if self.first.is_none() {
self.first = Some(waker);
} else {
self.rest.push(waker);
}
}
}
impl Extend<Waker> for WakerBatch {
fn extend<I: IntoIterator<Item = Waker>>(&mut self, iter: I) {
for waker in iter {
self.push(waker);
}
}
}
impl IntoIterator for WakerBatch {
type Item = Waker;
type IntoIter = std::iter::Chain<std::option::IntoIter<Waker>, std::vec::IntoIter<Waker>>;
fn into_iter(self) -> Self::IntoIter {
self.first.into_iter().chain(self.rest)
}
}