summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/rust/src/lib.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/rust/src/lib.rs b/lib/rust/src/lib.rs
index 25c82db..bfeaee4 100644
--- a/lib/rust/src/lib.rs
+++ b/lib/rust/src/lib.rs
@@ -8,6 +8,11 @@ impl<T> Grid<T> {
Grid { grid }
}
+ pub fn points(&self) -> impl Iterator<Item = (usize, usize)> {
+ (0..self.grid.len())
+ .flat_map(|y| (0..self.grid.first().unwrap_or(&Vec::new()).len()).map(move |x| (x, y)))
+ }
+
pub fn ray(&self, (x, y): (usize, usize), (dx, dy): (i64, i64)) -> impl Iterator<Item = &T> {
let (x, y) = (i64::try_from(x).unwrap(), i64::try_from(y).unwrap());
(0..)
@@ -23,6 +28,8 @@ impl<T> Grid<T> {
#[cfg(test)]
mod tests {
+ use std::collections::HashSet;
+
use super::*;
#[test]
@@ -31,6 +38,35 @@ mod tests {
}
#[test]
+ fn points_empty() {
+ let grid = Grid::<u64>::new(vec![vec![]]);
+ assert!(grid.points().eq(vec![]))
+ }
+
+ #[test]
+ fn points_equal_size() {
+ let grid = Grid::new(vec![vec![1, 2], vec![3, 4]]);
+ let points = grid.points().collect::<HashSet<_>>();
+ assert_eq!(
+ points,
+ [(0, 0), (0, 1), (1, 0), (1, 1)].iter().cloned().collect()
+ )
+ }
+
+ #[test]
+ fn points_unequal_size() {
+ let grid = Grid::new(vec![vec![1, 2], vec![3, 4], vec![5, 6]]);
+ let points = grid.points().collect::<HashSet<_>>();
+ assert_eq!(
+ points,
+ [(0, 0), (1, 0), (0, 1), (1, 1), (0, 2), (1, 2)]
+ .iter()
+ .cloned()
+ .collect()
+ )
+ }
+
+ #[test]
fn ray_empty() {
let grid = Grid::<u64>::new(vec![vec![]]);
assert!(grid.ray((1, 1), (1, 2)).eq(vec![].iter()))