pretty-expressive 1.0.0

A pretty expressive printer
Documentation
// Utility for building up a list of items that should not be empty.
//
// The first item is maintained separately. It is an Option in the builder because
// the builder will start out empty, but by the time it is finished, first should
// always be populated.
pub struct NonEmptyVecBuilder<T> {
    first: Option<T>,
    rest: Vec<T>,
}

impl<T> NonEmptyVecBuilder<T> {
    pub fn new() -> Self {
        Self {
            first: None,
            rest: Vec::new(),
        }
    }

    pub fn push(&mut self, item: T) {
        if self.first.is_none() {
            self.first = Some(item);
        } else {
            self.rest.push(item);
        }
    }

    pub fn finish(self) -> (T, Vec<T>) {
        (self.first.unwrap(), self.rest)
    }
}

impl<T> Extend<T> for NonEmptyVecBuilder<T> {
    fn extend<Iter: IntoIterator<Item = T>>(&mut self, iter: Iter) {
        let mut iter = iter.into_iter();
        if self.first.is_none() {
            self.first = iter.next();
        }
        self.rest.extend(iter);
    }
}