prime_forge/
destiny_rift.rs1use std::collections::HashMap;
2
3use super::EtherealFlow;
4
5pub trait DestinyRift: EtherealFlow {}
6
7pub 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 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}