use std::{collections::HashSet, marker::PhantomData};
use crate::{Event, Topic, internal::Subscription};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Subscribe<E: Event, T: Topic<E>>(
pub(crate) Subscription<T>,
PhantomData<fn() -> E>, );
impl<E: Event, T: Topic<E>> Subscribe<E, T> {
pub fn all() -> Self {
Subscribe(Subscription::All, PhantomData)
}
pub fn none() -> Self {
Subscribe(Subscription::None, PhantomData)
}
pub fn to(topics: impl IntoIterator<Item = T>) -> Self {
let set = HashSet::from_iter(topics);
Subscribe(Subscription::Topics(set), PhantomData)
}
}
impl<E: Event, T: Topic<E>> From<&[T]> for Subscribe<E, T> {
fn from(topics: &[T]) -> Self {
Subscribe::to(topics.iter().cloned())
}
}
impl<E: Event, T: Topic<E>, const N: usize> From<[T; N]> for Subscribe<E, T> {
fn from(topics: [T; N]) -> Self {
Subscribe::to(topics)
}
}
impl<E: Event, T: Topic<E>, const N: usize> From<&[T; N]> for Subscribe<E, T> {
fn from(topics: &[T; N]) -> Self {
Subscribe::to(topics.iter().cloned())
}
}
impl<E: Event, T: Topic<E>> From<T> for Subscribe<E, T> {
fn from(topic: T) -> Self {
Subscribe::to([topic])
}
}