iced_devtools/
time_machine.rs1use crate::Program;
2
3#[cfg(feature = "time-travel")]
4pub struct TimeMachine<P>
5where
6 P: Program,
7{
8 state: Option<P::State>,
9 messages: Vec<P::Message>,
10}
11
12#[cfg(feature = "time-travel")]
13impl<P> TimeMachine<P>
14where
15 P: Program,
16 P::Message: Clone,
17{
18 pub fn new() -> Self {
19 Self {
20 state: None,
21 messages: Vec::new(),
22 }
23 }
24
25 pub fn is_rewinding(&self) -> bool {
26 self.state.is_some()
27 }
28
29 pub fn push(&mut self, message: &P::Message) {
30 self.messages.push(message.clone());
31 }
32
33 pub fn rewind(&mut self, program: &P, message: usize) {
34 crate::debug::disable();
35 let (mut state, _) = program.boot();
36
37 if message < self.messages.len() {
38 for message in &self.messages[0..message] {
40 let _ = program.update(&mut state, message.clone());
41 }
42 }
43
44 self.state = Some(state);
45 }
46
47 pub fn go_to_present(&mut self) {
48 self.state = None;
49 crate::debug::enable();
50 }
51
52 pub fn state(&self) -> Option<&P::State> {
53 self.state.as_ref()
54 }
55}
56
57#[cfg(not(feature = "time-travel"))]
58pub struct TimeMachine<P>
59where
60 P: Program,
61{
62 _program: std::marker::PhantomData<P>,
63}
64
65#[cfg(not(feature = "time-travel"))]
66impl<P> TimeMachine<P>
67where
68 P: Program,
69{
70 pub fn new() -> Self {
71 Self {
72 _program: std::marker::PhantomData,
73 }
74 }
75
76 pub fn is_rewinding(&self) -> bool {
77 false
78 }
79
80 pub fn push(&mut self, _message: &P::Message) {}
81
82 pub fn rewind(&mut self, _program: &P, _message: usize) {}
83
84 pub fn go_to_present(&mut self) {}
85
86 pub fn state(&self) -> Option<&P::State> {
87 None
88 }
89}