prime_forge/
destiny_rift.rs

1use std::collections::HashMap;
2
3use super::EtherealFlow;
4
5pub trait DestinyRift: EtherealFlow {}
6
7// alias for events
8pub struct DestinyRiftManager {
9    pub events: HashMap<std::any::TypeId, Vec<Box<dyn DestinyRift>>>,
10}
11
12impl DestinyRiftManager {
13    pub fn new() -> DestinyRiftManager {
14        DestinyRiftManager {
15            events: HashMap::new(),
16        }
17    }
18
19    pub fn add_event(&mut self, event: Box<dyn DestinyRift>) {
20        if let Some(ev) = self.events.get_mut(&event.as_any().type_id()) {
21            ev.push(event);
22            return;
23        }
24        self.events.insert(event.as_any().type_id(), vec![event]);
25    }
26
27    pub fn remove_event(&mut self) {
28        let keys_to_remove = self
29        .events
30        .iter()
31        .filter(|(_, ev)| ev.is_empty())
32        .map(|(key, _)| *key)
33        .collect::<Vec<_>>();
34    
35    for key in keys_to_remove {
36            println!("Removing event: {:?}", key);
37            self.events.remove(&key);
38        }
39    }
40
41    pub fn consume_event<T: 'static + DestinyRift>(&mut self) -> Option<&T> {
42        // remove last ev
43        if let Some(ev) = self.events.get_mut(&std::any::TypeId::of::<T>()) {
44            let ev = ev.pop().unwrap();
45            let ev = ev.as_any().downcast_ref::<T>().unwrap();
46            let ev = unsafe { std::mem::transmute::<&T, &'static T>(ev) };
47            return Some(ev);
48        }
49        None
50    }
51}