minlin 0.5.0

Rust library with minimal linear algebra made to be as convinient as possible.
Documentation
/// Cast type to numeric type with smaller range. Ignore potential
/// overflows.
pub trait Cast<O> {
    /// Cast type to numeric type with smaller range. Ignore potential
    /// overflows.
    fn cast(self) -> O;
}

#[macro_export]
macro_rules! impl_cast {
    ($t:ident < $g:ident > $([$(<$a:ident $(, $p:tt)?>),*])?) => {
        impl<$g: $crate::Cast<O>, O> $crate::Cast<$t<O>> for $t<$g> {
            fn cast(self) -> $t<O> {
                self.map($g::cast)
            }
        }
    };
}

macro_rules! impl_base_cast {
    ($($i:ident),* -> $o:ident) => {
        $(impl Cast<$o> for $i {
            fn cast(self) -> $o {
                self as $o
            }
        })*
    };
}

impl_base_cast!(
    f64, u128, i128, usize, isize, u64, i64, u32, i32, u16, i16, i8, u8 -> f32
);
impl_base_cast!(
    f64, f32, u128, i128, usize, isize, u64, i64, u32, i32, u16, i16, i8, u8
        -> f64
);
impl_base_cast!(
    f64, f32, u128, i128, usize, isize, u64, i64, u32, i32, u16, i16, i8 -> u8
);
impl_base_cast!(
    f64, f32, u128, i128, usize, isize, u64, i64, u32, i32, u16, i16, u8 -> i8
);
impl_base_cast!(
    f64, f32, u128, i128, usize, isize, u64, i64, u32, i32, i16, i8 -> u16
);
impl_base_cast!(f64, f32, u128, i128, usize, isize, u64, i64, u32, i32, u16 -> i16);
impl_base_cast!(f64, f32, u128, i128, usize, isize, u64, i64, i32, i16, i8 -> u32);
impl_base_cast!(f64, f32, u128, i128, usize, isize, u64, i64, u32 -> i32);
impl_base_cast!(f64, f32, u128, i128, usize, isize, i64, i32, i16, i8 -> u64);
impl_base_cast!(f64, f32, u128, i128, usize, isize, u64 -> i64);
impl_base_cast!(f64, f32, u128, i128, isize, u64, i64, i32, i16, i8 -> usize);
impl_base_cast!(f64, f32, u128, i128, usize, u64, i64, i32 -> isize);
impl_base_cast!(f64, f32, i128, isize, i64, i32, i16, i8 -> u128);
impl_base_cast!(f64, f32, u128 -> i128);