]> git.lizzy.rs Git - rust.git/commit - src/tools/rustfmt
Auto merge of #79895 - Kerollmops:slice-group-by, r=m-ou-se
authorbors <bors@rust-lang.org>
Thu, 31 Dec 2020 12:00:43 +0000 (12:00 +0000)
committerbors <bors@rust-lang.org>
Thu, 31 Dec 2020 12:00:43 +0000 (12:00 +0000)
commitb33e234155b33ab6bce280fb2445b62b68622b61
tree7bc7745058308478e364ed6cd20e2d5913305f9d
parenta6bd5246da7806786b5c1f61d05a957c9ae68903
parent8b53be660444d736bb6a6e1c6ba42c8180c968e7
Auto merge of #79895 - Kerollmops:slice-group-by, r=m-ou-se

The return of the GroupBy and GroupByMut iterators on slice

According to https://github.com/rust-lang/rfcs/pull/2477#issuecomment-742034372, I am opening this PR again, this time I implemented it in safe Rust only, it is therefore much easier to read and is completely safe.

This PR proposes to add two new methods to the slice, the `group_by` and `group_by_mut`. These two methods provide a way to iterate over non-overlapping sub-slices of a base slice that are separated by the predicate given by the user (e.g. `Partial::eq`, `|a, b| a.abs() < b.abs()`).

```rust
let slice = &[1, 1, 1, 3, 3, 2, 2, 2];

let mut iter = slice.group_by(|a, b| a == b);
assert_eq!(iter.next(), Some(&[1, 1, 1][..]));
assert_eq!(iter.next(), Some(&[3, 3][..]));
assert_eq!(iter.next(), Some(&[2, 2, 2][..]));
assert_eq!(iter.next(), None);
```

[An RFC](https://github.com/rust-lang/rfcs/pull/2477) was open 2 years ago but wasn't necessary.
library/alloc/src/lib.rs
library/alloc/tests/lib.rs
library/core/src/slice/mod.rs
library/core/tests/lib.rs