event_observer/
subject.rs

1use crate::observer::{MutObserver, Observer};
2use std::cell::RefCell;
3use std::rc::Rc;
4use std::sync::{Arc, Mutex, RwLock};
5
6pub struct Subject<E> {
7    observers: Vec<Box<dyn Observer<E>>>,
8}
9
10impl<E> Subject<E> {
11    pub fn new() -> Self {
12        Self { observers: vec![] }
13    }
14
15    pub fn notify(&self, event: &E) {
16        for observer in self.observers.iter() {
17            observer.on_notify(event)
18        }
19    }
20
21    pub fn add_observer(&mut self, observer: impl Observer<E> + 'static) -> usize {
22        self.observers.push(Box::new(observer));
23        self.observers.len() - 1
24    }
25
26    pub fn remove_observer(&mut self, index: usize) -> Box<dyn Observer<E>> {
27        self.observers.remove(index)
28    }
29}
30
31impl<E: 'static> Subject<E> {
32    pub fn add_rc_observer(&mut self, observer: Rc<dyn Observer<E>>) -> usize {
33        self.add_observer(observer)
34    }
35
36    pub fn add_rc_refcell_observer(&mut self, observer: Rc<RefCell<dyn Observer<E>>>) -> usize {
37        self.add_observer(observer)
38    }
39
40    pub fn add_rc_refcell_mut_observer(
41        &mut self,
42        observer: Rc<RefCell<dyn MutObserver<E>>>,
43    ) -> usize {
44        self.add_observer(observer)
45    }
46
47    pub fn add_arc_observer(&mut self, observer: Arc<dyn Observer<E>>) -> usize {
48        self.add_observer(observer)
49    }
50
51    pub fn add_arc_mutex_observer(&mut self, observer: Arc<Mutex<dyn Observer<E>>>) -> usize {
52        self.add_observer(observer)
53    }
54
55    pub fn add_arc_mutex_mut_observer(
56        &mut self,
57        observer: Arc<Mutex<dyn MutObserver<E>>>,
58    ) -> usize {
59        self.add_observer(observer)
60    }
61
62    pub fn add_arc_rwlock_observer(&mut self, observer: Arc<RwLock<dyn Observer<E>>>) -> usize {
63        self.add_observer(observer)
64    }
65
66    pub fn add_arc_rwlock_mut_observer(
67        &mut self,
68        observer: Arc<RwLock<dyn MutObserver<E>>>,
69    ) -> usize {
70        self.add_observer(observer)
71    }
72}