Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 0.89 KB | None | 0 0
  1. use num_traits::{zero, Num, NumCast, RefNum, ToPrimitive};
  2. use std::borrow::Borrow;
  3. use std::ops::*;
  4.  
  5. trait Averageable<T>: Iterator {
  6.     fn mean(self) -> T;
  7. }
  8.  
  9. impl<T, U> Averageable<T> for U
  10. where
  11.     U: Sized + Iterator,
  12.     U::Item: Num + ToPrimitive,
  13.     T: NumCast + Div<Output = T>,
  14. {
  15.     fn mean(self) -> T {
  16.         let (sum, len): (Self::Item, usize) =
  17.             self.fold((zero(), 0), |(a, len), e| (a + e, len + 1));
  18.  
  19.         if len == 0 {
  20.             panic!("Iterator is empty!");
  21.         } else {
  22.             let sum: T = NumCast::from(sum).expect("NumCast failed!");
  23.             let len: T = NumCast::from(len).expect("NumCast failed!");
  24.             sum / len
  25.         }
  26.     }
  27. }
  28.  
  29. fn main() {
  30.     let v: Vec<i32> = vec![10, 10, 20, 20];
  31.     // let mean: f32 = v.iter().mean();
  32.     // dbg!(mean);
  33.     let mean: f32 = v.into_iter().mean();
  34.     dbg!(mean);
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement