diff options
author | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-08-18 23:09:20 +0300 |
---|---|---|
committer | Joel Kronqvist <joel.kronqvist@iki.fi> | 2025-08-18 23:09:20 +0300 |
commit | fffe2d4405885194c5f584755ed4f02de1027558 (patch) | |
tree | ba06c3b8a419ed6954f06b7bd56897f2f33ec225 | |
parent | 74903656b27f40322151d3b8bc0335b7924133f4 (diff) | |
download | myslip-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.rs | 25 |
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)> { |