use std::sync::Arc;
use crate::color::Color;
use crate::scales::value::LinetypeStep;
#[derive(Clone, Debug, PartialEq)]
pub enum OutputRange {
Numbers(Vec<f64>),
Strings(Vec<Arc<str>>),
Colors(Vec<Color>),
Linetypes(Vec<Arc<[LinetypeStep]>>),
}
impl OutputRange {
pub fn len(&self) -> usize {
match self {
OutputRange::Numbers(v) => v.len(),
OutputRange::Strings(v) => v.len(),
OutputRange::Colors(v) => v.len(),
OutputRange::Linetypes(v) => v.len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn numbers_len_and_emptiness() {
let r = OutputRange::Numbers(vec![1.0, 2.0, 3.0]);
assert_eq!(r.len(), 3);
assert!(!r.is_empty());
let e = OutputRange::Numbers(vec![]);
assert_eq!(e.len(), 0);
assert!(e.is_empty());
}
#[test]
fn strings_eq() {
let a = OutputRange::Strings(vec![Arc::from("a"), Arc::from("b")]);
let b = OutputRange::Strings(vec![Arc::from("a"), Arc::from("b")]);
assert_eq!(a, b);
}
#[test]
fn colors_eq() {
let a = OutputRange::Colors(vec![Color::new([1.0, 0.0, 0.0, 1.0])]);
let b = OutputRange::Colors(vec![Color::new([1.0, 0.0, 0.0, 1.0])]);
assert_eq!(a, b);
}
#[test]
fn distinct_variants_not_equal() {
let n = OutputRange::Numbers(vec![1.0]);
let s = OutputRange::Strings(vec![Arc::from("1")]);
assert_ne!(n, s);
}
}