sig
  type socket
  module Io :
    sig
      type socket = socket
      type marker = Length of int | Split of string
      type bigarray =
          (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
          Bigarray.Array1.t
      type failure =
          Io_error
        | Unix of Unix.error * string * string
        | Unknown of exn
        | Timeout
      val read :
        ?recursive:bool ->
        ?init:string ->
        ?on_error:(string * failure -> unit) ->
        ?timeout:float ->
        priority:'->
        'a scheduler ->
        socket -> marker -> (string * string option -> unit) -> unit
      val write :
        ?exec:(unit -> unit) ->
        ?on_error:(failure -> unit) ->
        ?bigarray:bigarray ->
        ?string:Bytes.t ->
        ?timeout:float -> priority:'-> 'a scheduler -> socket -> unit
    end
  type ('a, 'b) handler = {
    scheduler : 'Duppy.scheduler;
    socket : Duppy.Monad.Monad_io_t.Io.socket;
    mutable data : string;
    on_error : Duppy.Monad.Monad_io_t.Io.failure -> 'b;
  }
  val exec :
    ?delay:float ->
    priority:'->
    ('a, 'b) Duppy.Monad.Monad_io_t.handler ->
    ('c, 'b) Duppy.Monad.t -> ('c, 'b) Duppy.Monad.t
  val delay :
    priority:'->
    ('a, 'b) Duppy.Monad.Monad_io_t.handler ->
    float -> (unit, 'b) Duppy.Monad.t
  val read :
    ?timeout:float ->
    priority:'->
    marker:Duppy.Monad.Monad_io_t.Io.marker ->
    ('a, 'b) Duppy.Monad.Monad_io_t.handler -> (string, 'b) Duppy.Monad.t
  val read_all :
    ?timeout:float ->
    priority:'->
    'Duppy.scheduler ->
    Duppy.Monad.Monad_io_t.Io.socket ->
    (string, string * Duppy.Monad.Monad_io_t.Io.failure) Duppy.Monad.t
  val write :
    ?timeout:float ->
    priority:'->
    ('a, 'b) Duppy.Monad.Monad_io_t.handler ->
    Stdlib.Bytes.t -> (unit, 'b) Duppy.Monad.t
  val write_bigarray :
    ?timeout:float ->
    priority:'->
    ('a, 'b) Duppy.Monad.Monad_io_t.handler ->
    Duppy.Monad.Monad_io_t.Io.bigarray -> (unit, 'b) Duppy.Monad.t
end