sig
  type input
  type 'a output
  exception No_more_input
  exception Input_closed
  exception Output_closed
  val read : BatInnerIO.input -> char
  val read_all : BatInnerIO.input -> string
  val pipe : unit -> BatInnerIO.input * unit BatInnerIO.output
  val nread : BatInnerIO.input -> int -> string
  val really_nread : BatInnerIO.input -> int -> string
  val input : BatInnerIO.input -> Stdlib.Bytes.t -> int -> int -> int
  val really_input : BatInnerIO.input -> Stdlib.Bytes.t -> int -> int -> int
  val close_in : BatInnerIO.input -> unit
  val write : 'BatInnerIO.output -> char -> unit
  val nwrite : 'BatInnerIO.output -> string -> unit
  val nwrite_bytes : 'BatInnerIO.output -> Stdlib.Bytes.t -> unit
  val output : 'BatInnerIO.output -> Stdlib.Bytes.t -> int -> int -> int
  val output_substring : 'BatInnerIO.output -> string -> int -> int -> int
  val really_output :
    'BatInnerIO.output -> Stdlib.Bytes.t -> int -> int -> int
  val really_output_substring :
    'BatInnerIO.output -> string -> int -> int -> int
  val flush : 'BatInnerIO.output -> unit
  val flush_all : unit -> unit
  val close_out : 'BatInnerIO.output -> 'a
  val close_all : unit -> unit
  val input_string : string -> BatInnerIO.input
  val output_string : unit -> string BatInnerIO.output
  val on_close_out :
    'BatInnerIO.output -> ('BatInnerIO.output -> unit) -> unit
  val create_in :
    read:(unit -> char) ->
    input:(Stdlib.Bytes.t -> int -> int -> int) ->
    close:(unit -> unit) -> BatInnerIO.input
  val inherit_in :
    ?read:(unit -> char) ->
    ?input:(Stdlib.Bytes.t -> int -> int -> int) ->
    ?close:(unit -> unit) -> BatInnerIO.input -> BatInnerIO.input
  val wrap_in :
    read:(unit -> char) ->
    input:(Stdlib.Bytes.t -> int -> int -> int) ->
    close:(unit -> unit) ->
    underlying:BatInnerIO.input list -> BatInnerIO.input
  val create_out :
    write:(char -> unit) ->
    output:(Stdlib.Bytes.t -> int -> int -> int) ->
    flush:(unit -> unit) -> close:(unit -> 'a) -> 'BatInnerIO.output
  val inherit_out :
    ?write:(char -> unit) ->
    ?output:(Stdlib.Bytes.t -> int -> int -> int) ->
    ?flush:(unit -> unit) ->
    ?close:(unit -> unit) -> 'BatInnerIO.output -> unit BatInnerIO.output
  val wrap_out :
    write:(char -> unit) ->
    output:(Stdlib.Bytes.t -> int -> int -> int) ->
    flush:(unit -> unit) ->
    close:(unit -> 'a) ->
    underlying:'BatInnerIO.output list -> 'BatInnerIO.output
  val default_buffer_size : int
  exception Overflow of string
  val read_byte : BatInnerIO.input -> int
  val read_signed_byte : BatInnerIO.input -> int
  val read_ui16 : BatInnerIO.input -> int
  val read_i16 : BatInnerIO.input -> int
  val read_i32 : BatInnerIO.input -> int
  val read_real_i32 : BatInnerIO.input -> int32
  val read_i64 : BatInnerIO.input -> int64
  val read_float : BatInnerIO.input -> float
  val read_double : BatInnerIO.input -> float
  val read_string : BatInnerIO.input -> string
  val read_line : BatInnerIO.input -> string
  val write_byte : 'BatInnerIO.output -> int -> unit
  val write_ui16 : 'BatInnerIO.output -> int -> unit
  val write_i16 : 'BatInnerIO.output -> int -> unit
  val write_i32 : 'BatInnerIO.output -> int -> unit
  val write_real_i32 : 'BatInnerIO.output -> int32 -> unit
  val write_i64 : 'BatInnerIO.output -> int64 -> unit
  val write_double : 'BatInnerIO.output -> float -> unit
  val write_float : 'BatInnerIO.output -> float -> unit
  val write_string : 'BatInnerIO.output -> string -> unit
  val write_line : 'BatInnerIO.output -> string -> unit
  external cast_output : 'BatInnerIO.output -> unit BatInnerIO.output
    = "%identity"
  val input_channel :
    ?autoclose:bool -> ?cleanup:bool -> Stdlib.in_channel -> BatInnerIO.input
  val output_channel :
    ?cleanup:bool -> Stdlib.out_channel -> unit BatInnerIO.output
  val stdin : BatInnerIO.input
  val stdout : unit BatInnerIO.output
  val stderr : unit BatInnerIO.output
  val stdnull : unit BatInnerIO.output
  module Input :
    sig
      type t = BatInnerIO.input
      val compare : BatInnerIO.input -> BatInnerIO.input -> int
      val hash : BatInnerIO.input -> int
      val equal : BatInnerIO.input -> BatInnerIO.input -> bool
    end
  module Output :
    sig
      type t = unit BatInnerIO.output
      val compare : 'BatInnerIO.output -> 'BatInnerIO.output -> int
      val hash : 'BatInnerIO.output -> int
      val equal : 'BatInnerIO.output -> 'BatInnerIO.output -> bool
    end
  external noop : unit -> unit = "%ignore"
  val get_output :
    'BatInnerIO.output -> Stdlib.Bytes.t -> int -> int -> int
  val get_flush : 'BatInnerIO.output -> unit -> unit
  val lock : BatConcurrent.lock Stdlib.ref
  val get_output_id : 'BatInnerIO.output -> int
  val get_input_id : BatInnerIO.input -> int
end