Depending on a variable, I would like to iterate over a BTreeMap
forwards or in reverse like so (playground):
pub enum Direction {
Forwards,
Backwards,
}
pub fn main() {
use std::collections::BTreeMap;
let direction = Direction::Forwards;
// type inference lets us omit an explicit type signature (which
// would be `BTreeMap<&str, &str>` in this example).
let mut movie_reviews = BTreeMap::new();
// review some movies.
movie_reviews.insert("Office Space", "Deals with real issues in the workplace.");
movie_reviews.insert("Pulp Fiction", "Masterpiece.");
movie_reviews.insert("The Godfather", "Very enjoyable.");
movie_reviews.insert("The Blues Brothers", "Eye lyked it a lot.");
let iter = match direction {
Direction::Forwards => movie_reviews.iter_mut(),
Direction::Backwards => movie_reviews.iter_mut().rev(),
};
for (title, desc) in iter {
println!("{}: {}", title, desc)
}
}
However the match doesn't have the same type and errors:
error[E0308]: `match` arms have incompatible types
--> src/main.rs:23:33
|
21 | let iter = match direction {
| ________________-
22 | | Direction::Forwards => movie_reviews.iter_mut(),
| | ------------------------ this is found to be of type `std::collections::btree_map::IterMut<'_, &str, &str>`
23 | | Direction::Backwards => movie_reviews.iter_mut().rev(),
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::collections::btree_map::IterMut`, found struct `Rev`
24 | | };
| |_____- `match` arms have incompatible types
|
= note: expected type `std::collections::btree_map::IterMut<'_, _, _>`
found struct `Rev<std::collections::btree_map::IterMut<'_, _, _>>`
How can I dynamically decide which direction to iterate in?