Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use num_traits::{zero, Num, NumCast, RefNum, ToPrimitive};
- use std::borrow::Borrow;
- use std::ops::*;
- trait Averageable<T>: Iterator {
- fn mean(self) -> T;
- }
- impl<T, U> Averageable<T> for U
- where
- U: Sized + Iterator,
- U::Item: Num + ToPrimitive,
- T: NumCast + Div<Output = T>,
- {
- fn mean(self) -> T {
- let (sum, len): (Self::Item, usize) =
- self.fold((zero(), 0), |(a, len), e| (a + e, len + 1));
- if len == 0 {
- panic!("Iterator is empty!");
- } else {
- let sum: T = NumCast::from(sum).expect("NumCast failed!");
- let len: T = NumCast::from(len).expect("NumCast failed!");
- sum / len
- }
- }
- }
- fn main() {
- let v: Vec<i32> = vec![10, 10, 20, 20];
- // let mean: f32 = v.iter().mean();
- // dbg!(mean);
- let mean: f32 = v.into_iter().mean();
- dbg!(mean);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement