use funcmap::{FuncMap, TypeParam};
use units::*;
#[derive(FuncMap, Debug)]
struct Measurements<L, M> {
lengths: Vec<L>,
masses: Vec<M>,
}
type LengthParam = TypeParam<0>;
type MassParam = TypeParam<1>;
impl<L, M> Measurements<L, M> {
fn into_base(self) -> Measurements<Meter, Kilogram>
where
L: Into<Meter>,
M: Into<Kilogram>,
{
self.func_map_over::<LengthParam, _>(Into::into)
.func_map_over::<MassParam, _>(Into::into)
}
}
fn main() {
let measurements = Measurements {
lengths: vec![Kilometer(5), Kilometer(42)],
masses: vec![Gram(1000), Gram(5000)],
};
println!("{:?}", measurements.into_base());
}
mod units {
#[derive(Debug)]
pub struct Meter(pub u32);
#[derive(Debug)]
pub struct Kilometer(pub u32);
#[derive(Debug)]
pub struct Gram(pub u32);
#[derive(Debug)]
pub struct Kilogram(pub u32);
impl From<Kilometer> for Meter {
fn from(Kilometer(km): Kilometer) -> Self {
Self(km * 1000)
}
}
impl From<Gram> for Kilogram {
fn from(Gram(g): Gram) -> Self {
Self(g / 1000)
}
}
}