functor (S : Strat.T) ->
  functor (Impl : Implementation) ->
    sig
      module Strategy :
        sig
          type t = S.t
          val default : t
          val grow : t -> int -> int
          val shrink : t -> real_len:int -> new_len:int -> int
        end
      type strategy = Pres_impl.Make.Strategy.t
      type 'a t = {
        mutable ar : 'a option Impl.t;
        mutable vlix : int;
        mutable strategy : Pres_impl.Make.strategy;
      }
      val name : string
      val invalid_arg : string -> 'a
      val failwith : string -> 'a
      val length : 'a Pres_impl.Make.t -> int
      val lix : 'a Pres_impl.Make.t -> int
      val real_length : 'a Pres_impl.Make.t -> int
      val real_lix : 'a Pres_impl.Make.t -> int
      val unsafe_get_ar : 'a option Impl.t -> int -> 'a
      val unsafe_get : 'a Pres_impl.Make.t -> int -> 'a
      val unsafe_set_ar : 'a option Impl.t -> int -> 'a -> unit
      val unsafe_set : 'a Pres_impl.Make.t -> int -> 'a -> unit
      val get : 'a Pres_impl.Make.t -> int -> 'a
      val set : 'a Pres_impl.Make.t -> int -> 'a -> unit
      val creator : int -> 'a option Impl.t
      val screate_fresh :
        Pres_impl.Make.strategy -> int -> 'a Pres_impl.Make.t
      val create_fresh : int -> 'a Pres_impl.Make.t
      val create_from : 'a Pres_impl.Make.t -> 'b Pres_impl.Make.t
      val sempty : Pres_impl.Make.strategy -> 'a Pres_impl.Make.t
      val empty : unit -> 'a Pres_impl.Make.t
      val screate :
        Pres_impl.Make.strategy -> int -> 'a -> 'a Pres_impl.Make.t
      val smake : Pres_impl.Make.strategy -> int -> 'a -> 'a Pres_impl.Make.t
      val create : int -> 'a -> 'a Pres_impl.Make.t
      val make : int -> 'a -> 'a Pres_impl.Make.t
      val sinit :
        Pres_impl.Make.strategy -> int -> (int -> 'a) -> 'a Pres_impl.Make.t
      val init : int -> (int -> 'a) -> 'a Pres_impl.Make.t
      val to_array : 'a Pres_impl.Make.t -> 'a array
      val sof_array :
        Pres_impl.Make.strategy -> 'a array -> 'a Pres_impl.Make.t
      val of_array : 'a array -> 'a Pres_impl.Make.t
      val get_strategy : 'a Pres_impl.Make.t -> Pres_impl.Make.strategy
      val resizer : int -> 'a Pres_impl.Make.t -> int -> unit
      val enforce_strategy : 'a Pres_impl.Make.t -> unit
      val set_strategy :
        'a Pres_impl.Make.t -> Pres_impl.Make.strategy -> unit
      val put_strategy :
        'a Pres_impl.Make.t -> Pres_impl.Make.strategy -> unit
      val make_matrix :
        int -> int -> 'a -> 'a Pres_impl.Make.t Pres_impl.Make.t
      val copy : 'a Pres_impl.Make.t -> 'a Pres_impl.Make.t
      val unsafe_blit_on_other :
        'a Pres_impl.Make.t ->
        int -> 'a Pres_impl.Make.t -> int -> int -> unit
      val append :
        'a Pres_impl.Make.t -> 'a Pres_impl.Make.t -> 'a Pres_impl.Make.t
      val concat_aux :
        'a Pres_impl.Make.t ->
        int -> 'a Pres_impl.Make.t list -> 'a Pres_impl.Make.t
      val concat : 'a Pres_impl.Make.t list -> 'a Pres_impl.Make.t
      val unsafe_sub :
        'a Pres_impl.Make.t -> int -> int -> 'a Pres_impl.Make.t
      val sub : 'a Pres_impl.Make.t -> int -> int -> 'a Pres_impl.Make.t
      val guarantee_ix : 'a Pres_impl.Make.t -> int -> unit
      val maybe_grow_ix : 'a Pres_impl.Make.t -> int -> unit
      val add_one : 'a Pres_impl.Make.t -> 'a -> unit
      val unsafe_remove_one : 'a Pres_impl.Make.t -> unit
      val remove_one : 'a Pres_impl.Make.t -> unit
      val unsafe_remove_n : 'a Pres_impl.Make.t -> int -> unit
      val remove_n : 'a Pres_impl.Make.t -> int -> unit
      val unsafe_remove_range : 'a Pres_impl.Make.t -> int -> int -> unit
      val remove_range : 'a Pres_impl.Make.t -> int -> int -> unit
      val clear : 'a Pres_impl.Make.t -> unit
      val unsafe_swap : 'a Pres_impl.Make.t -> int -> int -> unit
      val swap : 'a Pres_impl.Make.t -> int -> int -> unit
      val unsafe_swap_in_last : 'a Pres_impl.Make.t -> int -> unit
      val swap_in_last : 'a Pres_impl.Make.t -> int -> unit
      val unsafe_fill : 'a Pres_impl.Make.t -> int -> int -> 'a -> unit
      val fill : 'a Pres_impl.Make.t -> int -> int -> 'a -> unit
      val unsafe_blit :
        'a Pres_impl.Make.t ->
        int -> 'a Pres_impl.Make.t -> int -> int -> unit
      val blit :
        'a Pres_impl.Make.t ->
        int -> 'a Pres_impl.Make.t -> int -> int -> unit
      val to_list_aux : 'a option Impl.t -> int -> 'a list -> 'a list
      val to_list : 'a Pres_impl.Make.t -> 'a list
      val of_list_aux : 'a option Impl.t -> int -> 'a list -> unit
      val of_list : 'a list -> 'a Pres_impl.Make.t
      val sof_list :
        Pres_impl.Make.strategy -> 'a list -> 'a Pres_impl.Make.t
      val iter : ('a -> 'b) -> 'a Pres_impl.Make.t -> unit
      val map : ('a -> 'b) -> 'a Pres_impl.Make.t -> 'b Pres_impl.Make.t
      val iteri : (int -> 'a -> 'b) -> 'a Pres_impl.Make.t -> unit
      val mapi :
        (int -> 'a -> 'b) -> 'a Pres_impl.Make.t -> 'b Pres_impl.Make.t
      val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b Pres_impl.Make.t -> 'a
      val fold_right : ('a -> 'b -> 'b) -> 'a Pres_impl.Make.t -> 'b -> 'b
      val for_all_aux : int -> ('a -> bool) -> 'a Pres_impl.Make.t -> bool
      val for_all : ('a -> bool) -> 'a Pres_impl.Make.t -> bool
      val exists_aux : int -> ('a -> bool) -> 'a Pres_impl.Make.t -> bool
      val exists : ('a -> bool) -> 'a Pres_impl.Make.t -> bool
      val mem_aux : int -> 'a -> 'a Pres_impl.Make.t -> bool
      val mem : 'a -> 'a Pres_impl.Make.t -> bool
      val memq_aux : int -> 'a -> 'a Pres_impl.Make.t -> bool
      val memq : 'a -> 'a Pres_impl.Make.t -> bool
      val pos_aux : int -> 'a -> 'a Pres_impl.Make.t -> int option
      val pos : 'a -> 'a Pres_impl.Make.t -> int option
      val posq_aux : int -> 'a -> 'a Pres_impl.Make.t -> int option
      val posq : 'a -> 'a Pres_impl.Make.t -> int option
      val find_aux : int -> ('a -> bool) -> 'a Pres_impl.Make.t -> 'a
      val find : ('a -> bool) -> 'a Pres_impl.Make.t -> 'a
      val find_index_aux : ('a -> bool) -> 'a Pres_impl.Make.t -> int -> int
      val find_index : ('a -> bool) -> 'a Pres_impl.Make.t -> int -> int
      val filter : ('a -> bool) -> 'a Pres_impl.Make.t -> 'a Pres_impl.Make.t
      val find_all :
        ('a -> bool) -> 'a Pres_impl.Make.t -> 'a Pres_impl.Make.t
      val filter_in_place : ('a -> bool) -> 'a Pres_impl.Make.t -> unit
      val partition :
        ('a -> bool) ->
        'a Pres_impl.Make.t -> 'a Pres_impl.Make.t * 'a Pres_impl.Make.t
    end