let stream_of_channel_lines_gen ~close inch =
  Stream.from
    (let inch_ref = ref (Some inch)
     in
       fun _ ->
         match !inch_ref with
         | None -> None
         | Some inch ->
             (match input_line_opt inch with
              | (Some _ as some_line) -> some_line
              | None ->
                  (if close then (close_in inch; inch_ref := Noneelse ();
                   None)))