Skip to main content

flow_gate_core/transform/
unified.rs

1use crate::traits::Transform;
2
3use super::{
4    FASinhTransform, HyperlogTransform, LinearTransform, LogarithmicTransform, LogicleTransform,
5};
6
7#[derive(Clone, Copy, Debug, PartialEq)]
8pub enum TransformKind {
9    Logicle(LogicleTransform),
10    FASinh(FASinhTransform),
11    Logarithmic(LogarithmicTransform),
12    Linear(LinearTransform),
13    Hyperlog(HyperlogTransform),
14}
15
16impl Transform for TransformKind {
17    fn apply(&self, value: f64) -> f64 {
18        match self {
19            Self::Logicle(t) => t.apply(value),
20            Self::FASinh(t) => t.apply(value),
21            Self::Logarithmic(t) => t.apply(value),
22            Self::Linear(t) => t.apply(value),
23            Self::Hyperlog(t) => t.apply(value),
24        }
25    }
26
27    fn invert(&self, scaled: f64) -> f64 {
28        match self {
29            Self::Logicle(t) => t.invert(scaled),
30            Self::FASinh(t) => t.invert(scaled),
31            Self::Logarithmic(t) => t.invert(scaled),
32            Self::Linear(t) => t.invert(scaled),
33            Self::Hyperlog(t) => t.invert(scaled),
34        }
35    }
36
37    fn apply_batch(&self, values: &[f64], out: &mut [f64]) {
38        match self {
39            Self::Logicle(t) => t.apply_batch(values, out),
40            Self::FASinh(t) => t.apply_batch(values, out),
41            Self::Logarithmic(t) => t.apply_batch(values, out),
42            Self::Linear(t) => t.apply_batch(values, out),
43            Self::Hyperlog(t) => t.apply_batch(values, out),
44        }
45    }
46
47    fn transform_id(&self) -> &str {
48        match self {
49            Self::Logicle(t) => t.transform_id(),
50            Self::FASinh(t) => t.transform_id(),
51            Self::Logarithmic(t) => t.transform_id(),
52            Self::Linear(t) => t.transform_id(),
53            Self::Hyperlog(t) => t.transform_id(),
54        }
55    }
56}