use super::division::{Division, DivisionResult}; /// Trait used for the old base conversion. pub(super) trait CalcRemainders{ fn calc_remainders(self, divisor : D) -> Remainders; } impl CalcRemainders for T where T:Division { fn calc_remainders(self, divisor : D) -> Remainders { Remainders::new(self,divisor) } } pub(super) struct Remainders{ value : Option, divisor : U, } impl> Remainders { fn new(value : T, divisor : U) -> Self { let value = if value.is_zero() { None } else { Some(value) }; Remainders { value, divisor, } } } impl> Iterator for Remainders{ type Item=U; fn next(&mut self) -> Option { if let Some(v) = self.value.take() { let DivisionResult{result, remainder} = v.divide(&self.divisor); self.value = if result.is_zero() { None } else { Some(result) }; Some(remainder) } else { None } } }