separate out the line/column counting from character iteration

This commit is contained in:
Oliver Schneider
2015-04-16 15:50:42 +02:00
parent 195f7380b5
commit c37f67b0a1
4 changed files with 82 additions and 45 deletions
+46
View File
@@ -0,0 +1,46 @@
use std::iter::Peekable;
use std::io;
pub struct LineColIterator<Iter: Iterator<Item=io::Result<u8>>> {
rdr: Peekable<Iter>,
line: usize,
col: usize,
}
impl<Iter: Iterator<Item=io::Result<u8>>> LineColIterator<Iter> {
pub fn new(iter: Iter) -> LineColIterator<Iter> {
LineColIterator {
line: 1,
col: 0,
rdr: iter.peekable(),
}
}
fn peek(&mut self) -> Option<u8> {
match self.rdr.peek() {
None => None,
Some(&Ok(c)) => Some(c),
Some(&Err(_)) => None,
}
}
pub fn line(&self) -> usize { self.line }
pub fn col(&self) -> usize { self.col }
}
impl<Iter: Iterator<Item=io::Result<u8>>> Iterator for LineColIterator<Iter> {
type Item = io::Result<u8>;
fn next(&mut self) -> Option<io::Result<u8>> {
match self.rdr.next() {
None => None,
Some(Ok(b'\n')) => {
self.line += 1;
self.col = 0;
Some(Ok(b'\n'))
},
Some(Ok(c)) => {
self.col += 1;
Some(Ok(c))
},
Some(Err(e)) => Some(Err(e)),
}
}
}