sig
  type seek = Iobuf_intf.seek
  type no_seek = Iobuf_intf.no_seek
  type ('data_perm_read_write, 'seek_permission) t =
      ('data_perm_read_write, 'seek_permission) Iobuf.t
  val invariant :
    'Core_kernel.Invariant_intf.inv ->
    'Core_kernel.Invariant_intf.inv ->
    ('a, 'b) t Core_kernel.Invariant_intf.inv
  val create : len:int -> ('a, 'b) t
  val of_bigstring : ?pos:int -> ?len:int -> Bigstring.t -> ('a, 'b) t
  val of_string : string -> ('a, 'b) t
  val sub : ?pos:int -> ?len:int -> ('d, 'a) t -> ('d, 'b) t
  val set_bounds_and_buffer :
    src:(Common.read_write, 'a) t -> dst:('b, seek) t -> unit
  val set_bounds_and_buffer_sub :
    ?pos:int ->
    ?len:int ->
    src:(Common.read_write, 'a) t -> dst:('b, seek) t -> unit -> unit
  val capacity : ('a, 'b) t -> int
  val length : ('a, 'b) t -> int
  val is_empty : ('a, 'b) t -> bool
  val narrow : ('a, seek) t -> unit
  module type Bound =
    sig
      type t
      val window : ('a, 'b) t -> t
      val limit : ('a, 'b) t -> t
      val restore : t -> ('a, Iobuf_intf.seek) t -> unit
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  module Lo_bound :
    sig
      type t = Iobuf.Lo_bound.t
      val window : ('a, 'b) t -> t
      val limit : ('a, 'b) t -> t
      val restore : t -> ('a, Iobuf_intf.seek) t -> unit
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  module Hi_bound :
    sig
      type t = Iobuf.Hi_bound.t
      val window : ('a, 'b) t -> t
      val limit : ('a, 'b) t -> t
      val restore : t -> ('a, Iobuf_intf.seek) t -> unit
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  val advance : ('a, seek) t -> int -> unit
  val resize : ('a, seek) t -> len:int -> unit
  val rewind : ('a, seek) t -> unit
  val reset : ('a, seek) t -> unit
  val flip_lo : ('a, seek) t -> unit
  val bounded_flip_lo : ('a, seek) t -> Lo_bound.t -> unit
  val compact : (Common.read_write, seek) t -> unit
  val bounded_compact :
    (Common.read_write, seek) t -> Lo_bound.t -> Hi_bound.t -> unit
  val flip_hi : ('a, seek) t -> unit
  val bounded_flip_hi : ('a, seek) t -> Hi_bound.t -> unit
  val to_string : ?len:int -> ('a, 'b) t -> string
  val consume_into_string :
    ?pos:int -> ?len:int -> ('a, seek) t -> string -> unit
  val consume_into_bigstring :
    ?pos:int -> ?len:int -> ('a, seek) t -> Bigstring.t -> unit
  module Consume :
    sig
      type ('a, 'd, 'w) t = ('d, seek) t -> 'a
      val char : (char, 'd, 'w) t
      val int8 : (int, 'd, 'w) t
      val int16_be : (int, 'd, 'w) t
      val int16_le : (int, 'd, 'w) t
      val int32_be : (int, 'd, 'w) t
      val int32_le : (int, 'd, 'w) t
      val uint8 : (int, 'd, 'w) t
      val uint16_be : (int, 'd, 'w) t
      val uint16_le : (int, 'd, 'w) t
      val uint32_be : (int, 'd, 'w) t
      val uint32_le : (int, 'd, 'w) t
      val int64_be : (int, 'd, 'w) t
      val int64_le : (int, 'd, 'w) t
      val int64_t_be : (Int64.t, 'd, 'w) t
      val int64_t_le : (Int64.t, 'd, 'w) t
      val padded_fixed_string : padding:char -> len:int -> (string, 'd, 'w) t
      val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
      val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
    end
  module Fill :
    sig
      type ('a, 'd, 'w) t = (Common.read_write, seek) t -> '-> unit
      val char : (char, 'd, 'w) t
      val int8 : (int, 'd, 'w) t
      val int16_be : (int, 'd, 'w) t
      val int16_le : (int, 'd, 'w) t
      val int32_be : (int, 'd, 'w) t
      val int32_le : (int, 'd, 'w) t
      val uint8 : (int, 'd, 'w) t
      val uint16_be : (int, 'd, 'w) t
      val uint16_le : (int, 'd, 'w) t
      val uint32_be : (int, 'd, 'w) t
      val uint32_le : (int, 'd, 'w) t
      val int64_be : (int, 'd, 'w) t
      val int64_le : (int, 'd, 'w) t
      val int64_t_be : (Int64.t, 'd, 'w) t
      val int64_t_le : (Int64.t, 'd, 'w) t
      val padded_fixed_string : padding:char -> len:int -> (string, 'd, 'w) t
      val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
      val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
    end
  module Peek :
    sig
      type ('a, 'd, 'w) t = ('d, 'w) t -> pos:int -> 'a
      val char : (char, 'd, 'w) t
      val int8 : (int, 'd, 'w) t
      val int16_be : (int, 'd, 'w) t
      val int16_le : (int, 'd, 'w) t
      val int32_be : (int, 'd, 'w) t
      val int32_le : (int, 'd, 'w) t
      val uint8 : (int, 'd, 'w) t
      val uint16_be : (int, 'd, 'w) t
      val uint16_le : (int, 'd, 'w) t
      val uint32_be : (int, 'd, 'w) t
      val uint32_le : (int, 'd, 'w) t
      val int64_be : (int, 'd, 'w) t
      val int64_le : (int, 'd, 'w) t
      val int64_t_be : (Int64.t, 'd, 'w) t
      val int64_t_le : (Int64.t, 'd, 'w) t
      val padded_fixed_string : padding:char -> len:int -> (string, 'd, 'w) t
      val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
      val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
    end
  module Poke :
    sig
      type ('a, 'd, 'w) t =
          (Common.read_write, 'w) t -> pos:int -> '-> unit
      val char : (char, 'd, 'w) t
      val int8 : (int, 'd, 'w) t
      val int16_be : (int, 'd, 'w) t
      val int16_le : (int, 'd, 'w) t
      val int32_be : (int, 'd, 'w) t
      val int32_le : (int, 'd, 'w) t
      val uint8 : (int, 'd, 'w) t
      val uint16_be : (int, 'd, 'w) t
      val uint16_le : (int, 'd, 'w) t
      val uint32_be : (int, 'd, 'w) t
      val uint32_le : (int, 'd, 'w) t
      val int64_be : (int, 'd, 'w) t
      val int64_le : (int, 'd, 'w) t
      val int64_t_be : (Int64.t, 'd, 'w) t
      val int64_t_le : (Int64.t, 'd, 'w) t
      val padded_fixed_string : padding:char -> len:int -> (string, 'd, 'w) t
      val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
      val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
    end
  module Unsafe :
    sig
      module Consume :
        sig
          type ('a, 'd, 'w) t = ('d, seek) t -> 'a
          val char : (char, 'd, 'w) t
          val int8 : (int, 'd, 'w) t
          val int16_be : (int, 'd, 'w) t
          val int16_le : (int, 'd, 'w) t
          val int32_be : (int, 'd, 'w) t
          val int32_le : (int, 'd, 'w) t
          val uint8 : (int, 'd, 'w) t
          val uint16_be : (int, 'd, 'w) t
          val uint16_le : (int, 'd, 'w) t
          val uint32_be : (int, 'd, 'w) t
          val uint32_le : (int, 'd, 'w) t
          val int64_be : (int, 'd, 'w) t
          val int64_le : (int, 'd, 'w) t
          val int64_t_be : (Int64.t, 'd, 'w) t
          val int64_t_le : (Int64.t, 'd, 'w) t
          val padded_fixed_string :
            padding:char -> len:int -> (string, 'd, 'w) t
          val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
          val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
        end
      module Fill :
        sig
          type ('a, 'd, 'w) t = (Common.read_write, seek) t -> '-> unit
          val char : (char, 'd, 'w) t
          val int8 : (int, 'd, 'w) t
          val int16_be : (int, 'd, 'w) t
          val int16_le : (int, 'd, 'w) t
          val int32_be : (int, 'd, 'w) t
          val int32_le : (int, 'd, 'w) t
          val uint8 : (int, 'd, 'w) t
          val uint16_be : (int, 'd, 'w) t
          val uint16_le : (int, 'd, 'w) t
          val uint32_be : (int, 'd, 'w) t
          val uint32_le : (int, 'd, 'w) t
          val int64_be : (int, 'd, 'w) t
          val int64_le : (int, 'd, 'w) t
          val int64_t_be : (Int64.t, 'd, 'w) t
          val int64_t_le : (Int64.t, 'd, 'w) t
          val padded_fixed_string :
            padding:char -> len:int -> (string, 'd, 'w) t
          val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
          val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
        end
      module Peek :
        sig
          type ('a, 'd, 'w) t = ('d, 'w) t -> pos:int -> 'a
          val char : (char, 'd, 'w) t
          val int8 : (int, 'd, 'w) t
          val int16_be : (int, 'd, 'w) t
          val int16_le : (int, 'd, 'w) t
          val int32_be : (int, 'd, 'w) t
          val int32_le : (int, 'd, 'w) t
          val uint8 : (int, 'd, 'w) t
          val uint16_be : (int, 'd, 'w) t
          val uint16_le : (int, 'd, 'w) t
          val uint32_be : (int, 'd, 'w) t
          val uint32_le : (int, 'd, 'w) t
          val int64_be : (int, 'd, 'w) t
          val int64_le : (int, 'd, 'w) t
          val int64_t_be : (Int64.t, 'd, 'w) t
          val int64_t_le : (Int64.t, 'd, 'w) t
          val padded_fixed_string :
            padding:char -> len:int -> (string, 'd, 'w) t
          val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
          val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
        end
      module Poke :
        sig
          type ('a, 'd, 'w) t =
              (Common.read_write, 'w) t -> pos:int -> '-> unit
          val char : (char, 'd, 'w) t
          val int8 : (int, 'd, 'w) t
          val int16_be : (int, 'd, 'w) t
          val int16_le : (int, 'd, 'w) t
          val int32_be : (int, 'd, 'w) t
          val int32_le : (int, 'd, 'w) t
          val uint8 : (int, 'd, 'w) t
          val uint16_be : (int, 'd, 'w) t
          val uint16_le : (int, 'd, 'w) t
          val uint32_be : (int, 'd, 'w) t
          val uint32_le : (int, 'd, 'w) t
          val int64_be : (int, 'd, 'w) t
          val int64_le : (int, 'd, 'w) t
          val int64_t_be : (Int64.t, 'd, 'w) t
          val int64_t_le : (Int64.t, 'd, 'w) t
          val padded_fixed_string :
            padding:char -> len:int -> (string, 'd, 'w) t
          val string : ?str_pos:int -> ?len:int -> (string, 'd, 'w) t
          val bigstring : ?str_pos:int -> ?len:int -> (Bigstring.t, 'd, 'w) t
        end
    end
  val fill_bin_prot :
    (Common.read_write, seek) t ->
    'Bin_prot.Type_class.writer -> '-> unit Or_error.t
  val consume_bin_prot :
    ('b, seek) t -> 'Bin_prot.Type_class.reader -> 'Or_error.t
  val transfer :
    ?len:int -> src:('a, seek) t -> dst:(Common.read_write, seek) t -> unit
  val memmove :
    (Common.read_write, 'a) t ->
    src_pos:int -> dst_pos:int -> len:int -> unit
  val read_assume_fd_is_nonblocking :
    (Common.read_write, seek) t -> Iobuf_intf.Unix.File_descr.t -> int
  val pread_assume_fd_is_nonblocking :
    (Common.read_write, seek) t ->
    Iobuf_intf.Unix.File_descr.t -> offset:int -> int
  val recvfrom_assume_fd_is_nonblocking :
    (Common.read_write, seek) t ->
    Iobuf_intf.Unix.File_descr.t -> int * Iobuf_intf.Unix.sockaddr
  val recvmmsg_assume_fd_is_nonblocking :
    (Iobuf_intf.Unix.File_descr.t ->
     ?count:int ->
     ?srcs:Iobuf_intf.Unix.sockaddr array ->
     (Common.read_write, seek) t array -> int)
    Or_error.t
  val send_nonblocking_no_sigpipe :
    unit ->
    (('a, seek) t -> Iobuf_intf.Unix.File_descr.t -> int option) Or_error.t
  val sendto_nonblocking_no_sigpipe :
    unit ->
    (('a, seek) t ->
     Iobuf_intf.Unix.File_descr.t -> Iobuf_intf.Unix.sockaddr -> int option)
    Or_error.t
  val write_assume_fd_is_nonblocking :
    ('a, seek) t -> Iobuf_intf.Unix.File_descr.t -> int
  val pwrite_assume_fd_is_nonblocking :
    ('a, seek) t -> Iobuf_intf.Unix.File_descr.t -> offset:int -> int
  val sexp_of_seek : seek -> Sexplib.Sexp.t
  val sexp_of_no_seek : no_seek -> Sexplib.Sexp.t
  val sexp_of_t :
    ('data_perm_read_write -> Sexplib.Sexp.t) ->
    ('seek_permission -> Sexplib.Sexp.t) ->
    ('data_perm_read_write, 'seek_permission) t -> Sexplib.Sexp.t
end