Added a Lookahead iterator.
This adds a Lookahead iterator so that while parsing it is easier to peek ahead however much the parser needs. Basic parsers may not need any, but a lot of parsers have two token lookahead. I've even seen some with three.
This commit is contained in:
43
tests/iter.rs
Normal file
43
tests/iter.rs
Normal file
@ -0,0 +1,43 @@
|
||||
use rune::*;
|
||||
|
||||
#[test]
|
||||
fn peek_works()
|
||||
{
|
||||
let mut it = vec![1, 2, 3].into_iter().lookahead();
|
||||
assert_eq!(it.peek(0), Some(&1));
|
||||
assert_eq!(it.peek(1), Some(&2));
|
||||
assert_eq!(it.peek(2), Some(&3));
|
||||
assert_eq!(it.peek(3), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn peek_mut_modifies_item()
|
||||
{
|
||||
let mut it = vec![10, 20, 30].into_iter().lookahead();
|
||||
if let Some(x) = it.peek_mut(1)
|
||||
{
|
||||
*x += 100;
|
||||
}
|
||||
assert_eq!(it.next(), Some(10));
|
||||
assert_eq!(it.next(), Some(120));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn iterates_correctly()
|
||||
{
|
||||
let mut it = vec![1, 2, 3].into_iter().lookahead();
|
||||
assert_eq!(it.next(), Some(1));
|
||||
assert_eq!(it.next(), Some(2));
|
||||
assert_eq!(it.next(), Some(3));
|
||||
assert_eq!(it.next(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn size_hint_accounts_for_buffer()
|
||||
{
|
||||
let mut it = vec![1, 2, 3, 4].into_iter().lookahead();
|
||||
it.peek(2);
|
||||
let (low, high) = it.size_hint();
|
||||
assert!(low >= 4);
|
||||
assert_eq!(high, Some(4));
|
||||
}
|
Reference in New Issue
Block a user