use std::marker::PhantomData;
use crate::any::InspectablePerformance;
pub trait HitResultGenerator<M: InspectablePerformance> {
fn generate_hitresults(inspect: M::InspectPerformance<'_>) -> M::HitResults;
}
pub struct Fast;
pub struct Closest;
pub struct Statistical;
pub struct IgnoreAccuracy;
pub struct Composable<Osu, Taiko, Catch, Mania>(PhantomData<(Osu, Taiko, Catch, Mania)>);
macro_rules! impl_composable_generator {
( $module:ident :: $mode:ident ) => {
impl<Osu, Taiko, Catch, Mania> HitResultGenerator<crate::$module::$mode>
for Composable<Osu, Taiko, Catch, Mania>
where
$mode: HitResultGenerator<crate::$module::$mode>,
{
fn generate_hitresults(
inspect: <crate::$module::$mode as crate::any::InspectablePerformance>::InspectPerformance<'_>,
) -> <crate::$module::$mode as crate::model::mode::IGameMode>::HitResults {
$mode::generate_hitresults(inspect)
}
}
};
}
impl_composable_generator!(osu::Osu);
impl_composable_generator!(taiko::Taiko);
impl_composable_generator!(catch::Catch);
impl_composable_generator!(mania::Mania);