Last active
December 13, 2022 18:32
-
-
Save bxt/43b8b6af3b0bf3b712f8fa12c465964d to your computer and use it in GitHub Desktop.
Using a peekable iterator in a function in Rust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 } | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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