1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use super::Candle;
pub static HEADER: &'static str = "Date,Open,High,Low,Close,Volume\n";
pub struct CsvIterator<I> {
inner: I,
header: bool,
}
impl<I> From<I> for CsvIterator<I>
where
I: Iterator,
I::Item: AsRef<Candle>,
{
fn from(iter: I) -> Self {
CsvIterator {
inner: iter,
header: false,
}
}
}
impl<I> Iterator for CsvIterator<I>
where
I: Iterator,
I::Item: AsRef<Candle>,
{
type Item = String;
fn next(&mut self) -> Option<Self::Item> {
if !self.header {
self.header = true;
Some(HEADER.to_owned())
} else {
self.inner.next().map(|candle| candle.as_ref().into())
}
}
}
pub trait IntoCsvIterator<I> {
fn into_csv_iter(self) -> CsvIterator<I>;
}
impl<T> IntoCsvIterator<T::IntoIter> for T
where
T: IntoIterator,
{
fn into_csv_iter(self) -> CsvIterator<T::IntoIter> {
CsvIterator {
inner: self.into_iter(),
header: false,
}
}
}