diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /third_party/rust/peeking_take_while/README.md | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/peeking_take_while/README.md')
-rw-r--r-- | third_party/rust/peeking_take_while/README.md | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/third_party/rust/peeking_take_while/README.md b/third_party/rust/peeking_take_while/README.md new file mode 100644 index 0000000000..c7486b724d --- /dev/null +++ b/third_party/rust/peeking_take_while/README.md @@ -0,0 +1,58 @@ +# `peeking_take_while` + +[![Build Status](https://travis-ci.org/fitzgen/peeking_take_while.png?branch=master)](https://travis-ci.org/fitzgen/peeking_take_while) + +Provides the `peeking_take_while` iterator adaptor method. + +The `peeking_take_while` method is very similar to `take_while`, but behaves +differently when used with a borrowed iterator (perhaps returned by +`Iterator::by_ref`). + +`peeking_take_while` peeks at the next item in the iterator and runs the +predicate on that peeked item. This avoids consuming the first item yielded by +the underlying iterator for which the predicate returns `false`. On the other +hand, `take_while` will consume that first item for which the predicate returns +`false`, and it will be lost. + +```rust +extern crate peeking_take_while; + +// Bring the `peeking_take_while` method for peekable iterators into +// scope. +use peeking_take_while::PeekableExt; + +// Let's say we have two collections we want to iterate through: `xs` and +// `ys`. We want to perform one operation on all the leading contiguous +// elements that match some predicate, and a different thing with the rest of +// the elements. With the `xs`, we will use the normal `take_while`. With the +// `ys`, we will use `peeking_take_while`. + +let xs: Vec<u8> = (0..100).collect(); +let ys = xs.clone(); + +let mut iter_xs = xs.into_iter(); +let mut iter_ys = ys.into_iter().peekable(); + +{ + // Let's do one thing with all the items that are less than 10. + + let xs_less_than_ten = iter_xs.by_ref().take_while(|x| *x < 10); + for x in xs_less_than_ten { + do_things_with(x); + } + + let ys_less_than_ten = iter_ys.by_ref().peeking_take_while(|y| *y < 10); + for y in ys_less_than_ten { + do_things_with(y); + } +} + +// And now we will do some other thing with the items that are greater than +// or equal to 10. + +// ...except, when using plain old `take_while` we lost 10! +assert_eq!(iter_xs.next(), Some(11)); + +// However, when using `peeking_take_while` we did not! Great! +assert_eq!(iter_ys.next(), Some(10)); +``` |