#[derive(Debug)]
pub struct Scale {
    pub min: i64,
    pub max: i64,
    pub ticks: Vec<i64>,
}
impl Scale {
    pub fn new(mut min: i64, mut max: i64) -> Self {
        debug_assert!(min < max);
        if max < min + 3 {
            max += 2;
            min -= 2;
        }
        if min > 0 && (max - min) * 4 > max {
            min = 0;
        }
        let l = ((max - min) as f64).log10().floor() as u32;
        let d = 10i64.pow(l);
        min = min.div_euclid(d);
        let mut tick = min;
        let mut ticks = vec![tick];
        loop {
            tick += d;
            ticks.push(tick);
            if tick > max {
                break;
            }
        }
        max = ticks[ticks.len() - 1];
        Self { min, max, ticks }
    }
    pub fn range(&self) -> i64 {
        self.max - self.min
    }
}
