use std::rc::Rc;
#[derive(Debug, Clone)]
pub enum Ir {
Text(Rc<str>),
Concat(Rc<[Ir]>),
Line,
SoftLine,
HardLine,
BlankLine,
Indent(Rc<Ir>),
Group(Rc<Ir>),
IfBreak(Rc<str>, Rc<str>),
HugGroup {
prefix: Rc<Ir>,
body: Rc<Ir>,
close: Rc<Ir>,
explode: Rc<Ir>,
},
}
impl Ir {
pub fn text(s: impl Into<Rc<str>>) -> Ir {
Ir::Text(s.into())
}
pub fn concat(items: impl IntoIterator<Item = Ir>) -> Ir {
Ir::Concat(items.into_iter().collect())
}
pub fn group(inner: Ir) -> Ir {
Ir::Group(Rc::new(inner))
}
pub fn indent(inner: Ir) -> Ir {
Ir::Indent(Rc::new(inner))
}
pub fn if_break(broken: impl Into<Rc<str>>, flat: impl Into<Rc<str>>) -> Ir {
Ir::IfBreak(broken.into(), flat.into())
}
pub fn hug_group(prefix: Ir, body: Ir, close: Ir, explode: Ir) -> Ir {
Ir::HugGroup {
prefix: Rc::new(prefix),
body: Rc::new(body),
close: Rc::new(close),
explode: Rc::new(explode),
}
}
}