event_stream/
event_stream.rs

1#[derive(PartialEq)]
2enum MouseButton {
3    Right,
4    Middle,
5    Left,
6}
7
8struct MyButton {
9    click_host: epoxy::Sink<MouseButton>,
10}
11
12impl MyButton {
13    pub fn new() -> MyButton {
14        MyButton {
15            click_host: epoxy::Sink::new(),
16        }
17    }
18
19    pub fn get_clicks(&self) -> epoxy::Stream<MouseButton> {
20        self.click_host.get_stream()
21    }
22
23    pub fn click(&self, button: MouseButton) {
24        self.click_host.emit(button)
25    }
26}
27
28fn main() {
29    let button = MyButton::new();
30    let all_clicks_count = button.get_clicks().count_values();
31    let left_clicks_count = button
32        .get_clicks()
33        .filter(|click| *click == MouseButton::Left)
34        .count_values();
35
36    button.click(MouseButton::Left);
37    button.click(MouseButton::Right);
38    button.click(MouseButton::Left);
39    button.click(MouseButton::Middle);
40    button.click(MouseButton::Left);
41
42    {
43        let _sub_all = all_clicks_count.subscribe(|count| {
44            assert_eq!(*count, 6);
45            println!("Counted 6 clicks");
46        });
47        let _sub_left = left_clicks_count.subscribe(|count| {
48            assert_eq!(*count, 4);
49            println!("Counted 4 left clicks");
50        });
51        button.click(MouseButton::Left);
52    }
53}