perf: Rewrote parse_min_max to avoid folding

This commit is contained in:
2025-09-14 18:46:45 +01:00
parent 47da8071cf
commit e5b5545bd1

View File

@@ -102,23 +102,23 @@ pub fn try_parsers(
} }
pub fn parse_min_max(str, min, max, parse_fn) { pub fn parse_min_max(str, min, max, parse_fn) {
use <- bool.guard(when: min < 0 || max <= 0 || min > max, return: Error(Nil)) do_parse_min_max(str, "", min, max, parse_fn)
case }
list.repeat("", max)
|> list.fold_until(Ok(#("", str, 0)), fn(acc, _) { pub fn do_parse_min_max(str, acc, min, max, parse_fn) {
let assert Ok(#(hex, str, i)) = acc case parse_fn(str) {
case parse_fn(str) { Error(_) -> {
Error(_) -> case min > 0 {
case i < min { True -> Error(Nil)
True -> Stop(Error(Nil)) False -> Ok(#(acc, str))
False -> Stop(Ok(#(hex, str, i)))
}
Ok(#(l, rest)) -> Continue(Ok(#(hex <> l, rest, i + 1)))
} }
}) }
{ Ok(#(l, rest)) -> {
Error(_) -> Error(Nil) case max {
Ok(#(hex, str, _)) -> Ok(#(hex, str)) 1 -> Ok(#(acc <> l, rest))
_ -> do_parse_min_max(rest, acc <> l, min - 1, max - 1, parse_fn)
}
}
} }
} }