perf: Rewrote parse_min_max to avoid folding
This commit is contained in:
@@ -102,23 +102,23 @@ pub fn try_parsers(
|
||||
}
|
||||
|
||||
pub fn parse_min_max(str, min, max, parse_fn) {
|
||||
use <- bool.guard(when: min < 0 || max <= 0 || min > max, return: Error(Nil))
|
||||
case
|
||||
list.repeat("", max)
|
||||
|> list.fold_until(Ok(#("", str, 0)), fn(acc, _) {
|
||||
let assert Ok(#(hex, str, i)) = acc
|
||||
do_parse_min_max(str, "", min, max, parse_fn)
|
||||
}
|
||||
|
||||
pub fn do_parse_min_max(str, acc, min, max, parse_fn) {
|
||||
case parse_fn(str) {
|
||||
Error(_) ->
|
||||
case i < min {
|
||||
True -> Stop(Error(Nil))
|
||||
False -> Stop(Ok(#(hex, str, i)))
|
||||
Error(_) -> {
|
||||
case min > 0 {
|
||||
True -> Error(Nil)
|
||||
False -> Ok(#(acc, str))
|
||||
}
|
||||
}
|
||||
Ok(#(l, rest)) -> {
|
||||
case max {
|
||||
1 -> Ok(#(acc <> l, rest))
|
||||
_ -> do_parse_min_max(rest, acc <> l, min - 1, max - 1, parse_fn)
|
||||
}
|
||||
Ok(#(l, rest)) -> Continue(Ok(#(hex <> l, rest, i + 1)))
|
||||
}
|
||||
})
|
||||
{
|
||||
Error(_) -> Error(Nil)
|
||||
Ok(#(hex, str, _)) -> Ok(#(hex, str))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user