2022-12-12 11:40:49 +01:00
use impl_ops ::* ;
use std ::{ ops , ops ::AddAssign } ;
pub const ALL_DIRECTIONS : [ Direction ; 4 ] = [ Direction ::Up , Direction ::Down , Direction ::Left , Direction ::Right ] ;
#[ derive(Clone, Copy, Debug) ]
pub enum Direction {
2022-12-22 20:22:42 +01:00
Right = 0 ,
Down = 1 ,
Left = 2 ,
Up = 3 ,
2022-12-12 11:40:49 +01:00
}
impl AddAssign < i8 > for Direction {
fn add_assign ( & mut self , rhs : i8 ) {
* self = * self + rhs ;
}
}
impl_op! ( + | a : Direction , b : i8 | -> Direction {
match b {
- 1 | 3 = > match a {
Direction ::Up = > Direction ::Left ,
Direction ::Right = > Direction ::Up ,
Direction ::Down = > Direction ::Right ,
Direction ::Left = > Direction ::Down ,
} ,
1 | - 3 = > match a {
Direction ::Up = > Direction ::Right ,
Direction ::Right = > Direction ::Down ,
Direction ::Down = > Direction ::Left ,
Direction ::Left = > Direction ::Up ,
} ,
0 | 4 | - 4 = > a ,
2 | - 2 = > match a {
Direction ::Up = > Direction ::Down ,
Direction ::Right = > Direction ::Left ,
Direction ::Down = > Direction ::Up ,
Direction ::Left = > Direction ::Right ,
} ,
2022-12-12 11:56:38 +01:00
n = > unreachable! ( " Illegal turn value: {n} " ) ,
2022-12-12 11:40:49 +01:00
}
} ) ;
impl Direction {
pub fn turn ( & mut self , turn_value : i64 ) {
* self + = turn_value as i8 ;
}
}