Skip to content

Instantly share code, notes, and snippets.

@bxt
Last active December 13, 2022 18:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bxt/43b8b6af3b0bf3b712f8fa12c465964d to your computer and use it in GitHub Desktop.
Save bxt/43b8b6af3b0bf3b712f8fa12c465964d to your computer and use it in GitHub Desktop.
Using a peekable iterator in a function in Rust
use std::iter::Peekable;
fn take_when_3(peeky: &mut Peekable<impl Iterator<Item = u8>>) -> Option<u8> {
if let Some(3) = peeky.peek() {
peeky.next()
} else {
None
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let iter = vec![5, 3u8, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6].into_iter();
let mut peeky = iter.peekable();
println!("iter: {peeky:?}");
println!("taking: {:?}", peeky.next());
println!("iter: {peeky:?}");
println!("take_when_3: {:?}", take_when_3(&mut peeky));
println!("iter: {peeky:?}");
println!("take_when_3: {:?}", take_when_3(&mut peeky));
println!("iter: {peeky:?}");
println!("taking: {:?}", peeky.next());
println!("iter: {peeky:?}");
Ok(())
}
// The peekable peeked state is persistant and the peeked item get returned next.
// Output:
//
// iter: Peekable { iter: IntoIter([5, 3, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6]), peeked: None }
// taking: Some(5)
// iter: Peekable { iter: IntoIter([3, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6]), peeked: None }
// take_when_3: Some(3)
// iter: Peekable { iter: IntoIter([1, 2, 3, 4, 5, 5, 1, 5, 6, 6]), peeked: None }
// take_when_3: None
// iter: Peekable { iter: IntoIter([2, 3, 4, 5, 5, 1, 5, 6, 6]), peeked: Some(Some(1)) }
// taking: Some(1)
// iter: Peekable { iter: IntoIter([2, 3, 4, 5, 5, 1, 5, 6, 6]), peeked: None }
fn take_when_3(iter: &mut dyn Iterator<Item = u8>) -> Option<u8> {
let mut peeky = iter.peekable();
if let Some(3) = peeky.peek() {
peeky.next()
} else {
None
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut iter = vec![5, 3u8, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6].into_iter();
println!("iter: {iter:?}");
println!("taking: {:?}", iter.next());
println!("iter: {iter:?}");
println!("take_when_3: {:?}", take_when_3(&mut iter));
println!("iter: {iter:?}");
println!("take_when_3: {:?}", take_when_3(&mut iter));
println!("iter: {iter:?}");
println!("taking: {:?}", iter.next());
println!("iter: {iter:?}");
Ok(())
}
// The peekable still takes away from the iterator.
// Output:
//
// iter: IntoIter([5, 3, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6])
// taking: Some(5)
// iter: IntoIter([3, 1, 2, 3, 4, 5, 5, 1, 5, 6, 6])
// take_when_3: Some(3)
// iter: IntoIter([1, 2, 3, 4, 5, 5, 1, 5, 6, 6])
// take_when_3: None
// iter: IntoIter([2, 3, 4, 5, 5, 1, 5, 6, 6])
// taking: Some(2)
// iter: IntoIter([3, 4, 5, 5, 1, 5, 6, 6])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment