Skip to content

Instantly share code, notes, and snippets.

@rust-play
Created August 15, 2020 09:47
Show Gist options
  • Save rust-play/5176f1d24bfac73688995f051de4f721 to your computer and use it in GitHub Desktop.
Save rust-play/5176f1d24bfac73688995f051de4f721 to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
#![allow(unused)]
fn main() {
}
// modifies v in place to drain all items for which the filter is true
// returns a vector with all elements which have been drained
fn drain_filter<T, F>(v: &mut Vec<T>, f: F) -> Vec<T>
where
F: Fn(&T) -> bool,
{
let mut drained_elements = Vec::new();
let mut idx = 0;
let mut len = v.len();
while idx < len {
if f(v.get(idx).unwrap()) {
drained_elements.push(v.remove(idx));
len -= 1;
} else {
idx += 1;
}
}
drained_elements
}
#[test]
fn drain_filter_empty() {
// Arrange
let mut vec: Vec<i32> = vec![];
// Act
let drained_vec = drain_filter(&mut vec, |&x| x > 10);
// Assert
assert_eq!(vec, vec![]);
assert_eq!(drained_vec, vec![]);
}
#[test]
fn drain_filter_all() {
// Arrange
let mut vec: Vec<i32> = vec![11, 12, 13];
// Act
let drained_vec = drain_filter(&mut vec, |&x| x > 10);
// Assert
assert_eq!(vec, vec![]);
assert_eq!(drained_vec, vec![11, 12, 13]);
}
#[test]
fn drain_filter_none() {
// Arrange
let mut vec: Vec<i32> = vec![11, 12, 13];
// Act
let drained_vec = drain_filter(&mut vec, |&x| x < 10);
// Assert
assert_eq!(vec, vec![11, 12, 13]);
assert_eq!(drained_vec, vec![]);
}
#[test]
fn drain_filter_some() {
// Arrange
let mut vec: Vec<i32> = vec![11, 12, 13, 20, 21, 5, 2, 50];
// Act
let drained_vec = drain_filter(&mut vec, |&x| x < 15);
// Assert
assert_eq!(vec, vec![20, 21, 50]);
assert_eq!(drained_vec, vec![11, 12, 13, 5, 2]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment