From fffe2d4405885194c5f584755ed4f02de1027558 Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Mon, 18 Aug 2025 23:09:20 +0300 Subject: refactor: loop-unrolled recursive function SExp::parts as it's called a lot, also fixed it returning [Nil] if passed Nil --- src/sexp/util.rs | 25 ++++++++++++++++--------- 1 file 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 { - 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)> { -- cgit v1.2.3