#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(rustdoc::invalid_rust_codeblocks)]
use std::sync::Mutex;
pub struct Notifier<'a, E> {
pub subscribers: Vec<Box<dyn Fn(&E) + Send + Sync + 'a>>,
}
impl<'a, E> Notifier<'a, E> {
pub fn new() -> Notifier<'a, E> {
Notifier {
subscribers: Vec::new(),
}
}
pub fn new_with_cb<F>(callback: F) -> Notifier<'a, E>
where
F: Fn(&E) + Send + Sync + 'a,
{
let mut ret = Notifier {
subscribers: Vec::new(),
};
ret.register(callback);
return ret;
}
pub fn register<F>(&mut self, callback: F)
where
F: Fn(&E) + Send + Sync + 'a,
{
self.subscribers.push(Box::new(callback));
}
pub fn notify(&self, event: E) {
for callback in &self.subscribers {
callback(&event);
}
}
}
struct TestStruct {}
impl TestStruct {
pub fn new() -> Self {
return TestStruct {};
}
pub fn static_data_changed(val: &i32) {
println!("Static Test struct received data change val {}!", val);
}
}
struct TestGenerator<'a> {
pub data_changed: Notifier<'a, u32>,
}
impl<'a> TestGenerator<'a> {
pub fn fire(&self, val: u32) {
self.data_changed.notify(val);
}
}
struct TestListener {
count: u32,
}
impl TestListener {
pub fn new() -> Self {
return TestListener { count: 0 };
}
pub fn member_data_changed(&mut self, val: u32) {
self.count = val;
println!("Count is now {}!", self.count);
}
}
#[test]
fn test_notifier() {
let mut n = Notifier::<i32>::new();
n.register(|i| println!("i32 event received: {i}"));
let mut sz = Notifier::<String>::new();
sz.register(|s| println!("string event received: {s}"));
let _tst = TestStruct::new();
n.register(TestStruct::static_data_changed);
println!("sending i32 event...");
n.notify(4);
println!("sending string event...");
sz.notify("There is no spoon.".to_string());
let l = Mutex::new(TestListener::new());
let mut generator = TestGenerator {
data_changed: Notifier::<u32>::new(),
};
let callback = |val: &u32| l.lock().unwrap().member_data_changed(*val);
generator.data_changed.register(Box::new(callback));
generator.fire(1234);
}