use crate::write::{sep_by, separator::Separator};
#[macro_export]
macro_rules! sep_by {
($iter:expr, $sep:expr, $($residual:expr),+ $(,)?) => {
$crate::SepBy::sep_by(::std::iter::IntoIterator::into_iter($iter).map(|iter| $crate::sep_by!(iter, $($residual, )+)), &$sep)
};
($iter:expr, $sep:expr $(,)?) => {
$crate::SepBy::sep_by($iter, &$sep)
};
}
pub trait SepBy: IntoIterator
where
<Self as IntoIterator>::IntoIter: Clone,
{
fn sep_by<S: Separator + ?Sized>(self, sep: &'_ S) -> sep_by::SepBy<'_, Self::IntoIter, S>;
fn sep_by_write_into<S: Separator + ?Sized>(
self,
sep: &'_ S,
) -> sep_by::SepBy<'_, Self::IntoIter, S>
where
Self::Item: crate::WriteInto;
}
impl<I: IntoIterator> SepBy for I
where
I::IntoIter: Clone,
{
#[inline]
fn sep_by<S: Separator + ?Sized>(self, sep: &'_ S) -> sep_by::SepBy<'_, Self::IntoIter, S> {
sep_by::SepBy::new(self.into_iter(), sep)
}
#[inline]
fn sep_by_write_into<S: Separator + ?Sized>(
self,
sep: &'_ S,
) -> sep_by::SepBy<'_, Self::IntoIter, S>
where
Self::Item: crate::WriteInto,
{
let iter = sep_by::SepBy::new(self.into_iter(), sep);
fn check_impl_write_into<T: crate::WriteInto>(_: &T) {}
check_impl_write_into(&iter);
iter
}
}