use bevy::platform::collections::HashMap;
use core::{hash::BuildHasher, iter};
use midix::prelude::*;
use super::SongId;
pub trait SongWriter {
fn song_id(&self) -> Option<SongId> {
None
}
fn events(&self) -> impl Iterator<Item = Timed<ChannelVoiceMessage>>;
fn looped(&self) -> bool {
false
}
fn paused(&self) -> bool {
false
}
fn divide_events_into_channels<S: BuildHasher + Default>(
&self,
) -> HashMap<Channel, Vec<Timed<VoiceEvent>>, S> {
let mut map: HashMap<Channel, Vec<Timed<VoiceEvent>>, S> = HashMap::default();
for event in self.events() {
let voice_events = map.entry(event.event.channel()).or_default();
voice_events.push(Timed::new(event.timestamp, *event.event.event()));
}
map
}
}
impl SongWriter for Timed<ChannelVoiceMessage> {
fn events(&self) -> impl Iterator<Item = Timed<ChannelVoiceMessage>> {
iter::once(*self)
}
}
impl SongWriter for Vec<Timed<ChannelVoiceMessage>> {
fn events(&self) -> impl Iterator<Item = Timed<ChannelVoiceMessage>> {
self.iter().copied()
}
}
impl SongWriter for [Timed<ChannelVoiceMessage>] {
fn events(&self) -> impl Iterator<Item = Timed<ChannelVoiceMessage>> {
self.iter().copied()
}
}