use avin_utils as utils;
#[derive(Debug)]
pub struct Range {
pub from: f64,
pub till: f64,
}
impl Range {
pub fn new(from: f64, till: f64) -> Self {
Range { from, till }
}
pub fn min(&self) -> f64 {
if self.from < self.till {
self.from
} else {
self.till
}
}
pub fn max(&self) -> f64 {
if self.from > self.till {
self.from
} else {
self.till
}
}
pub fn mid(&self) -> f64 {
let min = self.min();
let max = self.max();
let half = (max - min) / 2.0;
min + half
}
pub fn contains(&self, value: f64) -> bool {
self.from <= value && value <= self.till
}
pub fn abs(&self) -> f64 {
self.max() - self.min()
}
pub fn abs_n(&self) -> f64 {
let mn = self.min();
let mx = self.max();
(mx - mn) / mx
}
pub fn abs_p(&self) -> f64 {
let mn = self.min();
let mx = self.max();
let value = (mx - mn) / mx * 100.0;
utils::round(value, 2)
}
pub fn delta(&self) -> f64 {
self.till - self.from
}
pub fn delta_n(&self) -> f64 {
(self.till - self.from) / self.from
}
pub fn delta_p(&self) -> f64 {
let value = (self.till - self.from) / self.from * 100.0;
utils::round(value, 2)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn max() {
let r = Range::new(100.0, 110.0);
assert_eq!(r.max(), 110.0);
}
#[test]
fn min() {
let r = Range::new(100.0, 110.0);
assert_eq!(r.min(), 100.0);
}
#[test]
fn mid() {
let r = Range::new(100.0, 110.0);
assert_eq!(r.mid(), 105.0);
}
#[test]
fn abs() {
let r = Range::new(5000.0, 4000.0);
assert_eq!(r.abs(), 1000.0);
assert_eq!(r.abs_n(), 0.2);
assert_eq!(r.abs_p(), 20.0);
}
#[test]
fn delta() {
let r = Range::new(5000.0, 4000.0);
assert_eq!(r.delta(), -1000.0);
assert_eq!(r.delta_n(), -0.2);
assert_eq!(r.delta_p(), -20.0);
}
}