sig
  module Array :
    sig
      module type S =
        sig
          type elt
          type t
          val create : int -> CCRingBuffer.Array.S.t
          val length : CCRingBuffer.Array.S.t -> int
          val get : CCRingBuffer.Array.S.t -> int -> CCRingBuffer.Array.S.elt
          val set :
            CCRingBuffer.Array.S.t -> int -> CCRingBuffer.Array.S.elt -> unit
          val sub :
            CCRingBuffer.Array.S.t -> int -> int -> CCRingBuffer.Array.S.t
          val copy : CCRingBuffer.Array.S.t -> CCRingBuffer.Array.S.t
          val blit :
            CCRingBuffer.Array.S.t ->
            int -> CCRingBuffer.Array.S.t -> int -> int -> unit
          val iter :
            (CCRingBuffer.Array.S.elt -> unit) ->
            CCRingBuffer.Array.S.t -> unit
        end
      module Byte :
        sig
          type elt = char
          type t = Bytes.t
          val create : int -> t
          val length : t -> int
          val get : t -> int -> elt
          val set : t -> int -> elt -> unit
          val sub : t -> int -> int -> t
          val copy : t -> t
          val blit : t -> int -> t -> int -> int -> unit
          val iter : (elt -> unit) -> t -> unit
        end
      module Make :
        functor
          (Elt : sig type t val dummy : CCRingBuffer.Array.Make.t end->
          sig
            type elt = Elt.t
            type t = Elt.t array
            val create : int -> t
            val length : t -> int
            val get : t -> int -> elt
            val set : t -> int -> elt -> unit
            val sub : t -> int -> int -> t
            val copy : t -> t
            val blit : t -> int -> t -> int -> int -> unit
            val iter : (elt -> unit) -> t -> unit
          end
    end
  module type S =
    sig
      module Array : Array.S
      type t
      exception Empty
      val create : int -> CCRingBuffer.S.t
      val copy : CCRingBuffer.S.t -> CCRingBuffer.S.t
      val capacity : CCRingBuffer.S.t -> int
      val length : CCRingBuffer.S.t -> int
      val is_full : CCRingBuffer.S.t -> bool
      val blit_from : CCRingBuffer.S.t -> Array.t -> int -> int -> unit
      val blit_into : CCRingBuffer.S.t -> Array.t -> int -> int -> int
      val append : CCRingBuffer.S.t -> into:CCRingBuffer.S.t -> unit
      val to_list : CCRingBuffer.S.t -> Array.elt list
      val clear : CCRingBuffer.S.t -> unit
      val is_empty : CCRingBuffer.S.t -> bool
      val junk_front : CCRingBuffer.S.t -> unit
      val junk_back : CCRingBuffer.S.t -> unit
      val skip : CCRingBuffer.S.t -> int -> unit
      val iter : CCRingBuffer.S.t -> f:(Array.elt -> unit) -> unit
      val iteri : CCRingBuffer.S.t -> f:(int -> Array.elt -> unit) -> unit
      val get_front : CCRingBuffer.S.t -> int -> Array.elt
      val get_back : CCRingBuffer.S.t -> int -> Array.elt
      val push_back : CCRingBuffer.S.t -> Array.elt -> unit
      val peek_front : CCRingBuffer.S.t -> Array.elt option
      val peek_front_exn : CCRingBuffer.S.t -> Array.elt
      val peek_back : CCRingBuffer.S.t -> Array.elt option
      val peek_back_exn : CCRingBuffer.S.t -> Array.elt
      val take_back : CCRingBuffer.S.t -> Array.elt option
      val take_back_exn : CCRingBuffer.S.t -> Array.elt
      val take_front : CCRingBuffer.S.t -> Array.elt option
      val take_front_exn : CCRingBuffer.S.t -> Array.elt
      val of_array : Array.t -> CCRingBuffer.S.t
      val to_array : CCRingBuffer.S.t -> Array.t
    end
  module Byte :
    sig
      module Array :
        sig
          type elt = char
          type t = Bytes.t
          val create : int -> t
          val length : t -> int
          val get : t -> int -> elt
          val set : t -> int -> elt -> unit
          val sub : t -> int -> int -> t
          val copy : t -> t
          val blit : t -> int -> t -> int -> int -> unit
          val iter : (elt -> unit) -> t -> unit
        end
      type t
      exception Empty
      val create : int -> t
      val copy : t -> t
      val capacity : t -> int
      val length : t -> int
      val is_full : t -> bool
      val blit_from : t -> Array.t -> int -> int -> unit
      val blit_into : t -> Array.t -> int -> int -> int
      val append : t -> into:t -> unit
      val to_list : t -> Array.elt list
      val clear : t -> unit
      val is_empty : t -> bool
      val junk_front : t -> unit
      val junk_back : t -> unit
      val skip : t -> int -> unit
      val iter : t -> f:(Array.elt -> unit) -> unit
      val iteri : t -> f:(int -> Array.elt -> unit) -> unit
      val get_front : t -> int -> Array.elt
      val get_back : t -> int -> Array.elt
      val push_back : t -> Array.elt -> unit
      val peek_front : t -> Array.elt option
      val peek_front_exn : t -> Array.elt
      val peek_back : t -> Array.elt option
      val peek_back_exn : t -> Array.elt
      val take_back : t -> Array.elt option
      val take_back_exn : t -> Array.elt
      val take_front : t -> Array.elt option
      val take_front_exn : t -> Array.elt
      val of_array : Array.t -> t
      val to_array : t -> Array.t
    end
  module MakeFromArray :
    functor (A : Array.S->
      sig
        module Array :
          sig
            type elt = A.elt
            type t = A.t
            val create : int -> t
            val length : t -> int
            val get : t -> int -> elt
            val set : t -> int -> elt -> unit
            val sub : t -> int -> int -> t
            val copy : t -> t
            val blit : t -> int -> t -> int -> int -> unit
            val iter : (elt -> unit) -> t -> unit
          end
        type t
        exception Empty
        val create : int -> t
        val copy : t -> t
        val capacity : t -> int
        val length : t -> int
        val is_full : t -> bool
        val blit_from : t -> Array.t -> int -> int -> unit
        val blit_into : t -> Array.t -> int -> int -> int
        val append : t -> into:t -> unit
        val to_list : t -> Array.elt list
        val clear : t -> unit
        val is_empty : t -> bool
        val junk_front : t -> unit
        val junk_back : t -> unit
        val skip : t -> int -> unit
        val iter : t -> f:(Array.elt -> unit) -> unit
        val iteri : t -> f:(int -> Array.elt -> unit) -> unit
        val get_front : t -> int -> Array.elt
        val get_back : t -> int -> Array.elt
        val push_back : t -> Array.elt -> unit
        val peek_front : t -> Array.elt option
        val peek_front_exn : t -> Array.elt
        val peek_back : t -> Array.elt option
        val peek_back_exn : t -> Array.elt
        val take_back : t -> Array.elt option
        val take_back_exn : t -> Array.elt
        val take_front : t -> Array.elt option
        val take_front_exn : t -> Array.elt
        val of_array : Array.t -> t
        val to_array : t -> Array.t
      end
  module Make :
    functor (X : sig type t val dummy : CCRingBuffer.Make.t end->
      sig
        module Array :
          sig
            type elt = X.t
            type t = X.t array
            val create : int -> t
            val length : t -> int
            val get : t -> int -> elt
            val set : t -> int -> elt -> unit
            val sub : t -> int -> int -> t
            val copy : t -> t
            val blit : t -> int -> t -> int -> int -> unit
            val iter : (elt -> unit) -> t -> unit
          end
        type t
        exception Empty
        val create : int -> t
        val copy : t -> t
        val capacity : t -> int
        val length : t -> int
        val is_full : t -> bool
        val blit_from : t -> Array.t -> int -> int -> unit
        val blit_into : t -> Array.t -> int -> int -> int
        val append : t -> into:t -> unit
        val to_list : t -> Array.elt list
        val clear : t -> unit
        val is_empty : t -> bool
        val junk_front : t -> unit
        val junk_back : t -> unit
        val skip : t -> int -> unit
        val iter : t -> f:(Array.elt -> unit) -> unit
        val iteri : t -> f:(int -> Array.elt -> unit) -> unit
        val get_front : t -> int -> Array.elt
        val get_back : t -> int -> Array.elt
        val push_back : t -> Array.elt -> unit
        val peek_front : t -> Array.elt option
        val peek_front_exn : t -> Array.elt
        val peek_back : t -> Array.elt option
        val peek_back_exn : t -> Array.elt
        val take_back : t -> Array.elt option
        val take_back_exn : t -> Array.elt
        val take_front : t -> Array.elt option
        val take_front_exn : t -> Array.elt
        val of_array : Array.t -> t
        val to_array : t -> Array.t
      end
end