diff options
Diffstat (limited to 'src/sexp')
-rw-r--r-- | src/sexp/display.rs | 25 | ||||
-rw-r--r-- | src/sexp/step.rs | 8 |
2 files changed, 19 insertions, 14 deletions
diff --git a/src/sexp/display.rs b/src/sexp/display.rs index e6dbb7c..238e8d4 100644 --- a/src/sexp/display.rs +++ b/src/sexp/display.rs @@ -26,20 +26,17 @@ impl fmt::Display for SExp { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Atom(leaf) => write!(f, "{}", leaf.to_string()), - SCons(a, b) => { - match scons(a.clone(), b.clone()).into_vec() { - Ok(l) => write!( - f, - "({})", - l.into_iter() - .map(|x| x.to_string()) - .collect::<Vec<String>>() - .join(" ") - ), - Err(_) => write!(f, "({} {})", *a, *b), - } - } + SCons(a, b) => + write!( + f, + "({})", + scons(a.clone(), b.clone()) + .parts() + .into_iter() + .map(|x| x.to_string()) + .collect::<Vec<String>>() + .join(" ") + ) } } - } diff --git a/src/sexp/step.rs b/src/sexp/step.rs index 765e33c..1ab0291 100644 --- a/src/sexp/step.rs +++ b/src/sexp/step.rs @@ -209,4 +209,12 @@ impl SExp { t => Err(format!("unimplemented: {:?}.step()", t)), } } + + + pub fn multistep(self) -> Result<Self, String> { + match self.clone().step()? { + x if x == self => Ok(self), + x => x.multistep() + } + } } |