lexgen 0.16.0

A fully-featured lexer generator implemented as a proc macro
Documentation
use std::collections::{BTreeSet, HashSet};
use std::fmt::{self, Display, Formatter};

pub struct BTreeSetDisplay<'a, A: Display>(pub &'a BTreeSet<A>);

pub struct HashSetDisplay<'a, A: Display, S>(pub &'a HashSet<A, S>);

impl<A: Display> Display for BTreeSetDisplay<'_, A> {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        display_set(f, self.0.len(), &mut self.0.iter())
    }
}

impl<A: Display, S> Display for HashSetDisplay<'_, A, S> {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        display_set(f, self.0.len(), &mut self.0.iter())
    }
}

fn display_set<A: Display>(
    f: &mut Formatter<'_>,
    n_elems: usize,
    elems: &mut dyn Iterator<Item = A>,
) -> fmt::Result {
    write!(f, "{{")?;

    for (elem_idx, elem) in elems.enumerate() {
        write!(f, "{}", elem)?;
        if elem_idx != n_elems - 1 {
            write!(f, ", ")?;
        }
    }

    write!(f, "}}")
}