sig
  type path = string
  val write_file :
    Pvem_lwt_unix.IO.path ->
    content:string ->
    (unit, [> `IO of [> `Write_file_exn of Pvem_lwt_unix.IO.path * exn ] ])
    Pvem_lwt_unix.Deferred_result.t
  val read_file :
    Pvem_lwt_unix.IO.path ->
    (string, [> `IO of [> `Read_file_exn of Pvem_lwt_unix.IO.path * exn ] ])
    Pvem_lwt_unix.Deferred_result.t
  val with_out_channel :
    ?buffer_size:int ->
    f:(Lwt_io.output_channel ->
       ('a,
        [> `IO of
             [> `Exn of exn | `File_exists of string | `Wrong_path of string ] ]
        as 'err)
       Pvem_lwt_unix.Deferred_result.t) ->
    [ `Append_to_file of string
    | `Channel of Lwt_io.output_channel
    | `Create_file of string
    | `Overwrite_file of string
    | `Stderr
    | `Stdout ] -> ('a, 'err) Pvem_lwt_unix.Deferred_result.t
  val write :
    Lwt_io.output_channel ->
    string ->
    (unit, [> `IO of [> `Exn of exn ] ]) Pvem_lwt_unix.Deferred_result.t
  val flush :
    Lwt_io.output_channel ->
    (unit, [> `IO of [> `Exn of exn ] ]) Pvem_lwt_unix.Deferred_result.t
  val with_in_channel :
    [ `Channel of Lwt_io.input_channel | `File of string | `Stdin ] ->
    ?buffer_size:int ->
    f:(Lwt_io.input_channel ->
       ('a, [> `IO of [> `Exn of exn ] ] as 'err)
       Pvem_lwt_unix.Deferred_result.t) ->
    ('a, 'err) Pvem_lwt_unix.Deferred_result.t
  val read :
    ?count:int ->
    Lwt_io.input_channel ->
    (string, [> `IO of [> `Exn of exn ] ]) Pvem_lwt_unix.Deferred_result.t
  val error_to_string :
    [< `IO of
         [< `Exn of exn
          | `File_exists of string
          | `Read_file_exn of string * exn
          | `Write_file_exn of string * exn
          | `Wrong_path of string ] ] ->
    string
end