sig
  class ['a, 'b] o_input :
    ('a, 'b) IO.input ->
    object
      method available : int
      method close : unit
      method nread : int -> 'b
      method pos : int
      method read : 'a
    end
  class ['a, 'b, 'c] o_output :
    ('a, 'b, 'c) IO.output ->
    object
      method close : 'c
      method flush : unit
      method nwrite : '-> unit
      method pos : int
      method write : '-> unit
    end
  val from_in : ('a, 'b) #IOO.o_input -> ('a, 'b) IO.input
  val from_out : ('a, 'b, 'c) #IOO.o_output -> ('a, 'b, 'c) IO.output
  class in_channel :
    ('a, string) IO.input ->
    object
      method close_in : unit -> unit
      method input : string -> int -> int -> int
    end
  class out_channel :
    ('a, string, 'b) IO.output ->
    object
      method close_out : unit -> unit
      method flush : unit -> unit
      method output : string -> int -> int -> int
    end
  class ['a] poly_in_channel :
    ('a, 'b) IO.input ->
    object method close_in : unit -> unit method get : unit -> 'end
  class ['a] poly_out_channel :
    ('a, 'b, 'c) IO.output ->
    object
      method close_out : unit -> unit
      method flush : unit -> unit
      method put : '-> unit
    end
  val from_in_channel : #IOO.in_channel -> (char, string) IO.input
  val from_out_channel : #IOO.out_channel -> (char, string, unit) IO.output
  val from_poly_in_channel :
    '#IOO.poly_in_channel -> ('a, 'a list) IO.input
  val from_str_in_channel :
    char #IOO.poly_in_channel -> (char, string) IO.input
  val from_poly_out_channel :
    '#IOO.poly_out_channel -> ('a, 'a list, unit) IO.output
  val from_str_out_channel :
    char #IOO.poly_out_channel -> (char, string, unit) IO.output
end