use std::ops::{Add, Mul};
use general::{Op, Additive, Multiplicative};
pub trait Magma<O: Op>
: Sized + Clone
{
fn operate(self, Self) -> Self;
#[inline]
fn op(self, _: O, lhs: Self) -> Self {
self.operate(lhs)
}
}
macro_rules! impl_magma(
($M:ty; $op: ident; $($T:ty),* $(,)*) => {
$(impl Magma<$M> for $T {
#[inline]
fn operate(self, lhs: Self) -> Self {
self.$op(lhs)
}
})*
}
);
impl_magma!(Additive; add; u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);
impl_magma!(Multiplicative; mul; u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);