I probably wasn't explaining it right, as I've confused myself with all this genericness
I ended up with something like this:
pub trait Transmogrify<DestType, SrcParameter, DestParameter>
where Self: ParameterToSlice<SrcParameter>,
DestType: ParameterFromSlice<DestParameter> {
fn transmogrify<Callback>(&self, mut f: Callback) -> DestType
where Callback: FnMut(SrcParameter) -> DestParameter;
}
impl<SrcType, DestType, SrcParameter: Clone, DestParameter: Clone> Transmogrify<DestType, SrcParameter, DestParameter> for SrcType
where SrcType: ParameterToSlice<SrcParameter>,
DestType: ParameterFromSlice<DestParameter> {
fn transmogrify<Callback>(&self, f: Callback) -> DestType
where Callback: FnMut(SrcParameter) -> DestParameter {
let Parameters:Vec<DestParameter> = self.as_slice().iter().cloned().map(f).collect();
DestType::from_slice(&Parameters)
}
}
which does work, but it's not as constrained as I'd like, as it allows anything -> anything conversion, so Rust demands type hints.