1 | use crate::element::PointElement; |
2 | use crate::style::{ShapeStyle, SizeDesc}; |
3 | |
4 | /// The point plot object, which takes an iterator of points in guest coordinate system |
5 | /// and create an element for each point |
6 | pub struct PointSeries<'a, Coord, I: IntoIterator<Item = Coord>, E, Size: SizeDesc + Clone> { |
7 | style: ShapeStyle, |
8 | size: Size, |
9 | data_iter: I::IntoIter, |
10 | make_point: &'a dyn Fn(Coord, Size, ShapeStyle) -> E, |
11 | } |
12 | |
13 | impl<'a, Coord, I: IntoIterator<Item = Coord>, E, Size: SizeDesc + Clone> Iterator |
14 | for PointSeries<'a, Coord, I, E, Size> |
15 | { |
16 | type Item = E; |
17 | fn next(&mut self) -> Option<Self::Item> { |
18 | self.data_iter |
19 | .next() |
20 | .map(|x| (self.make_point)(x, self.size.clone(), self.style)) |
21 | } |
22 | } |
23 | |
24 | impl<'a, Coord, I: IntoIterator<Item = Coord>, E, Size: SizeDesc + Clone> |
25 | PointSeries<'a, Coord, I, E, Size> |
26 | where |
27 | E: PointElement<Coord, Size>, |
28 | { |
29 | /// Create a new point series with the element that implements point trait. |
30 | /// You may also use a more general way to create a point series with `of_element` |
31 | /// function which allows a customized element construction function |
32 | pub fn new<S: Into<ShapeStyle>>(iter: I, size: Size, style: S) -> Self { |
33 | Self { |
34 | data_iter: iter.into_iter(), |
35 | size, |
36 | style: style.into(), |
37 | make_point: &|a, b, c| E::make_point(a, b, c), |
38 | } |
39 | } |
40 | } |
41 | |
42 | impl<'a, Coord, I: IntoIterator<Item = Coord>, E, Size: SizeDesc + Clone> |
43 | PointSeries<'a, Coord, I, E, Size> |
44 | { |
45 | /// Create a new point series. Similar to `PointSeries::new` but it doesn't |
46 | /// requires the element implements point trait. So instead of using the point |
47 | /// constructor, it uses the customized function for element creation |
48 | pub fn of_element<S: Into<ShapeStyle>, F: Fn(Coord, Size, ShapeStyle) -> E>( |
49 | iter: I, |
50 | size: Size, |
51 | style: S, |
52 | cons: &'a F, |
53 | ) -> Self { |
54 | Self { |
55 | data_iter: iter.into_iter(), |
56 | size, |
57 | style: style.into(), |
58 | make_point: cons, |
59 | } |
60 | } |
61 | } |
62 | |