Skip to main content

smart_format/iter/
join.rs

1use core::fmt;
2
3pub struct Join<T, S> {
4    iter: T,
5    sep: S,
6}
7
8impl<T, S> Join<T, S> {
9    pub fn new(iter: T, sep: S) -> Self {
10        Join { iter, sep }
11    }
12}
13
14impl<T, S> fmt::Display for Join<T, S>
15where
16    T: Iterator + Clone,
17    T::Item: fmt::Display,
18    S: fmt::Display,
19{
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        let mut it = self.iter.clone();
22
23        if let Some(first) = it.next() {
24            first.fmt(f)?;
25        }
26
27        for item in it {
28            self.sep.fmt(f)?;
29            item.fmt(f)?;
30        }
31
32        Ok(())
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::super::tests::JOIN_SAMPLE_NUM;
39    use super::super::tests::JOIN_SAMPLE_STR;
40    use super::super::tests::SOURCE_NUM;
41    use super::super::tests::SOURCE_STR;
42    use super::*;
43
44    #[test]
45    fn it_joins_str() {
46        assert_eq!(
47            JOIN_SAMPLE_STR,
48            Join::new(SOURCE_STR.iter(), ", ").to_string()
49        );
50    }
51
52    #[test]
53    fn it_joins_num() {
54        assert_eq!(
55            JOIN_SAMPLE_NUM,
56            Join::new(SOURCE_NUM.iter(), ", ").to_string()
57        );
58    }
59}