simple_observable/
lib.rs

1use std::ops::{Deref};
2
3impl<Data> Observable<Data> {
4    pub fn new(value: Data) -> Observable<Data> {
5        Observable {
6            data: value,
7            listeners: Vec::new(),
8        }
9    }
10
11    ///It takes as an argument a function to change
12    /// the value of the data, and then notifies all
13    /// listeners. It doesn't matter if the new data
14    /// value is different from the previous ones, the
15    ///  listeners will still be notified.
16    pub fn change(&mut self, change_fn: fn(&mut Data) -> ()) {
17        change_fn(&mut self.data);
18        self.notify();
19    }
20
21    pub fn add_listener(&mut self, listener: fn(&Data) -> ()) {
22        self.listeners.push(listener);
23    }
24
25    fn notify(&mut self) {
26        for listener in self.listeners.iter() {
27            listener(&self.data);
28        }
29    }
30}
31
32pub struct Observable<Data> {
33    data: Data,
34    listeners: Vec<fn(&Data) -> ()>,
35}
36
37impl<Data> Deref for Observable<Data> {
38    type Target = Data;
39
40    fn deref(&self) -> &Self::Target {
41        &self.data
42    }
43}
44
45impl<Data: Default> Default for Observable<Data> {
46    fn default() -> Self {
47        Observable{
48            data: Data::default(),
49            listeners: Vec::new(),
50        }
51    }
52}