macro_rules! clone_fields {
    ($name:ident, $($field:ident),+ $(,)*) => (
        fn clone(&self) -> Self {
            $name {
                $(
                    $field : self . $field .clone()
                ),*
            }
        }
    );
}

macro_rules! iterator_wrap {
    (impl () for 
    struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* }
     item: $item: ty,
     iter: $iter: ty,
     ) => ();
    (
    impl (Iterator $($rest:tt)*)  for 
    $(#[$derive:meta])*
     struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* }
     item: $item: ty,
     iter: $iter: ty,
     ) => (
        // having complex iterator types is kind of the point of this macro
        #[allow(clippy::type_complexity)]
        $(#[$derive])*
        pub struct $name <$($typarm),*> where $($bounds)* {
            iter: $iter,
        }
        impl<$($typarm),*> Iterator for $name <$($typarm),*>
            where $($bounds)*
        {
            type Item = $item;
            #[inline]
            fn next(&mut self) -> Option<Self::Item> {
                self.iter.next()
            }

            #[inline]
            fn size_hint(&self) -> (usize, Option<usize>) {
                self.iter.size_hint()
            }
        }
        iterator_wrap!(
            impl ($($rest)*)  for
            struct $name <$($typarm),*> where { $($bounds)* }
            item: $item,
            iter: $iter,
            );
        );
    
    (
impl (ExactSizeIterator $($rest:tt)*)  for
    $(#[$derive:meta])*
     struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* }
     item: $item: ty,
     iter: $iter: ty,
     ) => (
        impl<$($typarm),*> ExactSizeIterator for $name <$($typarm),*>
            where $($bounds)*
        {
            #[inline]
            fn len(&self) -> usize {
                self.iter.len()
            }
        }
        iterator_wrap!(
            impl ($($rest)*)  for
         $(#[$derive])*
            struct $name <$($typarm),*> where { $($bounds)* }
            item: $item,
            iter: $iter,
            );
    );
    
    (
impl (DoubleEndedIterator $($rest:tt)*)  for
    $(#[$derive:meta])*
     struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* }
     item: $item: ty,
     iter: $iter: ty,
     ) => (
        impl<$($typarm),*> DoubleEndedIterator for $name <$($typarm),*>
            where $($bounds)*
        {
            fn next_back(&mut self) -> Option<Self::Item> {
                self.iter.next_back()
            }
            fn rfold<B, F>(self, accum: B, f: F) -> B
                where
                    F: FnMut(B, Self::Item) -> B,
                { self.iter.rfold(accum, f) }
            fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
                where
                    P: FnMut(&Self::Item) -> bool,
                { self.iter.rfind(predicate) }
        }
        iterator_wrap!(
            impl ($($rest)*)  for
         $(#[$derive])*
           struct $name <$($typarm),*> where { $($bounds)* }
            item: $item,
            iter: $iter,
            );
    );
}
