[go: up one dir, main page]

cd/
cd.rs

1use generator::*;
2
3#[derive(Debug)]
4enum Action {
5    Play(&'static str),
6    Stop,
7}
8
9#[derive(Debug, Clone, Copy, PartialEq)]
10enum State {
11    Playing,
12    Stopped,
13}
14
15use crate::Action::*;
16use crate::State::*;
17
18fn main() {
19    let mut cd_player = Gn::new_scoped(|mut s| {
20        let mut state = Stopped;
21        loop {
22            // println!("{:?}", *state);
23            // in release mod without this there is bugs!!!!! (rustc 1.59.0 (9d1b2106e 2022-02-23))
24            std::sync::atomic::compiler_fence(std::sync::atomic::Ordering::AcqRel);
25
26            match state {
27                Stopped => match s.get_yield() {
28                    Some(Play(t)) => {
29                        println!("I'm playing {t}");
30                        state = Playing;
31                    }
32                    Some(Stop) => println!("I'm already stopped"),
33                    _ => unreachable!("some thing wrong"),
34                },
35
36                Playing => match s.get_yield() {
37                    Some(Stop) => {
38                        println!("I'm stopped");
39                        state = Stopped;
40                    }
41                    Some(Play(_)) => println!("should first stop"),
42                    _ => unreachable!("some thing wrong"),
43                },
44            }
45
46            s.yield_with(state);
47        }
48    });
49
50    for _ in 0..1000 {
51        let ret = cd_player.send(Play("hello world"));
52        assert_eq!(ret, Playing);
53        let ret = cd_player.send(Play("hello another day"));
54        assert_eq!(ret, Playing);
55        let ret = cd_player.send(Stop);
56        assert_eq!(ret, Stopped);
57        let ret = cd_player.send(Stop);
58        assert_eq!(ret, Stopped);
59        let ret = cd_player.send(Play("hello another day"));
60        assert_eq!(ret, Playing);
61        let ret = cd_player.send(Stop);
62        assert_eq!(ret, Stopped);
63    }
64}