rune/tests/iter.rs
Myrddin Dundragon 34a579332d 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.
2025-05-05 18:17:32 -04:00

44 lines
914 B
Rust

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));
}