cursive/src/xy.rs

75 lines
1.9 KiB
Rust
Raw Normal View History

2016-07-14 04:30:30 +00:00
use orientation::Orientation;
2016-07-13 04:01:11 +00:00
use std::iter;
/// A generic structure with a value for each axis.
#[derive(Debug,Clone,Copy,PartialEq)]
pub struct XY<T> {
/// X-axis value
pub x: T,
/// Y-axis value
pub y: T,
}
2016-07-13 04:33:50 +00:00
impl<T> XY<T> {
2016-07-13 04:01:11 +00:00
/// Creates a new `XY` from the given values.
pub fn new(x: T, y: T) -> Self {
2016-07-13 04:33:50 +00:00
XY { x: x, y: y }
2016-07-13 04:01:11 +00:00
}
2016-07-13 08:19:05 +00:00
/// Creates a new `XY` by applying `f` to `x` and `y`.
pub fn map<U, F: Fn(T) -> U>(self, f: F) -> XY<U> {
XY::new(f(self.x), f(self.y))
}
2016-07-13 04:01:11 +00:00
/// Destructure self into a pair.
pub fn pair(self) -> (T, T) {
(self.x, self.y)
}
/// Return a XY with references to this one's values.
pub fn as_ref(&self) -> XY<&T> {
XY::new(&self.x, &self.y)
}
/// Creates an iterator that returns references to `x`, then `y`.
pub fn iter(&self) -> iter::Chain<iter::Once<&T>, iter::Once<&T>> {
iter::once(&self.x).chain(iter::once(&self.y))
}
2016-07-14 04:30:30 +00:00
/// Returns a reference to the value on the given axis.
pub fn get(&self, o: Orientation) -> &T {
match o {
Orientation::Horizontal => &self.x,
Orientation::Vertical => &self.y,
}
}
/// Returns a new XY by calling `f` on `self` and `other` for each axis.
pub fn zip_map<U,V,F: Fn(T,U) -> V>(self, other: XY<U>, f: F) -> XY<V> {
XY::new(f(self.x, other.x),
f(self.y, other.y))
}
}
impl <T> XY<Option<T>> {
/// Returns a new XY by calling `unwrap_or` on each axis.
pub fn unwrap_or(self, other: XY<T>) -> XY<T> {
self.zip_map(other, |s, o| s.unwrap_or(o))
}
2016-07-13 04:01:11 +00:00
}
2016-07-13 04:33:50 +00:00
impl<T: Copy> XY<T> {
2016-07-13 04:01:11 +00:00
/// Creates a `XY` with both `x` and `y` set to `value`.
pub fn both(value: T) -> Self {
XY::new(value, value)
}
}
2016-07-13 04:33:50 +00:00
impl<T> From<(T, T)> for XY<T> {
2016-07-13 04:01:11 +00:00
fn from((x, y): (T, T)) -> Self {
XY::new(x, y)
}
}