use std::task::Waker;
pub struct SendWindow {
available: i64,
wakers: Vec<Waker>,
closed: bool,
}
impl SendWindow {
pub fn new(initial: i64) -> Self {
Self {
available: initial,
wakers: Vec::new(),
closed: false,
}
}
pub fn value(&self) -> i64 {
self.available
}
pub fn update(&mut self, increment: i64) {
self.available += increment;
if self.available > 0 {
self.wake();
}
}
pub fn adjust(&mut self, delta: i64) {
self.available += delta;
if self.available > 0 {
self.wake();
}
}
pub fn consume(&mut self, n: i64) {
self.available -= n;
}
pub fn is_closed(&self) -> bool {
self.closed
}
pub fn is_ready(&self) -> bool {
self.available > 0 || self.closed
}
pub fn register_waker(&mut self, waker: &Waker) {
self.wakers.push(waker.clone());
}
pub fn close(&mut self) {
self.closed = true;
self.wake();
}
fn wake(&mut self) {
for w in self.wakers.drain(..) {
w.wake();
}
}
}