use std::fmt::Display;
#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)]
pub struct Position {
x: f64,
y: f64,
}
impl Position {
#[must_use]
pub const fn new(x: f64, y: f64) -> Self {
Self {
x,
y,
}
}
#[must_use]
pub const fn x(&self) -> f64 {
self.x
}
#[must_use]
pub const fn y(&self) -> f64 {
self.y
}
}
impl Display for Position {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("({}, {})", self.x, self.y))
}
}
impl From<(f64, f64)> for Position {
fn from(value: (f64, f64)) -> Self {
Self::new(value.0, value.1)
}
}
impl From<(f32, f32)> for Position {
fn from(value: (f32, f32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i8, i8)> for Position {
fn from(value: (i8, i8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i16, i16)> for Position {
fn from(value: (i16, i16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i32, i32)> for Position {
fn from(value: (i32, i32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i64, i64)> for Position {
fn from(value: (i64, i64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(isize, isize)> for Position {
fn from(value: (isize, isize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u8, i8)> for Position {
fn from(value: (u8, i8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u16, i16)> for Position {
fn from(value: (u16, i16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u32, i32)> for Position {
fn from(value: (u32, i32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u64, i64)> for Position {
fn from(value: (u64, i64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(usize, isize)> for Position {
fn from(value: (usize, isize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i8, u8)> for Position {
fn from(value: (i8, u8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i16, u16)> for Position {
fn from(value: (i16, u16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i32, u32)> for Position {
fn from(value: (i32, u32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(i64, u64)> for Position {
fn from(value: (i64, u64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(isize, usize)> for Position {
fn from(value: (isize, usize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u8, u8)> for Position {
fn from(value: (u8, u8)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u16, u16)> for Position {
fn from(value: (u16, u16)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u32, u32)> for Position {
fn from(value: (u32, u32)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(u64, u64)> for Position {
fn from(value: (u64, u64)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}
impl From<(usize, usize)> for Position {
fn from(value: (usize, usize)) -> Self {
Self::new(value.0 as f64, value.1 as f64)
}
}