diff --git a/lib/angstrom.ml b/lib/angstrom.ml index defc14f..241d052 100644 --- a/lib/angstrom.ml +++ b/lib/angstrom.ml @@ -461,7 +461,7 @@ let fix_direct f = in r -let fix_lazy max_steps f = +let fix_lazy ~max_steps f = let steps = ref max_steps in let rec p = lazy (f r) and r = { run = fun buf pos more fail succ -> @@ -479,7 +479,7 @@ let fix_lazy max_steps f = let fix = match Sys.backend_type with | Native -> fix_direct | Bytecode -> fix_direct - | Other _ -> fun f -> fix_lazy 20 f + | Other _ -> fun f -> fix_lazy ~max_steps:20 f let option x p = p <|> return x diff --git a/lib/angstrom.mli b/lib/angstrom.mli index 7a701ac..d669595 100644 --- a/lib/angstrom.mli +++ b/lib/angstrom.mli @@ -348,15 +348,15 @@ val fix : ('a t -> 'a t) -> 'a t let obj = char '{' *> ... json ... <* char '}' in choice [str; num; arr json, ...])]} *) -(** [fix_lazy] is like [fix], but after the function reaches the max - depth, it wraps up the remaining computation and yields +(** [fix_lazy] is like [fix], but after the function reaches [max_steps] + deep, it wraps up the remaining computation and yields back to the root of the parsing loop where it continues from there. This is an effective way to break up the stack trace into more managable chunks, which is important for Js_of_ocaml due to the lack of tailrec optimizations for CPS-style tail calls. When compiling for Js_of_ocaml, - [fix] itself is defined as [fix_lazy 20]. *) -val fix_lazy : int -> ('a t -> 'a t) -> 'a t + [fix] itself is defined as [fix_lazy ~max_steps:20]. *) +val fix_lazy : max_steps:int -> ('a t -> 'a t) -> 'a t (** {2 Alternatives} *)