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 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}