use super::{Doc, DocE, GroupAnn, Pretty, Spacing, TextAnn};
impl Doc {
fn text_ann(&mut self, ann: TextAnn, s: impl Into<String>) -> &mut Self {
let s = s.into();
if !s.is_empty() {
self.0.push(DocE::Text(0, 0, ann, s));
}
self
}
pub fn text(&mut self, s: impl Into<String>) -> &mut Self {
self.text_ann(TextAnn::RegularT, s)
}
pub fn comment(&mut self, s: impl Into<String>) -> &mut Self {
self.text_ann(TextAnn::Comment, s)
}
pub fn trailing_comment(&mut self, s: impl Into<String>) -> &mut Self {
self.text_ann(TextAnn::TrailingComment, s)
}
pub fn trailing(&mut self, s: impl Into<String>) -> &mut Self {
self.text_ann(TextAnn::Trailing, s)
}
pub fn group(&mut self, f: impl FnOnce(&mut Self)) -> &mut Self {
self.group_ann(GroupAnn::RegularG, f)
}
pub fn group_ann(&mut self, ann: GroupAnn, f: impl FnOnce(&mut Self)) -> &mut Self {
let start = self.0.len();
f(self);
let inner = Self(self.0.split_off(start));
self.0.push(DocE::Group(ann, inner));
self
}
fn nest_pair(&mut self, dn: isize, doff: isize, f: impl FnOnce(&mut Self)) -> &mut Self {
self.0.push(DocE::Nest(dn, doff));
f(self);
self.0.push(DocE::Nest(-dn, -doff));
self
}
pub fn nested(&mut self, f: impl FnOnce(&mut Self)) -> &mut Self {
self.nest_pair(1, 0, f)
}
pub fn offset(&mut self, level: usize, f: impl FnOnce(&mut Self)) -> &mut Self {
self.nest_pair(0, level.cast_signed(), f)
}
pub fn sep_by<P: Pretty>(
&mut self,
separator: &[DocE],
items: impl IntoIterator<Item = P>,
) -> &mut Self {
let mut first = true;
for item in items {
if !first {
self.0.extend_from_slice(separator);
}
first = false;
item.pretty(self);
}
self
}
pub fn hcat<P: Pretty>(&mut self, items: impl IntoIterator<Item = P>) -> &mut Self {
for item in items {
item.pretty(self);
}
self
}
pub fn surrounded(&mut self, outside: &[DocE], f: impl FnOnce(&mut Self)) -> &mut Self {
self.0.extend_from_slice(outside);
f(self);
self.0.extend_from_slice(outside);
self
}
pub fn softline_prime(&mut self) -> &mut Self {
self.push_raw(DocE::Spacing(Spacing::Softbreak))
}
pub fn line_prime(&mut self) -> &mut Self {
self.push_raw(line_prime())
}
pub fn softline(&mut self) -> &mut Self {
self.push_raw(DocE::Spacing(Spacing::Softspace))
}
pub fn line(&mut self) -> &mut Self {
self.push_raw(line())
}
pub fn hardspace(&mut self) -> &mut Self {
self.push_raw(hardspace())
}
pub fn hardline(&mut self) -> &mut Self {
self.push_raw(hardline())
}
pub fn emptyline(&mut self) -> &mut Self {
self.push_raw(DocE::Spacing(Spacing::Emptyline))
}
}
pub const fn line_prime() -> DocE {
DocE::Spacing(Spacing::Break)
}
pub const fn line() -> DocE {
DocE::Spacing(Spacing::Space)
}
pub const fn hardspace() -> DocE {
DocE::Spacing(Spacing::Hardspace)
}
pub const fn hardline() -> DocE {
DocE::Spacing(Spacing::Hardline)
}
pub const fn newline() -> DocE {
DocE::Spacing(Spacing::Newlines(1))
}