reda_spice/model/
value.rs1use reda_unit::{Complex, Number, Unit, UnitComplex, UnitNumber};
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum Value {
5 Real(Number),
6 Complex(Complex),
7}
8
9impl Value {
10 pub fn real<V: Into<Number>>(v: V) -> Self {
11 Self::Real(v.into())
12 }
13
14 pub fn complex<V1: Into<Number>, V2: Into<Number>>(re: V1, im: V2) -> Self {
15 Self::Complex(Complex::new(re.into(), im.into()))
16 }
17}
18
19impl Value {
20 pub fn extract_numbers(values: &[Self]) -> Option<Vec<Number>> {
21 let mut numbers = Vec::new();
22 for v in values.iter() {
23 match v {
24 Value::Real(r) => numbers.push(*r),
25 Value::Complex(_) => return None,
26 }
27 }
28 Some(numbers)
29 }
30
31 pub fn extract_complexs(values: &[Self]) -> Option<Vec<Complex>> {
32 let mut complexs = Vec::new();
33 for v in values.iter() {
34 match v {
35 Value::Real(_) => return None,
36 Value::Complex(c) => complexs.push(*c),
37 }
38 }
39 Some(complexs)
40 }
41
42 pub fn extract_units<U: Unit>(values: &[Self]) -> Option<Vec<UnitNumber<U>>> {
43 let mut numbers = Vec::new();
44 for v in values.iter() {
45 match v {
46 Value::Real(r) => numbers.push(UnitNumber::new(*r)),
47 Value::Complex(_) => return None,
48 }
49 }
50 Some(numbers)
51 }
52
53 pub fn extract_unit_complexs<U: Unit>(values: &[Self]) -> Option<Vec<UnitComplex<U>>> {
54 let mut numbers = Vec::new();
55 for v in values.iter() {
56 match v {
57 Value::Real(_) => return None,
58 Value::Complex(c) => numbers.push(UnitComplex::new(c.re, c.im)),
59 }
60 }
61 Some(numbers)
62 }
63}