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 -> string -> int -> int -> int
  val really_input : BatInnerIO.input -> string -> int -> int -> int
  val close_in : BatInnerIO.input -> unit
  val write : 'BatInnerIO.output -> char -> unit
  val nwrite : 'BatInnerIO.output -> string -> unit
  val write_buf : 'BatInnerIO.output -> Buffer.t -> unit
  val output : 'BatInnerIO.output -> string -> int -> int -> int
  val really_output : '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 output_buffer : Buffer.t -> string BatInnerIO.output
  val on_close_out :
    'BatInnerIO.output -> ('BatInnerIO.output -> unit) -> unit
  val create_in :
    read:(unit -> char) ->
    input:(string -> int -> int -> int) ->
    close:(unit -> unit) -> BatInnerIO.input
  val inherit_in :
    ?read:(unit -> char) ->
    ?input:(string -> int -> int -> int) ->
    ?close:(unit -> unit) -> BatInnerIO.input -> BatInnerIO.input
  val wrap_in :
    read:(unit -> char) ->
    input:(string -> int -> int -> int) ->
    close:(unit -> unit) ->
    underlying:BatInnerIO.input list -> BatInnerIO.input
  val create_out :
    write:(char -> unit) ->
    output:(string -> int -> int -> int) ->
    flush:(unit -> unit) -> close:(unit -> 'a) -> 'BatInnerIO.output
  val inherit_out :
    ?write:(char -> unit) ->
    ?output:(string -> int -> int -> int) ->
    ?flush:(unit -> unit) ->
    ?close:(unit -> unit) -> 'BatInnerIO.output -> unit BatInnerIO.output
  val wrap_out :
    write:(char -> unit) ->
    output:(string -> 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 -> Pervasives.in_channel -> BatInnerIO.input
  val output_channel :
    ?cleanup:bool -> Pervasives.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
  module Printf :
    sig
      type ('a, 'b, 'c) t = ('a, 'b, 'c) Pervasives.format
      val printf : ('a, 'BatInnerIO.output, unit) BatInnerIO.Printf.t -> 'a
      val eprintf :
        ('a, 'BatInnerIO.output, unit) BatInnerIO.Printf.t -> 'a
      val sprintf : ('a, unit, string) BatInnerIO.Printf.t -> 'a
      val sprintf2 :
        ('a, 'BatInnerIO.output, unit, string) Pervasives.format4 -> 'a
      val fprintf :
        'BatInnerIO.output ->
        ('b, 'BatInnerIO.output, unit) BatInnerIO.Printf.t -> 'b
      val ifprintf :
        '-> ('b, 'BatInnerIO.output, unit) BatInnerIO.Printf.t -> 'b
      val bprintf :
        Buffer.t -> ('a, Buffer.t, unit) BatInnerIO.Printf.t -> 'a
      val bprintf2 :
        Buffer.t ->
        ('a, 'BatInnerIO.output, unit) BatInnerIO.Printf.t -> 'a
      val kfprintf :
        ('BatInnerIO.output -> 'b) ->
        'BatInnerIO.output ->
        ('c, 'BatInnerIO.output, unit, 'b) Pervasives.format4 -> 'c
      val ksprintf :
        (string -> 'a) -> ('b, unit, string, 'a) Pervasives.format4 -> 'b
      val ksprintf2 :
        (string -> 'a) ->
        ('b, 'BatInnerIO.output, unit, 'a) Pervasives.format4 -> 'b
      val kbprintf :
        (Buffer.t -> 'a) ->
        Buffer.t -> ('b, Buffer.t, unit, 'a) Pervasives.format4 -> 'b
      val kbprintf2 :
        (Buffer.t -> 'a) ->
        Buffer.t ->
        ('b, 'BatInnerIO.output, unit, 'a) Pervasives.format4 -> 'b
      val kprintf :
        (string -> 'a) -> ('b, unit, string, 'a) Pervasives.format4 -> 'b
    end
  val get_output : 'BatInnerIO.output -> string -> int -> int -> int
  val get_flush : 'BatInnerIO.output -> unit -> unit
  val lock : BatConcurrent.lock Pervasives.ref
  val get_output_id : 'BatInnerIO.output -> int
  val get_input_id : BatInnerIO.input -> int
end