Review this generated listener hub.
Keep listeners without owning them, publish to every live listener, prune expired entries, never call listener code under the registry lock, return an error for a poisoned lock, and produce no output.
Rust
use std::sync::{Arc, Mutex};
trait Listener: Send + Sync {
fn on_message(&self, message: &str);
}
struct Hub {
listeners: Mutex<Vec<Arc<dyn Listener>>>,
}
impl Hub {
fn subscribe(&self, listener: Arc<dyn Listener>) {
self.listeners.lock().unwrap().push(listener);
}
fn publish(&self, message: &str) {
let listeners = self.listeners.lock().unwrap();
for listener in listeners.iter() {
listener.on_message(message);
}
println!("delivered to {}", listeners.len());
}
}
generated code is illustrative, not from any one model