let of_filename experimental filename =
let l = String.length filename in
let i = Input.create_bytes 128 in
let rec aux consumed = function
| Parser.Fail _ -> None
| Parser.Read { buffer; k; } ->
let n = min 128 (l - consumed) in
Input.write_string buffer filename consumed n;
aux (consumed + n) @@ k n (if n = 0 then Parser.Complete else Parser.Incomplete)
| Parser.Done v -> Some v
in
aux 0 @@ Parser.run i (parse experimental)