OCaml line-by-line file reader that closes its channel

OCaml
let iter_lines path f =
  let ic = open_in_bin path in
  Fun.protect
    ~finally:(fun () -> close_in_noerr ic)
    (fun () ->
      try
        while true do
          f (input_line ic)
        done
      with End_of_file -> ())

let read_lines path =
  let lines = ref [] in
  iter_lines path (fun line -> lines := line :: !lines);
  List.rev !lines