use std::collections::HashMap;
use crate::event::MidiEvent;
pub type MidiHandler = Box<dyn Fn(&MidiEvent) + Send + Sync>;
pub struct MidiRouter {
handlers: HashMap<u8, Vec<MidiHandler>>,
}
impl MidiRouter {
pub fn new() -> Self {
Self { handlers: HashMap::new() }
}
pub fn register(&mut self, channel: u8, handler: MidiHandler) {
self.handlers.entry(channel).or_default().push(handler);
}
pub fn dispatch(&self, event: &MidiEvent) {
if let Some(handlers) = self.handlers.get(&event.channel) {
for h in handlers { h(event); }
}
if let Some(handlers) = self.handlers.get(&255) {
for h in handlers { h(event); }
}
}
pub fn clear_channel(&mut self, channel: u8) {
self.handlers.remove(&channel);
}
}
impl Default for MidiRouter {
fn default() -> Self { Self::new() }
}