lispify 0.1.0

Pretty print lisp
Documentation
use super::*;

impl PrettyPrint for Lisp {
    fn pretty(&self, theme: &PrettyProvider) -> PrettyTree {
        match self {
            Lisp::Atomic(value) => value.pretty(theme),
            Lisp::Concat(values) => {
                let mut terms = PrettySequence::new(values.len());
                for value in values {
                    terms += value.pretty(theme);
                }
                terms.into()
            }
            Lisp::Sequence(values) => {
                let mut terms = PrettySequence::new(values.len() * 2 + 1);
                terms += "(";
                terms += theme.join(values.iter().cloned(), PrettyTree::line_or_space()).nest(2).group();
                terms += ")";
                terms.into()
            }
        }
    }
}

impl PrettyPrint for LispStyled {
    fn pretty(&self, theme: &PrettyProvider) -> PrettyTree {
        match self.style {
            PrettyPrintKind::Normal => theme.text(self.get_text()),
            PrettyPrintKind::Keyword => theme.keyword(self.get_text()),
            PrettyPrintKind::String => theme.string(self.get_text()),
            PrettyPrintKind::Number => theme.number(self.get_text()),
            PrettyPrintKind::Annotation => theme.annotation(self.get_text()),
            PrettyPrintKind::Argument => theme.argument(self.get_text(), false),
            PrettyPrintKind::ArgumentMutable => theme.argument(self.get_text(), true),
            PrettyPrintKind::Local => theme.variable(self.get_text(), false),
            PrettyPrintKind::LocalMutable => theme.variable(self.get_text(), true),
            PrettyPrintKind::Operator => theme.operator(self.get_text()),
            PrettyPrintKind::Structure => theme.structure(self.get_text()),
            PrettyPrintKind::Class => theme.structure(self.get_text()),
            PrettyPrintKind::Union => theme.structure(self.get_text()),
            PrettyPrintKind::UnionDisjoint => theme.structure(self.get_text()),
            PrettyPrintKind::Variant => theme.argument(self.get_text(), false),
            PrettyPrintKind::Interface => theme.interface(self.get_text()),
            PrettyPrintKind::Trait => theme.interface(self.get_text()),
        }
    }
}

impl Display for Lisp {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        let theme = PrettyProvider::new(80);
        f.write_str(&self.pretty_string(&theme))
    }
}