aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-18 23:09:20 +0300
committerJoel Kronqvist <joel.kronqvist@iki.fi>2025-08-18 23:09:20 +0300
commitfffe2d4405885194c5f584755ed4f02de1027558 (patch)
treeba06c3b8a419ed6954f06b7bd56897f2f33ec225
parent74903656b27f40322151d3b8bc0335b7924133f4 (diff)
downloadmyslip-fffe2d4405885194c5f584755ed4f02de1027558.tar.gz
myslip-fffe2d4405885194c5f584755ed4f02de1027558.zip
refactor: loop-unrolled recursive function SExp::parts as it's called a lot, also fixed it returning [Nil] if passed Nil
-rw-r--r--src/sexp/util.rs25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/sexp/util.rs b/src/sexp/util.rs
index 1da9ccf..9b8e5dd 100644
--- a/src/sexp/util.rs
+++ b/src/sexp/util.rs
@@ -66,15 +66,22 @@ impl SExp {
}
pub fn parts(self) -> Vec<SExp> {
- match self {
- Atom(x) => vec![Atom(x)],
- SCons(a, b) if *b == Atom(Nil) => vec![*a],
- SCons(a, b) => {
- let mut res = vec![*a];
- res.extend_from_slice(&(*b).parts());
- res
- },
- }
+ let mut res = vec![];
+ let mut se = self;
+ loop {
+ match se {
+ Atom(Nil) => break,
+ Atom(x) => {
+ res.push(Atom(x));
+ break;
+ },
+ SCons(a, b) => {
+ res.push(*a);
+ se = *b;
+ }
+ }
+ }
+ res
}
pub fn check_let(self) -> Option<(String, SExp)> {