sig
  type 'a t
  val connect :
    ?timeout:float ->
    ?ping:string -> string -> int -> '-> 'Procord_connection.t
  val update : 'Procord_connection.t -> unit
  type state =
      Connecting
    | Connected
    | Disconnecting
    | Disconnected of (Unix.error * string * string) option
  val state : 'Procord_connection.t -> Procord_connection.state
  val alive : 'Procord_connection.t -> bool
  val send : 'Procord_connection.t -> string -> unit
  val receive : 'Procord_connection.t -> int -> string option
  val receive_poll : 'Procord_connection.t -> int -> int -> string option
  val receive_poll_part : 'Procord_connection.t -> int -> int -> string
  val receive_all : 'Procord_connection.t -> string
  val receive_part : 'Procord_connection.t -> int -> string
  val receive_forget : 'Procord_connection.t -> int -> unit
  val receive_buffer_length : 'Procord_connection.t -> int
  val receive_buffer_empty : 'Procord_connection.t -> bool
  val close : 'Procord_connection.t -> unit
  val close_nicely : ?timeout:float -> 'Procord_connection.t -> unit
  val data : 'Procord_connection.t -> 'a
  val timeout : 'Procord_connection.t -> float option
  module Sync :
    sig
      val connect :
        ?timeout:float ->
        ?ping:string -> string -> int -> '-> 'Procord_connection.t
      val close_nicely : ?timeout:float -> 'Procord_connection.t -> unit
      val send : 'Procord_connection.t -> string -> unit
      val receive : 'Procord_connection.t -> int -> string option
    end
  val remote_address : 'Procord_connection.t -> Unix.sockaddr
  val make_address : string -> Unix.inet_addr
  type 'a set
  val empty_set : unit -> 'Procord_connection.set
  val accept_into_set :
    ?timeout:float ->
    ?ping:string ->
    Unix.file_descr ->
    (Unix.sockaddr -> 'a option) -> 'Procord_connection.set -> unit
  val update_set : 'Procord_connection.set -> unit
  val iter :
    'Procord_connection.set -> ('Procord_connection.t -> unit) -> unit
  type waiter
  val waiter : 'Procord_connection.t -> Procord_connection.waiter
  val waiter_of_listening_socket :
    Unix.file_descr -> Procord_connection.waiter
  val waiter_of_set : 'Procord_connection.set -> Procord_connection.waiter
  val waiter_custom :
    ?read:Unix.file_descr list ->
    ?write:Unix.file_descr list ->
    ?except:Unix.file_descr list -> unit -> Procord_connection.waiter
  val waiter_of_list :
    Procord_connection.waiter list -> Procord_connection.waiter
  val instanciate_waiter :
    Procord_connection.waiter ->
    Unix.file_descr list * Unix.file_descr list * Unix.file_descr list
  val wait : ?timeout:float -> Procord_connection.waiter -> bool
  val wait' : ?timeout:float -> Procord_connection.waiter -> unit
  val custom :
    ?timeout:float ->
    ?ping:string ->
    ?input:Unix.file_descr ->
    ?output:Unix.file_descr ->
    ?remote_address:Unix.sockaddr -> '-> 'Procord_connection.t
end