Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. trait PipeTrait: Iterator {
  2. fn pipe<T>(self, transform: T) -> Pipe<Self, T>
  3. where
  4. Self: Sized,
  5. T: Transform<In = Self::Item>,
  6. {
  7. Pipe::new(self, transform)
  8. }
  9. }
  10.  
  11. impl<I: Iterator> PipeTrait for I {}
  12.  
  13. // Pipe Struct/Impl
  14. struct Pipe<I, T> {
  15. iter: I,
  16. transform: T,
  17. }
  18.  
  19. impl<T: Transform<In = I::Item>, I: Iterator> Pipe<I, T> {
  20. fn new(iter: I, transform: T) -> Pipe<I, T> {
  21. Pipe { iter, transform }
  22. }
  23. }
  24.  
  25. impl<T: Transform<In = I::Item>, I: Iterator> Iterator for Pipe<I, T> {
  26. type Item = T::Out;
  27. fn next(&mut self) -> Option<T::Out> {
  28. self.transform.transform(&mut self.iter)
  29. }
  30. }
  31.  
  32. trait Transform {
  33. type In;
  34. type Out;
  35. fn transform<I: Iterator<Item = Self::In>>(&mut self, iter: &mut I) -> Option<Self::Out>;
  36. }
  37.  
  38. // Sample Transform implementation
  39. struct SumTransform {
  40. step: usize,
  41. }
  42. impl Transform for SumTransform {
  43. type In = i32;
  44. type Out = i32;
  45. fn transform<I: Iterator<Item = Self::In>>(&mut self, iter: &mut I) -> Option<Self::Out> {
  46. if let None = iter.peekable().peek() {
  47. return None
  48. }
  49. Some(iter.take(self.step).sum::<i32>())
  50. }
  51. }
  52.  
  53. fn main() {
  54. for v in (1..1000)
  55. .pipe(SumTransform { step: 3 })
  56. .pipe(SumTransform { step: 2 })
  57. .pipe(SumTransform { step: 5 })
  58. {
  59. println!("v {}", v);
  60. }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement