use crate::{Connection, MidiEvent};
pub trait Compose: Connection + Sized {
fn map<F: FnMut(MidiEvent) -> MidiEvent>(self, f: F) -> Map<Self, F> {
Map { con: self, f }
}
fn filter<F>(self, f: F) -> Filter<Self, F>
where
F: for<'a> FnMut(&'a MidiEvent) -> bool,
{
Filter { con: self, f }
}
}
impl<C: Connection> Compose for C {}
#[derive(Clone, Debug)]
pub struct Map<C: Connection, F> {
f: F,
pub con: C,
}
impl<C: Connection, F: FnMut(MidiEvent) -> MidiEvent> Connection for Map<C, F> {
#[inline]
fn play(&mut self, event: MidiEvent) -> bool {
let e = (self.f)(event);
self.con.play(e)
}
}
#[derive(Clone, Debug)]
pub struct Filter<C: Connection, F> {
pub con: C,
f: F,
}
impl<C: Connection, F> Connection for Filter<C, F>
where
F: for<'a> FnMut(&'a MidiEvent) -> bool,
{
#[inline]
fn play(&mut self, event: MidiEvent) -> bool {
if (self.f)(&event) {
self.con.play(event)
} else {
true
}
}
}