event_observer/
subject.rs1use 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}