1use crate::objects::*;
2use serde::Serialize;
3use serde_json::Value;
4use std::{collections::*, fmt::Display};
5
6pub(crate) trait ChartJsRsObject {
7 fn is_empty(&self) -> bool;
8}
9impl<T: Display> ChartJsRsObject for T {
10 fn is_empty(&self) -> bool {
11 self.to_string().is_empty()
12 }
13}
14
15pub trait DatasetTrait: Serialize + Default + Clone {
16 fn labels(self) -> Vec<NumberOrDateString>;
17}
18pub trait DatasetDataExt {
19 fn presorted_to_dataset_data(self) -> DatasetData;
20 fn unsorted_to_dataset_data(self) -> DatasetData;
21}
22
23impl<I> DatasetDataExt for I
24where
25 I: Iterator<Item = (NumberOrDateString, NumberString, Option<Value>)>,
26{
27 fn presorted_to_dataset_data(self) -> DatasetData {
28 DatasetData(serde_json::to_value(self.map(XYPoint::from).collect::<Vec<_>>()).unwrap())
29 }
30 fn unsorted_to_dataset_data(self) -> DatasetData {
31 DatasetData(serde_json::to_value(self.map(XYPoint::from).collect::<BTreeSet<_>>()).unwrap())
32 }
33}
34
35pub trait DatasetIterExt: Iterator {
36 fn into_data_iter<X, Y>(
37 self,
38 ) -> impl Iterator<Item = (NumberOrDateString, NumberString, Option<Value>)>
39 where
40 Self: Iterator<Item = (X, Y)> + Sized,
41 X: Into<NumberOrDateString>,
42 Y: Into<NumberString>,
43 {
44 self.map(|(x, y)| (x.into(), y.into(), None))
45 }
46 fn into_data_iter_with_description<X, Y, D>(
47 self,
48 ) -> impl Iterator<Item = (NumberOrDateString, NumberString, Option<Value>)>
49 where
50 Self: Iterator<Item = (X, Y, D)> + Sized,
51 X: Into<NumberOrDateString>,
52 Y: Into<NumberString>,
53 D: Serialize,
54 {
55 self.map(|(x, y, d)| (x.into(), y.into(), Some(serde_json::to_value(d).unwrap())))
56 }
57}
58impl<T> DatasetIterExt for T where T: Iterator + ?Sized {}