sig
  module type Elt =
    sig
      type t
      val create : unit -> Ringbuffer.Elt.t
      val blit :
        Ringbuffer.Elt.t array ->
        int -> Ringbuffer.Elt.t array -> int -> int -> unit
    end
  module type R =
    sig
      type elt
      type buffer = Ringbuffer.R.elt array
      type t
      val create : int -> Ringbuffer.R.t
      val read_space : Ringbuffer.R.t -> int
      val write_space : Ringbuffer.R.t -> int
      val read_advance : Ringbuffer.R.t -> int -> unit
      val write_advance : Ringbuffer.R.t -> int -> unit
      val read : Ringbuffer.R.t -> Ringbuffer.R.buffer -> int -> int -> unit
      val peek : Ringbuffer.R.t -> Ringbuffer.R.buffer -> int -> int -> unit
      val write : Ringbuffer.R.t -> Ringbuffer.R.buffer -> int -> int -> unit
      val transmit :
        Ringbuffer.R.t -> (Ringbuffer.R.buffer -> int -> int -> int) -> int
    end
  module Make :
    functor (E : Elt->
      sig
        type elt = E.t
        type buffer = elt array
        type t
        val create : int -> t
        val read_space : t -> int
        val write_space : t -> int
        val read_advance : t -> int -> unit
        val write_advance : t -> int -> unit
        val read : t -> buffer -> int -> int -> unit
        val peek : t -> buffer -> int -> int -> unit
        val write : t -> buffer -> int -> int -> unit
        val transmit : t -> (buffer -> int -> int -> int) -> int
      end
  module Make_ext :
    functor (E : Elt->
      sig
        type elt = E.t
        type buffer = elt array
        type t
        val create : int -> t
        val read_space : t -> int
        val write_space : t -> int
        val read_advance : t -> int -> unit
        val write_advance : t -> int -> unit
        val read : t -> buffer -> int -> int -> unit
        val peek : t -> buffer -> int -> int -> unit
        val write : t -> buffer -> int -> int -> unit
        val transmit : t -> (buffer -> int -> int -> int) -> int
      end
end