Advertisement
Guest User

Untitled

a guest
Mar 1st, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 0.90 KB | None | 0 0
  1. use num_traits::{NumAssign, NumCast, ToPrimitive};
  2. use std::ops::*;
  3.  
  4. trait Averageable: Iterator {
  5.     fn mean<T>(self) -> T
  6.     where
  7.         Self: Sized,
  8.         Self::Item: NumAssign + ToPrimitive,
  9.         T: NumCast + Div<Output = T>,
  10.     {
  11.         let mut iter = self.enumerate();
  12.         let mut len;
  13.         let mut sum;
  14.  
  15.         if let Some((i, n)) = iter.next() {
  16.             sum = n;
  17.             len = i;
  18.         } else {
  19.             panic!("Empty iterator!");
  20.         }
  21.  
  22.         for (i, n) in iter {
  23.             sum += n;
  24.             len = i;
  25.         }
  26.         len += 1;
  27.  
  28.         let len: T = NumCast::from(len).unwrap();
  29.         let sum: T = NumCast::from(sum).unwrap();
  30.  
  31.         sum / len
  32.     }
  33. }
  34.  
  35. impl<T> Averageable for T where T: Iterator {}
  36.  
  37. fn main() {
  38.     let v: Vec<i32> = vec![10, 10, 20, 20];
  39.     let mean: i32 = v.into_iter().mean();
  40.     println!("{}", mean);
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement