use super::Position;
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Hash)]
pub struct Offset {
pub x: u16,
pub y: u16,
}
impl Offset {
pub const ZERO: Offset = Offset { x: 0, y: 0 };
pub fn new(x: u16, y: u16) -> Self {
Self { x, y }
}
pub fn add_position(&self, position: Position) -> Position {
Position {
column: position.column + self.x,
row: position.row + self.y,
}
}
pub fn sub_position(&self, position: Position) -> Position {
Position {
column: position.column - self.x,
row: position.row - self.y,
}
}
pub fn try_add_position(&self, position: Position) -> Option<Position> {
let x = position.column.checked_add(self.x)?;
let y = position.row.checked_add(self.y)?;
Some(Position::new(x, y))
}
pub fn try_sub_position(&self, position: Position) -> Option<Position> {
let x = position.column.checked_sub(self.x)?;
let y = position.row.checked_sub(self.y)?;
Some(Position::new(x, y))
}
}