https://github.com/weezy20/better_peekable
A lightweight iterator adaptor to allow peeking N items ahead using a VecDeque.
https://github.com/weezy20/better_peekable
iterator lexer parser peek rust tokenizer
Last synced: 1 day ago
JSON representation
A lightweight iterator adaptor to allow peeking N items ahead using a VecDeque.
- Host: GitHub
- URL: https://github.com/weezy20/better_peekable
- Owner: weezy20
- License: apache-2.0
- Created: 2022-04-17T17:32:58.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2022-04-29T17:48:25.000Z (over 3 years ago)
- Last Synced: 2025-09-06T05:36:31.107Z (about 1 month ago)
- Topics: iterator, lexer, parser, peek, rust, tokenizer
- Language: Rust
- Homepage: https://crates.io/crates/better_peekable
- Size: 26.4 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# A Better Peekable
This crate provides a trait `BetterPeekable` and a type `BPeekable` which is a wrapper over an iterator and returned by calling `better_peekable()` on any `Iterator`. You can call the usual iterator methods on `BPeekable` just like `next()` on `I`. You can also call methods like `next_back`,`size_hint` and `rposition` and everything else from `DoubleEndedIterator` in addition to `peek` and `peek_n`.
`peek` gives you a reference to the immediately available item to be consumed by a `next()` call, whereas `peek_n` allows you to peek `n` times ahead. Calling `peek_n(0)` is the same as calling `peek`.
`peek` and `peek_n` are idempotent which means calling them repeatedly on `BPeekable` should have no effects on the underlying iterator or any state of `BPeekable`. If you find a bug that violates this contract, please open an issue.
## Usage
Add to `better_peekable` to your `Cargo.toml`.
```toml
[dependencies]
better_peekable = "0.2.4"
```We are going to test the idempotence of `BPeekable` using the following sequence of `peek` and `peek_n` calls.
```rust
// Required for peek and peek_n
use better_peekable::BetterPeekable;fn main() {
let vec = vec![
String::from("Hello"),
String::from("World"),
String::from("It's a nice day to make"),
String::from("A better peekable iterator adaptor"),
String::from("Peek_N and Peek are supposed to be"),
String::from("Idempotent Methods"),
];let mut iter = vec.into_iter();
let mut better_peeker = iter.better_peekable();
assert_eq!(better_peeker.peek(), Some(&"Hello".to_string()));
assert_eq!(better_peeker.peek(), Some(&"Hello".to_string()));
assert_eq!(better_peeker.peek(), Some(&"Hello".to_string()));
assert_eq!(better_peeker.peek_n(1), Some(&"World".to_string()));
assert_eq!(better_peeker.next(), Some("Hello".to_string()));
assert_eq!(better_peeker.next(), Some("World".to_string()));
assert_eq!(
better_peeker.peek(),
Some(&"It's a nice day to make".to_string())
);
assert_eq!(
better_peeker.peek_n(0),
Some(&"It's a nice day to make".to_string())
);
assert_eq!(
better_peeker.peek_n(1),
Some(&"A better peekable iterator adaptor".to_string())
);
assert_eq!(
better_peeker.nth(1),
Some("A better peekable iterator adaptor".to_string())
);
assert_eq!(
better_peeker.peek_n(1),
Some(&"Idempotent Methods".to_string())
);
```### Changelog 0.2.4 :
Removed trait bound `std::fmt::Debug` bound from `Iterator::Item`