Advent of Rust Day 3 - Option as an Iterator
This is a series where I’ll be discussing interesting Rust tidbits that I encounter when solving Advent of Code 2017.
You can find the complete (spoiler) solution here: udoprog/rust-advent-of-code-2017
Option can be used as an Iterator:
fn cell_value(storage: &HashMap<(i64, i64), u64>, x: i64, y: i64) -> u64 {
[
&(x - 1, y - 1), &(x , y - 1), &(x + 1, y - 1),
&(x - 1, y ), /* (x, y) */ &(x + 1, y ),
&(x - 1, y + 1), &(x , y + 1), &(x + 1, y + 1),
].into_iter().flat_map(|k| storage.get(k)).map(|v| *v).sum()
}
Note that storage.get(k) returns an Option, And the flat_map closure returns U:
IntoIterator.
Option implements IntoIterator, which for None is an empty iterator, and Some(T) is an
iterator with a single item. You can see that in action for the Item struct which is used to
implement this behavior: https://doc.rust-lang.org/src/core/option.rs.html#912