1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use crate::{
ast::Program,
vm::{Vm, VmError},
};
use std::collections::HashMap;
#[derive(Default)]
pub struct FlowManager {
vms: HashMap<String, (Vm, bool)>,
}
impl FlowManager {
pub fn create_vm(&mut self, name: &str, ast: Program) -> Result<(), VmError> {
let vm = Vm::new(ast)?;
self.vms.insert(name.to_owned(), (vm, false));
Ok(())
}
pub fn destroy_vm(&mut self, name: &str) -> bool {
self.vms.remove(name).is_some()
}
pub fn is_paused(&self, name: &str) -> Option<bool> {
Some(self.vms.get(name)?.1)
}
pub fn set_paused(&mut self, name: &str, paused: bool) -> Option<()> {
self.vms.get_mut(name)?.1 = paused;
Some(())
}
pub fn get(&self, name: &str) -> Option<&Vm> {
self.vms.get(name).map(|(vm, _)| vm)
}
pub fn get_mut(&mut self, name: &str) -> Option<&mut Vm> {
self.vms.get_mut(name).map(|(vm, _)| vm)
}
pub fn vms(&self) -> impl Iterator<Item = &Vm> {
self.vms.values().map(|(vm, _)| vm)
}
pub fn vms_mut(&mut self) -> impl Iterator<Item = &mut Vm> {
self.vms.values_mut().map(|(vm, _)| vm)
}
pub fn process_events(&mut self) -> Result<(), VmError> {
for (vm, paused) in self.vms.values_mut() {
if !*paused {
vm.process_events()?;
}
}
Ok(())
}
}