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