parol 4.4.0

LL(k) and LALR(1) parser generator for Rust
Documentation
use std::{
    cell::RefCell,
    fmt::{Display, Error, Formatter},
};

pub(crate) struct StrIter<T: Iterator<Item = U>, U> {
    iter: RefCell<Option<T>>,
}

impl<T, U> StrIter<T, U>
where
    T: Iterator<Item = U>,
    U: Display,
{
    pub fn new(iter: T) -> Self {
        Self {
            iter: RefCell::new(Some(iter)),
        }
    }
}

pub(crate) trait IteratorExt<U: Display>: Iterator<Item = U> + Sized {
    fn into_str_iter(self) -> StrIter<Self, U>;
}

impl<T: Iterator<Item = U>, U: Display> IteratorExt<U> for T {
    fn into_str_iter(self) -> StrIter<Self, U> {
        StrIter::new(self)
    }
}

impl<T, U> Display for StrIter<T, U>
where
    T: Iterator<Item = U>,
    U: Display,
{
    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
        let iter = self
            .iter
            .borrow_mut()
            .take()
            .expect("StrIter cannot be displayed more than once");
        for item in iter {
            f.write_fmt(format_args!("{item}"))?;
        }
        Ok(())
    }
}