Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. use std::io::BufRead;
  2. use std::io;
  3.  
  4.  
  5. trait PipeTrait: Iterator {
  6. fn pipe<T>(self, transform: T) -> Pipe<Self, T>
  7. where
  8. Self: Sized,
  9. T: Transform<In = Self::Item>,
  10. {
  11. Pipe::new(self, transform)
  12. }
  13. }
  14.  
  15.  
  16. // Pipe Struct/Impl
  17. struct Pipe<I, T> {
  18. iter: I,
  19. transform: T,
  20. }
  21.  
  22. impl<T: Transform<In = I::Item>, I: Iterator> Pipe<I, T> {
  23. fn new(iter: I, transform: T) -> Pipe<I, T> {
  24. Pipe { iter, transform }
  25. }
  26. }
  27.  
  28. impl<T: Transform<In = I::Item>, I: Iterator> Iterator for Pipe<I, T> {
  29. type Item = T::Out;
  30. fn next(&mut self) -> Option<T::Out> {
  31. self.transform.transform(&mut self.iter)
  32. }
  33. }
  34.  
  35. trait Transform {
  36. type In;
  37. type Out;
  38. fn transform<I: Iterator<Item = Self::In>>(&mut self, iter: &mut I) -> Option<Self::Out>;
  39. }
  40.  
  41.  
  42.  
  43.  
  44. // Sample Transform implementation
  45. struct Splitter<'a> {
  46. delim: &'a str,
  47. buffer: std::str::Split<'a, &'a str>,
  48. }
  49. impl <'a>Splitter<'a> {
  50. fn new(delim: &'a str) -> Splitter<'a> {
  51. let b = "".split(delim);
  52. Splitter {delim, buffer: b}
  53. }
  54. }
  55. impl <'a>Transform for Splitter<'a> {
  56. type In = Result<String, std::io::Error>;
  57. type Out = &'a str;
  58. fn transform<I: Iterator<Item = Self::In>>(&mut self, iter: &'a mut I) -> Option<Self::Out> {
  59. match self.buffer.next() {
  60. Some(value) => return Some(value),
  61. None => {
  62. match iter.next() {
  63. Some(next_str) => {
  64. let a = self.delim;
  65. let b = next_str.unwrap();
  66. let c = b.split(a);
  67. self.buffer = c
  68. },
  69. None => return None
  70. }
  71. }
  72. }
  73. self.buffer.next()
  74. }
  75. }
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83. fn main() {
  84. impl<I: Iterator> PipeTrait for I {}
  85.  
  86.  
  87. let s1 = Splitter::new("j");
  88.  
  89. let stdin = io::stdin();
  90. let lines = stdin.lock().lines();
  91.  
  92. for v in lines.pipe(s1)
  93. {
  94. println!("{}", v);
  95. }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement