use std::{
pin::Pin,
task::{ready, Context, Poll},
};
use crate::{AnyFuture, BoxFuture, Delay, FuturesMap, PushError, Timeout};
pub struct FuturesSet<O> {
id: u32,
inner: FuturesMap<u32, O>,
}
impl<O> FuturesSet<O> {
pub fn new(make_delay: impl Fn() -> Delay + Send + Sync + 'static, capacity: usize) -> Self {
Self {
id: 0,
inner: FuturesMap::new(make_delay, capacity),
}
}
}
impl<O> FuturesSet<O>
where
O: 'static,
{
pub fn try_push<F>(&mut self, future: F) -> Result<(), BoxFuture<O>>
where
F: AnyFuture<Output = O>,
{
self.id = self.id.wrapping_add(1);
match self.inner.try_push(self.id, future) {
Ok(()) => Ok(()),
Err(PushError::BeyondCapacity(w)) => Err(w),
Err(PushError::Replaced(_)) => unreachable!("we never reuse IDs"),
}
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn poll_ready_unpin(&mut self, cx: &mut Context<'_>) -> Poll<()> {
self.inner.poll_ready_unpin(cx)
}
pub fn poll_unpin(&mut self, cx: &mut Context<'_>) -> Poll<Result<O, Timeout>> {
let (_, res) = ready!(self.inner.poll_unpin(cx));
Poll::Ready(res)
}
pub fn iter_of_type<T>(&self) -> impl Iterator<Item = Pin<&T>>
where
T: 'static,
{
self.inner.iter_of_type().map(|(_, item)| item)
}
pub fn iter_mut_of_type<T>(&mut self) -> impl Iterator<Item = Pin<&mut T>>
where
T: 'static,
{
self.inner.iter_mut_of_type().map(|(_, item)| item)
}
}