sig
  type ('a, 'b) type_class =
    ('a, 'b) Container.type_class = {
    length : '-> int;
    is_empty : '-> bool;
    iter : '-> f:('-> unit) -> unit;
    fold : 'c. '-> init:'-> f:('-> '-> 'c) -> 'c;
    exists : '-> f:('-> bool) -> bool;
    for_all : '-> f:('-> bool) -> bool;
    find : '-> f:('-> bool) -> 'a option;
    to_list : '-> 'a list;
    to_array : '-> 'a array;
  }
  type ('a, 'b) fold =
    ('a, 'b) Container.fold = {
    f : 'c. '-> init:'-> f:('-> '-> 'c) -> 'c;
  }
  val create :
    fold:('a, 'b) fold ->
    ?length:('-> int) ->
    ?is_empty:('-> bool) ->
    ?iter:('-> f:('-> unit) -> unit) ->
    ?exists:('-> f:('-> bool) -> bool) ->
    ?for_all:('-> f:('-> bool) -> bool) ->
    ?find:('-> f:('-> bool) -> 'a option) ->
    ?to_list:('-> 'a list) ->
    ?to_array:('-> 'a array) -> unit -> ('a, 'b) type_class
  module type S0_noclass =
    sig
      type container
      type elt
      val mem : ?equal:(elt -> elt -> bool) -> container -> elt -> bool
      val length : container -> int
      val is_empty : container -> bool
      val iter : container -> f:(elt -> unit) -> unit
      val fold : container -> init:'-> f:('-> elt -> 'a) -> 'a
      val exists : container -> f:(elt -> bool) -> bool
      val for_all : container -> f:(elt -> bool) -> bool
      val find : container -> f:(elt -> bool) -> elt option
      val to_list : container -> elt list
      val to_array : container -> elt array
    end
  module type S0 =
    sig
      type container
      type elt
      val mem : ?equal:(elt -> elt -> bool) -> container -> elt -> bool
      val length : container -> int
      val is_empty : container -> bool
      val iter : container -> f:(elt -> unit) -> unit
      val fold : container -> init:'-> f:('-> elt -> 'a) -> 'a
      val exists : container -> f:(elt -> bool) -> bool
      val for_all : container -> f:(elt -> bool) -> bool
      val find : container -> f:(elt -> bool) -> elt option
      val to_list : container -> elt list
      val to_array : container -> elt array
      val container : (elt, container) type_class
    end
  module type S0_phantom_noclass =
    sig
      type elt
      type 'a container
      val length : 'a container -> int
      val is_empty : 'a container -> bool
      val iter : 'a container -> f:(elt -> unit) -> unit
      val fold : 'a container -> init:'-> f:('-> elt -> 'b) -> 'b
      val exists : 'a container -> f:(elt -> bool) -> bool
      val for_all : 'a container -> f:(elt -> bool) -> bool
      val find : 'a container -> f:(elt -> bool) -> elt option
      val to_list : 'a container -> elt list
      val to_array : 'a container -> elt array
    end
  module type S0_phantom =
    sig
      type elt
      type 'a container
      val length : 'a container -> int
      val is_empty : 'a container -> bool
      val iter : 'a container -> f:(elt -> unit) -> unit
      val fold : 'a container -> init:'-> f:('-> elt -> 'b) -> 'b
      val exists : 'a container -> f:(elt -> bool) -> bool
      val for_all : 'a container -> f:(elt -> bool) -> bool
      val find : 'a container -> f:(elt -> bool) -> elt option
      val to_list : 'a container -> elt list
      val to_array : 'a container -> elt array
      val container : (elt, 'a container) type_class
    end
  module type S1_noclass =
    sig
      type 'a container
      val length : 'a container -> int
      val is_empty : 'a container -> bool
      val iter : 'a container -> f:('-> unit) -> unit
      val fold : 'a container -> init:'-> f:('-> '-> 'b) -> 'b
      val exists : 'a container -> f:('-> bool) -> bool
      val for_all : 'a container -> f:('-> bool) -> bool
      val find : 'a container -> f:('-> bool) -> 'a option
      val to_list : 'a container -> 'a list
      val to_array : 'a container -> 'a array
    end
  module type S1 =
    sig
      type 'a container
      val length : 'a container -> int
      val is_empty : 'a container -> bool
      val iter : 'a container -> f:('-> unit) -> unit
      val fold : 'a container -> init:'-> f:('-> '-> 'b) -> 'b
      val exists : 'a container -> f:('-> bool) -> bool
      val for_all : 'a container -> f:('-> bool) -> bool
      val find : 'a container -> f:('-> bool) -> 'a option
      val to_list : 'a container -> 'a list
      val to_array : 'a container -> 'a array
      val container : ('a, 'a container) type_class
    end
  module type S1_phantom_noclass =
    sig
      type ('a, +'b) container
      val length : ('a, 'b) container -> int
      val is_empty : ('a, 'b) container -> bool
      val iter : ('a, 'b) container -> f:('-> unit) -> unit
      val fold : ('a, 'b) container -> init:'-> f:('-> '-> 'c) -> 'c
      val exists : ('a, 'b) container -> f:('-> bool) -> bool
      val for_all : ('a, 'b) container -> f:('-> bool) -> bool
      val find : ('a, 'b) container -> f:('-> bool) -> 'a option
      val to_list : ('a, 'b) container -> 'a list
      val to_array : ('a, 'b) container -> 'a array
    end
  module type S1_phantom =
    sig
      type ('a, +'b) container
      val length : ('a, 'b) container -> int
      val is_empty : ('a, 'b) container -> bool
      val iter : ('a, 'b) container -> f:('-> unit) -> unit
      val fold : ('a, 'b) container -> init:'-> f:('-> '-> 'c) -> 'c
      val exists : ('a, 'b) container -> f:('-> bool) -> bool
      val for_all : ('a, 'b) container -> f:('-> bool) -> bool
      val find : ('a, 'b) container -> f:('-> bool) -> 'a option
      val to_list : ('a, 'b) container -> 'a list
      val to_array : ('a, 'b) container -> 'a array
      val container : ('a, ('a, 'b) container) type_class
    end
  module Check :
    functor (T : sig type 'a elt type 'a container end->
      functor
        (M : sig
               val length : 'T.container -> int
               val is_empty : 'T.container -> bool
               val iter : 'T.container -> f:('T.elt -> unit) -> unit
               val fold :
                 'T.container -> init:'-> f:('-> 'T.elt -> 'b) -> 'b
               val exists : 'T.container -> f:('T.elt -> bool) -> bool
               val for_all : 'T.container -> f:('T.elt -> bool) -> bool
               val find :
                 'T.container -> f:('T.elt -> bool) -> 'T.elt option
               val to_list : 'T.container -> 'T.elt list
               val to_array : 'T.container -> 'T.elt array
             end->
        sig  end
  module Check_S0 : functor (M : S0-> sig  end
  module Check_S0_phantom : functor (M : S0_phantom-> sig  end
  module Check_S1 :
    functor (M : S1->
      functor
        (M : sig
               val length : 'M.container -> int
               val is_empty : 'M.container -> bool
               val iter : 'M.container -> f:('-> unit) -> unit
               val fold :
                 'M.container -> init:'-> f:('-> '-> 'b) -> 'b
               val exists : 'M.container -> f:('-> bool) -> bool
               val for_all : 'M.container -> f:('-> bool) -> bool
               val find : 'M.container -> f:('-> bool) -> 'a option
               val to_list : 'M.container -> 'a list
               val to_array : 'M.container -> 'a array
             end->
        sig  end
  type phantom = Container.phantom
  module Check_S1_phantom : functor (M : S1_phantom-> sig  end
end