use super::{AnySource, AnySubscriber, Source};
use core::slice;
use std::{mem, vec::IntoIter};
#[derive(Default, Clone, Debug)]
pub struct SourceSet(Vec<AnySource>);
impl SourceSet {
pub fn new() -> Self {
Self(Default::default())
}
pub fn insert(&mut self, source: AnySource) {
self.0.push(source);
}
pub fn remove(&mut self, source: &AnySource) {
if let Some(pos) = self.0.iter().position(|s| s == source) {
self.0.remove(pos);
}
}
pub fn take(&mut self) -> Vec<AnySource> {
mem::take(&mut self.0)
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn clear_sources(&mut self, subscriber: &AnySubscriber) {
for source in self.take() {
source.remove_subscriber(subscriber);
}
}
}
impl IntoIterator for SourceSet {
type Item = AnySource;
type IntoIter = IntoIter<AnySource>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a> IntoIterator for &'a SourceSet {
type Item = &'a AnySource;
type IntoIter = slice::Iter<'a, AnySource>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}
#[derive(Debug, Default, Clone)]
pub struct SubscriberSet(Vec<AnySubscriber>);
impl SubscriberSet {
pub fn new() -> Self {
Self(Vec::with_capacity(2))
}
pub fn subscribe(&mut self, subscriber: AnySubscriber) {
if !self.0.contains(&subscriber) {
self.0.push(subscriber);
}
}
pub fn unsubscribe(&mut self, subscriber: &AnySubscriber) {
if let Some(pos) = self.0.iter().position(|s| s == subscriber) {
self.0.remove(pos);
}
}
pub fn take(&mut self) -> Vec<AnySubscriber> {
mem::take(&mut self.0)
}
pub fn len(&self) -> usize {
self.0.len()
}
}
impl IntoIterator for SubscriberSet {
type Item = AnySubscriber;
type IntoIter = IntoIter<AnySubscriber>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
impl<'a> IntoIterator for &'a SubscriberSet {
type Item = &'a AnySubscriber;
type IntoIter = slice::Iter<'a, AnySubscriber>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}