Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.99 KB | None | 0 0
  1. pub struct Mapscan<I, A, F> {
  2. accu: Option<A>,
  3. iter: I,
  4. f: F,
  5. }
  6.  
  7. impl<I, A, F> Mapscan<I, A, F> {
  8. pub fn new(iter: I, accu: Option<A>, f: F) -> Self {
  9. Self { iter, accu, f }
  10. }
  11. }
  12.  
  13. impl<I, A, F> Iterator for Mapscan<I, A, F>
  14. where
  15. I: Iterator,
  16. F: FnMut(&A, I::Item) -> Option<A>,
  17. {
  18. type Item = A;
  19.  
  20. fn next(&mut self) -> Option<Self::Item> {
  21. self.accu.take().map(|accu| {
  22. self.accu = self.iter.next().and_then(|item| (self.f)(&accu, item));
  23. accu
  24. })
  25. }
  26. }
  27.  
  28. trait IterPlus: Iterator {
  29. fn map_scan<A, F>(self, accu: Option<A>, f: F) -> Mapscan<Self, A, F>
  30. where
  31. Self: Sized,
  32. F: FnMut(&A, Self::Item) -> Option<A>,
  33. {
  34. Mapscan::new(self, accu, f)
  35. }
  36. }
  37.  
  38. impl<T: ?Sized> IterPlus for T where T: Iterator {}
  39.  
  40. fn main() {
  41. let xs = [1, 2, 3, 4, 5];
  42.  
  43. let vs = xs
  44. .iter()
  45. .map_scan(Some(0), |acc, x| Some(acc + x))
  46. .collect::<Vec<_>>();
  47.  
  48. println!("{:?}", vs)
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement