1use std::borrow::Cow;
4
5use derive_more::{AsMut, AsRef, From, Into};
6use nalgebra as na;
7
8use crate::Iris;
9
10#[derive(From, Clone, Copy, Debug, PartialEq, AsRef, AsMut, Into)]
12pub struct UnclassifiedIris(na::SVector<f32, 4>);
13
14impl UnclassifiedIris {
15 pub fn as_na_svec(&self) -> &na::SVector<f32, 4> {
16 &self.0
17 }
18 pub fn as_na_svec_mut(&mut self) -> &mut na::SVector<f32, 4> {
19 &mut self.0
20 }
21}
22
23impl From<[f32; 4]> for UnclassifiedIris {
25 fn from(value: [f32; 4]) -> Self {
26 na::SVector::from(value).into()
27 }
28}
29impl From<FlatUnclassifiedIris> for UnclassifiedIris {
31 fn from(record: FlatUnclassifiedIris) -> Self {
32 let arr: [f32; 4] = record.into();
33 arr.into()
34 }
35}
36impl<'de> serde::Deserialize<'de> for UnclassifiedIris {
38 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39 where
40 D: serde::Deserializer<'de>,
41 {
42 FlatUnclassifiedIris::deserialize(deserializer).map(Self::from)
43 }
44}
45
46impl Iris for UnclassifiedIris {
48 fn sepal_length(&self) -> f32 {
49 self.0.x
50 }
51
52 fn sepal_width(&self) -> f32 {
53 self.0.y
54 }
55
56 fn petal_length(&self) -> f32 {
57 self.0.z
58 }
59
60 fn petal_width(&self) -> f32 {
61 self.0.w
62 }
63}
64
65impl tabled::Tabled for UnclassifiedIris {
67 const LENGTH: usize = FlatUnclassifiedIris::LENGTH;
68
69 fn headers() -> Vec<std::borrow::Cow<'static, str>> {
70 FlatUnclassifiedIris::headers()
71 }
72
73 fn fields(&self) -> Vec<std::borrow::Cow<'_, str>> {
74 FlatUnclassifiedIris::from(*self)
75 .fields()
76 .into_iter()
77 .map(Cow::into_owned)
78 .map(Cow::from)
79 .collect()
80 }
81}
82
83impl From<UnclassifiedIris> for [f32; 4] {
85 fn from(value: UnclassifiedIris) -> Self {
86 value.0.into()
87 }
88}
89
90pub use flat::FlatUnclassifiedIris;
91pub mod flat;