iced_devtools/
time_machine.rs

1use 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            // TODO: Run concurrently (?)
39            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}