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) {
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user