use std::fmt::Display;
pub(crate) fn iter_join(
separator: &str,
iter: impl Iterator<Item: Display> + Clone,
) -> impl Display {
struct Fmt<'a, I: Iterator<Item: Display> + Clone> {
separator: &'a str,
iter: I,
}
impl<'a, I: Iterator<Item: Display> + Clone> Display for Fmt<'a, I> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let Self { separator, iter } = self;
let mut iter = iter.clone();
if let Some(first) = iter.next() {
write!(f, "{first}")?;
}
for x in iter {
write!(f, "{separator}{x}")?;
}
Ok(())
}
}
Fmt { separator, iter }
}