use crate::*; pub struct EventMap<'a, const N: usize, E, T, U>( pub [(E, &'a dyn Fn(T) -> U); N], pub Option<&'a dyn Fn(T) -> U>, ); pub type KeyMapping = [(E, &'static dyn Fn(&T)->U);N]; impl<'a, const N: usize, E: PartialEq, T, U> EventMap<'a, N, E, T, U> { pub fn handle (&self, context: T, event: &E) -> Option { for (binding, handler) in self.0.iter() { if event == binding { return Some(handler(context)) } } return None } } #[macro_export] macro_rules! event_map { ($events:expr) => { EventMap($events, None) }; ($events:expr, $default: expr) => { EventMap($events, $default) }; } #[macro_export] macro_rules! event_map_input_to_command { ($Engine:ty: $Model:ty: $Command:ty: $EventMap:expr) => { input_to_command!($Command: <$Engine>|state: $Model, input|{ event_map!($EventMap).handle(state, input.event())? }); } }