diff --git a/src/pretty.rs b/src/pretty.rs index 3847c62..4fe06c6 100644 --- a/src/pretty.rs +++ b/src/pretty.rs @@ -1 +1,2 @@ +mod basic; mod program; diff --git a/src/pretty/basic.rs b/src/pretty/basic.rs new file mode 100644 index 0000000..2ee19db --- /dev/null +++ b/src/pretty/basic.rs @@ -0,0 +1,38 @@ +use pretty::RcDoc; + +use crate::ast::Separated; + +impl Separated { + pub fn to_doc( + &self, + elem_to_doc: FE, + separator_to_doc: FS1, + trailing_separator_to_doc: FS2, + ) -> RcDoc + where + FE: Fn(&E) -> RcDoc, + FS1: Fn(&S1) -> RcDoc, + FS2: Fn(&S2) -> RcDoc, + { + match self { + Separated::Empty(_) => RcDoc::nil(), + Separated::NonEmpty { + first_elem, + last_elems, + trailing, + span: _span, + } => elem_to_doc(first_elem) + .append(RcDoc::concat( + last_elems + .iter() + .map(|(s, e)| separator_to_doc(s).append(elem_to_doc(e))), + )) + .append( + trailing + .as_ref() + .map(trailing_separator_to_doc) + .unwrap_or_else(RcDoc::nil), + ), + } + } +} diff --git a/src/pretty/program.rs b/src/pretty/program.rs index 60a5ca0..6af1ac4 100644 --- a/src/pretty/program.rs +++ b/src/pretty/program.rs @@ -10,14 +10,21 @@ impl Program { expr, s1, span: _, - } => RcDoc::nil(), + } => RcDoc::text(""), Program::Module { s0, s1, elems, s2, span: _, - } => RcDoc::text("module"), + } => RcDoc::text("module") + .append(RcDoc::line()) + .append(RcDoc::line()) + .append(elems.to_doc( + |e| RcDoc::text(""), + |(s0, s1)| RcDoc::text(",").append(RcDoc::line()), + |s| RcDoc::text(","), + )), } } }