smart_format/iter/
join.rs1use 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}