I need to create two iterators for stdin. However, I cannot figure out how to implement this.
Here is a simple example:
use std::io::{self, BufRead, BufReader, Result};
fn main() {
let reader1 = BufReader::new(io::stdin()).lines();
let reader2 = BufReader::new(io::stdin()).lines();
for line in reader1 {
println!("reader1: {:?}", line);
}
for line in reader2 {
println!("reader2: {:?}", line);
}
}
output:
$ printf '1\n2\n3\n4\n' | cargo run
reader1: Ok("1")
reader1: Ok("2")
reader1: Ok("3")
reader1: Ok("4")
The iterator reader2
never gets implemented.
The full example of what I am trying to accomplish is a little more complex...
use itertools::multipeek;
use std::io::{self, BufRead, BufReader, Result};
fn main() {
let reader = BufReader::new(io::stdin()).lines();
let mut mp = multipeek(BufReader::new(io::stdin()).lines());
for line in reader {
mp.next();
match line {
Ok(l) => {
println!("line: {}", l);
println!("peek: {:?}", mp.peek());
println!("peek: {:?}", mp.peek());
}
Err(e) => println!("error parsing line: {:?}", e),
}
}
}
output:
$ printf '1\n2\n3\n4\n' | cargo run
line: 1
peek: None
peek: None
line: 2
peek: None
peek: None
line: 3
peek: None
peek: None
line: 4
peek: None
peek: None
from what I can tell though, it has something to do with using stdin
because it works fine when reading from a file.