use std::error::Error;
use std::fmt::Display;
use std::sync::Arc;
use rxr::{subjects::AsyncSubject, subscribe::Subscriber};
use rxr::{ObservableExt, Observer, Subscribeable};
pub fn create_subscriber<T: Display>(subscriber_id: i32) -> Subscriber<T> {
Subscriber::new(
move |v| println!("Subscriber #{} emitted: {}", subscriber_id, v),
move |e| eprintln!("Error: {} {}", e, subscriber_id),
|| println!("Completed"),
)
}
#[derive(Debug)]
struct AsyncSubjectError(String);
impl Display for AsyncSubjectError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl Error for AsyncSubjectError {}
pub fn main() {
let (mut emitter, mut receiver) = AsyncSubject::emitter_receiver();
receiver.subscribe(create_subscriber(1));
emitter.next(101); emitter.next(102);
receiver
.clone() .map(|v| format!("mapped {}", v))
.subscribe(create_subscriber(2));
receiver.subscribe(create_subscriber(3));
emitter.next(103);
emitter.error(Arc::new(AsyncSubjectError(
"AsyncSubject error".to_string(),
)));
receiver.subscribe(create_subscriber(4));
emitter.next(104);
}