over_there/utils/
callback.rs1use std::collections::HashMap;
2use std::fmt;
3use std::fmt::Debug;
4
5pub type Callback<T> = dyn FnOnce(&T) + Send;
6
7pub struct CallbackManager<T> {
10 callbacks: HashMap<u32, Box<Callback<T>>>,
13}
14
15impl<T> CallbackManager<T> {
16 pub fn add_callback(
18 &mut self,
19 id: u32,
20 callback: impl FnOnce(&T) + Send + 'static,
21 ) {
22 self.callbacks.insert(id, Box::new(callback));
23 }
24
25 pub fn take_callback(&mut self, id: u32) -> Option<Box<Callback<T>>> {
27 self.callbacks.remove(&id)
28 }
29
30 pub fn invoke_callback(&mut self, id: u32, input: &T) {
32 if let Some(callback) = self.take_callback(id) {
33 callback(input)
34 }
35 }
36}
37
38impl<T> Default for CallbackManager<T> {
39 fn default() -> Self {
40 Self {
41 callbacks: HashMap::default(),
42 }
43 }
44}
45
46impl<T> Debug for CallbackManager<T> {
47 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48 write!(
49 f,
50 "CallbackManager {{ callbacks: {:?} }}",
51 self.callbacks.keys(),
52 )
53 }
54}