real_world_mpsc/
real_world_mpsc.rs

1use std::sync::mpsc::channel;
2use std::thread;
3use std::time::Duration;
4
5use setting_tracker::Setting;
6
7#[derive(Default, Debug)]
8struct Settings {
9    port: Setting<u16>,
10}
11
12fn main() {
13    // Settings
14    let (sender, receiver) = channel();
15    let mut settings = Settings::default();
16    settings.port.cb(move |old, new| {
17        let old_and_new = (old.clone(), new.clone());
18        sender.send(old_and_new).unwrap();
19    });
20
21    // Port subscriber
22    thread::spawn(move || loop {
23        let port = receiver.recv();
24        if port.is_ok() {
25            println!(
26                "port changed: {:?} -> {:?}",
27                port.unwrap().0,
28                port.unwrap().1
29            );
30        }
31    });
32
33    // Port publisher
34    let mut changing_port = 0u16;
35    loop {
36        changing_port = changing_port + 1;
37        settings.port.set(changing_port);
38        thread::sleep(Duration::from_millis(500));
39    }
40}
41
42/*
43Outputs:
44    port changed: 0 -> 1
45    port changed: 1 -> 2
46    port changed: 2 -> 3
47    port changed: 3 -> 4
48    port changed: 4 -> 5
49    port changed: 5 -> 6
50    port changed: 6 -> 7
51    port changed: 7 -> 8
52    port changed: 8 -> 9
53    ...
54 */