use std::ops::{Add,Mul};
use crate::ratio::Ratio;
use fixed_wide_traits::wide::{WideMul,WideDiv};

impl<Num,Den:Copy> Ratio<Num,Den>
{
	pub fn rational_add<T>(self,rhs:T)->Ratio<<Num as Add<<Den as Mul<T>>::Output>>::Output,Den>
		where
			Den:Mul<T>,
			Num:Add<<Den as Mul<T>>::Output>,
	{
		Ratio{
			num:self.num+self.den.mul(rhs),
			den:self.den,
		}
	}
	pub fn wide_rational_add<T>(self,rhs:T)->Ratio<<Num as Add<<Den as WideMul<T>>::Output>>::Output,Den>
		where
			Den:WideMul<T>,
			Num:Add<<Den as WideMul<T>>::Output>,
	{
		Ratio{
			num:self.num+self.den.wide_mul(rhs),
			den:self.den,
		}
	}
}
impl<Num,Den,T> WideMul<T> for Ratio<Num,Den>
	where
		Num:WideMul<T>,
{
	type Output=Ratio<<Num as WideMul<T>>::Output,Den>;
	fn wide_mul(self,rhs:T)->Ratio<<Num as WideMul<T>>::Output,Den>{
		Ratio{
			num:self.num.wide_mul(rhs),
			den:self.den,
		}
	}
}
impl<Num,Den,T> WideDiv<T> for Ratio<Num,Den>
	where
		Den:WideMul<T>,
{
	type Output=Ratio<Num,<Den as WideMul<T>>::Output>;
	fn wide_div(self,rhs:T)->Ratio<Num,<Den as WideMul<T>>::Output>{
		Ratio{
			num:self.num,
			den:self.den.wide_mul(rhs),
		}
	}
}