diff --git a/src/card.rs b/src/card.rs index d1595ad..5694669 100644 --- a/src/card.rs +++ b/src/card.rs @@ -160,13 +160,30 @@ impl Card { pub fn flip(self, flip: FlipDir) -> Self { let mut new_card = Self::default(); + let transform = match flip { + FlipDir::Horizontal => |cell: Cell| match cell { + Cell::NW => Cell::NE, + Cell::NE => Cell::NW, + Cell::SW => Cell::SE, + Cell::SE => Cell::SW, + other => other, + }, + FlipDir::Vertical => |cell: Cell| match cell { + Cell::NW => Cell::SW, + Cell::NE => Cell::SE, + Cell::SW => Cell::NW, + Cell::SE => Cell::NE, + other => other, + }, + }; + // Check for doors macro_rules! assign_cell { ( ($source_dir:ident, $source_index:literal), ($dest_dir:ident, $dest_index:literal), $repeat:expr ) => { - new_card.cells[$dest_index] = self.cells[$source_index]; + new_card.cells[$dest_index] = transform(self.cells[$source_index]); new_card.$dest_dir = self.$source_dir; if $repeat == true { - new_card.cells[$source_index] = self.cells[$dest_index]; + new_card.cells[$source_index] = transform(self.cells[$dest_index]); new_card.$source_dir = self.$dest_dir; } }; @@ -189,7 +206,7 @@ impl Card { } } - new_card.cells[4] = self.cells[4]; + new_card.cells[4] = transform(self.cells[4]); new_card } @@ -251,38 +268,55 @@ impl Card { pub fn rotate(self, dir: RotationDir) -> Self { let mut new_card = Self::default(); + let transform = match dir { + RotationDir::Clockwise => |cell: Cell| match cell { + Cell::NW => Cell::NE, + Cell::NE => Cell::SE, + Cell::SE => Cell::SW, + Cell::SW => Cell::NW, + other => other, + }, + RotationDir::CounterClockwise => |cell: Cell| match cell { + Cell::NW => Cell::SW, + Cell::SW => Cell::SE, + Cell::SE => Cell::NW, + Cell::NE => Cell::NW, + other => other, + }, + }; + // Check for doors macro_rules! assign_cell { ( ($source_dir:ident, $source_index:literal), ($dest_dir:ident, $dest_index:literal) ) => { - new_card.cells[$dest_index] = self.cells[$source_index]; + new_card.cells[$dest_index] = transform(self.cells[$source_index]); new_card.$dest_dir = self.$source_dir; }; } match dir { RotationDir::Clockwise => { - assign_cell!((nw, 0), (n, 1)); - assign_cell!((n, 1), (ne, 2)); - assign_cell!((ne, 2), (e, 5)); - assign_cell!((e, 5), (se, 8)); - assign_cell!((se, 8), (s, 7)); - assign_cell!((s, 7), (sw, 6)); - assign_cell!((sw, 6), (w, 3)); - assign_cell!((w, 3), (nw, 0)); + assign_cell!((nw, 0), (ne, 2)); + assign_cell!((n, 1), (e, 5)); + assign_cell!((ne, 2), (se, 8)); + assign_cell!((e, 5), (s, 7)); + assign_cell!((se, 8), (sw, 6)); + assign_cell!((s, 7), (w, 3)); + assign_cell!((sw, 6), (nw, 0)); + assign_cell!((w, 3), (n, 1)); } RotationDir::CounterClockwise => { - assign_cell!((nw, 0), (w, 3)); - assign_cell!((w, 3), (sw, 6)); - assign_cell!((sw, 6), (s, 7)); - assign_cell!((s, 7), (se, 8)); - assign_cell!((se, 8), (e, 5)); - assign_cell!((e, 5), (ne, 2)); - assign_cell!((ne, 2), (n, 1)); - assign_cell!((n, 1), (nw, 0)); + assign_cell!((nw, 0), (sw, 6)); + assign_cell!((w, 3), (s, 7)); + assign_cell!((sw, 6), (se, 8)); + assign_cell!((s, 7), (e, 5)); + assign_cell!((se, 8), (ne, 2)); + assign_cell!((e, 5), (n, 1)); + assign_cell!((ne, 2), (nw, 0)); + assign_cell!((n, 1), (w, 3)); } } - new_card.cells[4] = self.cells[4]; + new_card.cells[4] = transform(self.cells[4]); new_card } @@ -704,10 +738,8 @@ mod test { ..Default::default() }; - let (res_left, res_right) = left_shape.transpose( - right_shape, - TransposeSelection::Row(TransposeIndex::Third), - ); + let (res_left, res_right) = + left_shape.transpose(right_shape, TransposeSelection::Row(TransposeIndex::Third)); assert_eq!(res_left, expected_left); assert_eq!(res_right, expected_right); }