Skip to content

Commit

Permalink
Merge #511
Browse files Browse the repository at this point in the history
511: Implement partition_result r=jswrenn a=mingyli

Addresses #510 

`partition_result` behaves as [OCaml Base's `partition_result`](https://ocaml.janestreet.com/ocaml-core/latest/doc/base/Base/List/index.html#val-partition_result) does:

```rust
use itertools::Itertools;

let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)];

let (successes, failures): (Vec<_>, Vec<_>) = successes_and_failures
    .into_iter()
    .partition_result();

assert_eq!(successes, [1, 2]);
assert_eq!(failures, [false, true]);
```

Co-authored-by: Ming <mingyli34@gmail.com>
  • Loading branch information
bors[bot] and mingyli committed Jan 16, 2021
2 parents f6226e7 + 5c86c2c commit 2d52ca2
Showing 1 changed file with 27 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/lib.rs
Expand Up @@ -2529,6 +2529,33 @@ pub trait Itertools : Iterator {
(left, right)
}

/// Partition a sequence of `Result`s into one list of all the `Ok` elements
/// and another list of all the `Err` elements.
///
/// ```
/// use itertools::Itertools;
///
/// let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)];
///
/// let (successes, failures): (Vec<_>, Vec<_>) = successes_and_failures
/// .into_iter()
/// .partition_result();
///
/// assert_eq!(successes, [1, 2]);
/// assert_eq!(failures, [false, true]);
/// ```
fn partition_result<A, B, T, E>(self) -> (A, B)
where
Self: Iterator<Item = Result<T, E>> + Sized,
A: Default + Extend<T>,
B: Default + Extend<E>,
{
self.partition_map(|r| match r {
Ok(v) => Either::Left(v),
Err(v) => Either::Right(v),
})
}

/// Return a `HashMap` of keys mapped to `Vec`s of values. Keys and values
/// are taken from `(Key, Value)` tuple pairs yielded by the input iterator.
///
Expand Down

0 comments on commit 2d52ca2

Please sign in to comment.