1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque};
use std::hash::Hash;

/// Observer trait.
pub trait Observe<T> {
    /// Updates this observer with an item.
    fn update(&mut self, item: T);
}

impl<T> Observe<T> for Vec<T> {
    fn update(&mut self, item: T) {
        self.push(item);
    }
}
impl<T> Observe<T> for VecDeque<T> {
    fn update(&mut self, item: T) {
        self.push_back(item);
    }
}
impl<K: Eq + Hash, V> Observe<(K, V)> for HashMap<K, V> {
    fn update(&mut self, item: (K, V)) {
        let (k, v) = item;
        self.insert(k, v);
    }
}
impl<T: Eq + Hash> Observe<T> for HashSet<T> {
    fn update(&mut self, item: T) {
        self.insert(item);
    }
}
impl<K: Eq + Ord, V> Observe<(K, V)> for BTreeMap<K, V> {
    fn update(&mut self, item: (K, V)) {
        let (k, v) = item;
        self.insert(k, v);
    }
}
impl<T: Eq + Ord> Observe<T> for BTreeSet<T> {
    fn update(&mut self, item: T) {
        self.insert(item);
    }
}
impl Observe<char> for String {
    fn update(&mut self, item: char) {
        self.push(item);
    }
}
impl Observe<&str> for String {
    fn update(&mut self, item: &str) {
        self.push_str(item);
    }
}