1use crate::dual::{Dual, Dual2, Number};
2use chrono::{DateTime, NaiveDateTime};
3use indexmap::IndexMap;
4use serde::{Deserialize, Serialize};
5use std::cmp::PartialEq;
6
7#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
9pub enum Nodes {
10 F64(IndexMap<NaiveDateTime, f64>),
11 Dual(IndexMap<NaiveDateTime, Dual>),
12 Dual2(IndexMap<NaiveDateTime, Dual2>),
13}
14
15#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
16pub enum NodesTimestamp {
17 F64(IndexMap<i64, f64>),
18 Dual(IndexMap<i64, Dual>),
19 Dual2(IndexMap<i64, Dual2>),
20}
21
22impl NodesTimestamp {
23 pub fn first_key(&self) -> i64 {
24 match self {
25 NodesTimestamp::F64(m) => *m.first().unwrap().0,
26 NodesTimestamp::Dual(m) => *m.first().unwrap().0,
27 NodesTimestamp::Dual2(m) => *m.first().unwrap().0,
28 }
29 }
30}
31
32impl From<Nodes> for NodesTimestamp {
33 fn from(value: Nodes) -> Self {
34 match value {
35 Nodes::F64(m) => NodesTimestamp::F64(IndexMap::from_iter(
36 m.into_iter().map(|(k, v)| (k.and_utc().timestamp(), v)),
37 )),
38 Nodes::Dual(m) => NodesTimestamp::Dual(IndexMap::from_iter(
39 m.into_iter().map(|(k, v)| (k.and_utc().timestamp(), v)),
40 )),
41 Nodes::Dual2(m) => NodesTimestamp::Dual2(IndexMap::from_iter(
42 m.into_iter().map(|(k, v)| (k.and_utc().timestamp(), v)),
43 )),
44 }
45 }
46}
47
48impl From<NodesTimestamp> for Nodes {
49 fn from(value: NodesTimestamp) -> Self {
50 match value {
51 NodesTimestamp::F64(m) => {
52 Nodes::F64(IndexMap::from_iter(m.into_iter().map(|(k, v)| {
53 (DateTime::from_timestamp(k, 0).unwrap().naive_utc(), v)
54 })))
55 }
56 NodesTimestamp::Dual(m) => {
57 Nodes::Dual(IndexMap::from_iter(m.into_iter().map(|(k, v)| {
58 (DateTime::from_timestamp(k, 0).unwrap().naive_utc(), v)
59 })))
60 }
61 NodesTimestamp::Dual2(m) => {
62 Nodes::Dual2(IndexMap::from_iter(m.into_iter().map(|(k, v)| {
63 (DateTime::from_timestamp(k, 0).unwrap().naive_utc(), v)
64 })))
65 }
66 }
67 }
68}
69
70impl NodesTimestamp {
71 pub(crate) fn sort_keys(&mut self) {
80 match self {
81 NodesTimestamp::F64(m) => m.sort_keys(),
82 NodesTimestamp::Dual(m) => m.sort_keys(),
83 NodesTimestamp::Dual2(m) => m.sort_keys(),
84 }
85 }
86
87 pub(crate) fn keys(&self) -> Vec<i64> {
88 match self {
89 NodesTimestamp::F64(m) => m.keys().cloned().collect(),
90 NodesTimestamp::Dual(m) => m.keys().cloned().collect(),
91 NodesTimestamp::Dual2(m) => m.keys().cloned().collect(),
92 }
93 }
94
95 pub(crate) fn index_map(&self) -> IndexMap<NaiveDateTime, Number> {
96 macro_rules! create_map {
97 ($map:ident, $Variant:ident) => {
98 IndexMap::from_iter($map.clone().into_iter().map(|(k, v)| {
99 (
100 DateTime::from_timestamp(k, 0).unwrap().naive_utc(),
101 Number::$Variant(v),
102 )
103 }))
104 };
105 }
106
107 match self {
108 NodesTimestamp::F64(m) => create_map!(m, F64),
109 NodesTimestamp::Dual(m) => create_map!(m, Dual),
110 NodesTimestamp::Dual2(m) => create_map!(m, Dual2),
111 }
112 }
113}
114
115