use super::TuneInputs;
#[diagnostic::on_unimplemented(
message = "`{Self}` is not a valid input generator",
label = "invalid input generator"
)]
pub trait InputGenerator<K, I: TuneInputs>: Send + Sync + 'static {
fn generate<'a>(&self, key: &K, inputs: &I::At<'a>) -> I::At<'a>;
}
#[derive(Copy, Clone, Debug, Default)]
pub struct CloneInputGenerator;
impl<K, I: TuneInputs> InputGenerator<K, I> for CloneInputGenerator {
fn generate<'a>(&self, _key: &K, inputs: &I::At<'a>) -> I::At<'a> {
inputs.clone()
}
}
impl<K, Func, A> InputGenerator<K, A> for Func
where
A: Clone + Send + Sync + 'static,
K: 'static,
Func: Send + Sync + 'static + Fn(&K, &A) -> A,
{
#[inline]
fn generate<'a>(
&self,
key: &K,
inputs: &<A as TuneInputs>::At<'a>,
) -> <A as TuneInputs>::At<'a> {
(self)(key, inputs)
}
}