use self::processed::Processed;
use super::{subscriber::Subscriber, Processor, StreamError};
pub use stream::stream;
pub mod stream;
pub mod processed;
pub trait Publisher<'a> {
type Output;
fn subscribe<S>(&mut self, subscriber: S) -> Result<(), StreamError>
where
S: Subscriber<Self::Output> + 'a;
}
impl<'a, 'b, P> Publisher<'a> for &'b mut P
where
P: Publisher<'a>,
{
type Output = P::Output;
fn subscribe<S>(&mut self, subscriber: S) -> Result<(), StreamError>
where
S: Subscriber<Self::Output> + 'a,
{
Publisher::subscribe(&mut (**self), subscriber)
}
}
pub trait PublisherExt<'a>: Publisher<'a> {
fn with<P>(&mut self, processor: P) -> Processed<'_, Self, P>
where
P: Processor<'a, Self::Output> + 'a,
{
Processed::new(self, processor)
}
}
impl<'a, P> PublisherExt<'a> for P where P: Publisher<'a> {}