mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
36 lines
1,006 B
Rust
36 lines
1,006 B
Rust
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<const N: usize, E, T, U> = [(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<U> {
|
|
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())?
|
|
});
|
|
}
|
|
}
|