1use std::fmt;
2
3use super::EphemeralState;
4use crate::{
5 MMItem, Selection,
6 message::{Interrupt, Event},
7};
8
9pub type DynamicMethod<T, S, C, E> = Box<dyn Fn(&mut EphemeralState<'_, T, S, C>, &E) + Send + Sync>;
12pub type DynamicHandlers<T, S, C> = (EventHandlers<T, S, C>, InterruptHandlers<T, S, C>);
13
14#[allow(clippy::type_complexity)]
15pub struct EventHandlers<T: MMItem, S: Selection, C> {
16 handlers: Vec<(Vec<Event>, DynamicMethod<T, S, C, Event>)>,
17}
18
19#[allow(clippy::type_complexity)]
20pub struct InterruptHandlers<T: MMItem, S: Selection, C> {
21 handlers: Vec<(Interrupt, Vec<DynamicMethod<T, S, C, Interrupt>>)>,
22}
23
24impl<T: MMItem, S: Selection, C> Default for EventHandlers<T, S, C> {
25 fn default() -> Self {
26 Self::new()
27 }
28}
29
30impl<T: MMItem, S: Selection, C> EventHandlers<T, S, C> {
31 pub fn new() -> Self {
32 Self { handlers: vec![] }
33 }
34
35 pub fn set(&mut self, events: Vec<Event>, handler: DynamicMethod<T, S, C, Event>) {
36 self.handlers.push((events, handler));
37 }
38
39 pub fn get(
40 &self,
41 event: &Event,
42 ) -> impl Iterator<Item = &DynamicMethod<T, S, C, Event>> {
43 self.handlers
44 .iter()
45 .filter(move |(events, _)| events.contains(event))
46 .map(|(_, handler)| handler)
47 }
48}
49
50impl<T: MMItem, S: Selection, C> Default for InterruptHandlers<T, S, C> {
51 fn default() -> Self {
52 Self::new()
53 }
54}
55
56impl<T: MMItem, S: Selection, C> InterruptHandlers<T, S, C> {
57 pub fn new() -> Self {
58 Self { handlers: vec![] }
59 }
60
61 pub fn set(&mut self, variant: Interrupt, handler: DynamicMethod<T, S, C, Interrupt>) {
62 if let Some((_, handlers)) = self.handlers.iter_mut().find(|(v, _)| *v == variant) {
63 handlers.push(handler);
64 } else {
65 self.handlers.push((variant, vec![handler]));
66 }
67 }
68
69 pub fn get(&self, variant: &Interrupt) -> impl Iterator<Item = &DynamicMethod<T, S, C, Interrupt>> {
70 self.handlers
71 .iter()
72 .filter_map(move |(v, h)| (v == variant).then_some(h))
73 .flatten()
74 }
75}
76
77impl<T: MMItem, S: Selection, C> fmt::Debug for EventHandlers<T, S, C> {
80 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
81 f.debug_struct("EventHandlers")
82 .field("handler_count", &self.handlers.len())
83 .finish()
84 }
85}
86
87impl<T: MMItem, S: Selection, C> fmt::Debug for InterruptHandlers<T, S, C> {
88 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
89 f.debug_struct("InterruptHandlers")
90 .field("variant_count", &self.handlers.len())
91 .finish()
92 }
93}