event_observer/
observer.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3use std::sync::{Arc, Mutex, RwLock};
4
5pub trait Observer<E> {
6    fn on_notify(&self, event: &E);
7}
8
9pub trait MutObserver<E> {
10    fn on_notify(&mut self, event: &E);
11}
12
13impl<E> Observer<E> for Rc<dyn Observer<E>> {
14    fn on_notify(&self, event: &E) {
15        (**self).on_notify(event)
16    }
17}
18
19impl<E> Observer<E> for Rc<RefCell<dyn Observer<E>>> {
20    fn on_notify(&self, event: &E) {
21        self.borrow().on_notify(event)
22    }
23}
24
25impl<E> Observer<E> for Rc<RefCell<dyn MutObserver<E>>> {
26    fn on_notify(&self, event: &E) {
27        self.borrow_mut().on_notify(event)
28    }
29}
30
31impl<E> Observer<E> for Arc<dyn Observer<E>> {
32    fn on_notify(&self, event: &E) {
33        (**self).on_notify(event)
34    }
35}
36
37impl<E> Observer<E> for Arc<Mutex<dyn Observer<E>>> {
38    fn on_notify(&self, event: &E) {
39        self.lock().unwrap().on_notify(event)
40    }
41}
42
43impl<E> Observer<E> for Arc<Mutex<dyn MutObserver<E>>> {
44    fn on_notify(&self, event: &E) {
45        self.lock().unwrap().on_notify(event)
46    }
47}
48
49impl<E> Observer<E> for Arc<RwLock<dyn Observer<E>>> {
50    fn on_notify(&self, event: &E) {
51        self.read().unwrap().on_notify(event)
52    }
53}
54
55impl<E> Observer<E> for Arc<RwLock<dyn MutObserver<E>>> {
56    fn on_notify(&self, event: &E) {
57        self.write().unwrap().on_notify(event)
58    }
59}