1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use syn::punctuated::{Pair, Punctuated};
pub trait PunctuatedExt<T, P> {
    fn remove(&mut self, index: usize) -> Pair<T, P>
    where
        P: Default;
}

impl<T, P> PunctuatedExt<T, P> for Punctuated<T, P> {
    fn remove(&mut self, index: usize) -> Pair<T, P>
    where
        P: Default,
    {
        let mut stack = Vec::new();
        for _ in index + 1..self.len() {
            stack.push(self.pop().unwrap().into_value());
        }
        let removed = self.pop().unwrap();
        while let Some(item) = stack.pop() {
            self.push(item)
        }
        removed
    }
}