use crate::{observer::Observer, subscription::DynamicSubscriptions};
pub struct Subscribers<Ob> {
pub(crate) inner: DynamicSubscriptions<Ob>,
}
impl<Ob> Default for Subscribers<Ob> {
fn default() -> Self { Self { inner: DynamicSubscriptions::default() } }
}
impl<Ob> Subscribers<Ob> {
#[inline]
pub fn add(&mut self, observer: Ob) -> usize { self.inner.add(observer) }
#[inline]
pub fn insert(&mut self, id: usize, observer: Ob) { self.inner.insert(id, observer); }
#[inline]
pub fn remove(&mut self, id: usize) -> Option<Ob> { self.inner.remove(id) }
#[inline]
pub fn contains(&self, id: usize) -> bool { self.inner.contains(id) }
}
impl<Ob> Subscribers<Ob> {
pub(crate) fn broadcast_value<Item, Err>(&mut self, value: Item)
where
Ob: Observer<Item, Err>,
Item: Clone,
{
let mut iter = self.inner.iter_mut().peekable();
while let Some(observer) = iter.next() {
if iter.peek().is_some() {
observer.next(value.clone());
} else {
observer.next(value);
break;
}
}
}
pub(crate) fn broadcast_mut_ref<T, Err>(&mut self, value: &mut T)
where
Ob: for<'a> Observer<&'a mut T, Err>,
{
for observer in self.inner.iter_mut() {
observer.next(value);
}
}
pub(crate) fn broadcast_error<Item, Err>(&mut self, err: Err)
where
Ob: Observer<Item, Err>,
Err: Clone,
{
let mut iter = self.inner.drain().peekable();
while let Some(observer) = iter.next() {
if iter.peek().is_some() {
observer.error(err.clone());
} else {
observer.error(err);
break;
}
}
}
pub(crate) fn broadcast_complete<Item, Err>(&mut self)
where
Ob: Observer<Item, Err>,
{
for observer in self.inner.drain() {
observer.complete();
}
}
}