functor (T : T.T2->
  functor (Tree : T.T2->
    functor (Elt : T.T1->
      functor (Options : T.T3->
        functor
          (M : sig
                 val length : ('a, 'b) T.t -> int
                 val is_empty : ('a, 'b) T.t -> bool
                 val iter : ('a, 'b) T.t -> f:('Elt.t -> unit) -> unit
                 val fold :
                   ('a, 'b) T.t ->
                   init:'accum -> f:('accum -> 'Elt.t -> 'accum) -> 'accum
                 val exists : ('a, 'b) T.t -> f:('Elt.t -> bool) -> bool
                 val for_all : ('a, 'b) T.t -> f:('Elt.t -> bool) -> bool
                 val count : ('a, 'b) T.t -> f:('Elt.t -> bool) -> int
                 val find :
                   ('a, 'b) T.t -> f:('Elt.t -> bool) -> 'Elt.t option
                 val find_map :
                   ('a, 'c) T.t -> f:('Elt.t -> 'b option) -> 'b option
                 val to_list : ('a, 'b) T.t -> 'Elt.t list
                 val to_array : ('a, 'b) T.t -> 'Elt.t array
                 val invariants :
                   ('a, 'cmp, ('a, 'cmp) T.t -> bool) Options.t
                 val mem :
                   ('a, 'cmp, ('a, 'cmp) T.t -> 'Elt.t -> bool) Options.t
                 val add :
                   ('a, 'cmp, ('a, 'cmp) T.t -> 'Elt.t -> ('a, 'cmp) T.t)
                   Options.t
                 val remove :
                   ('a, 'cmp, ('a, 'cmp) T.t -> 'Elt.t -> ('a, 'cmp) T.t)
                   Options.t
                 val union :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t -> ('a, 'cmp) T.t -> ('a, 'cmp) T.t)
                   Options.t
                 val inter :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t -> ('a, 'cmp) T.t -> ('a, 'cmp) T.t)
                   Options.t
                 val diff :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t -> ('a, 'cmp) T.t -> ('a, 'cmp) T.t)
                   Options.t
                 val compare_direct :
                   ('a, 'cmp, ('a, 'cmp) T.t -> ('a, 'cmp) T.t -> int)
                   Options.t
                 val equal :
                   ('a, 'cmp, ('a, 'cmp) T.t -> ('a, 'cmp) T.t -> bool)
                   Options.t
                 val subset :
                   ('a, 'cmp, ('a, 'cmp) T.t -> ('a, 'cmp) T.t -> bool)
                   Options.t
                 val fold_until :
                   ('a, 'c) T.t ->
                   init:'->
                   f:('-> 'Elt.t -> [ `Continue of '| `Stop of 'b ]) ->
                   'b
                 val fold_right :
                   ('a, 'c) T.t -> init:'-> f:('Elt.t -> '-> 'b) -> 'b
                 val iter2 :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t ->
                    ('a, 'cmp) T.t ->
                    f:([ `Both of 'Elt.t * 'Elt.t
                       | `Left of 'Elt.t
                       | `Right of 'Elt.t ] -> unit) ->
                    unit)
                   Options.t
                 val filter :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t -> f:('Elt.t -> bool) -> ('a, 'cmp) T.t)
                   Options.t
                 val partition_tf :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t ->
                    f:('Elt.t -> bool) -> ('a, 'cmp) T.t * ('a, 'cmp) T.t)
                   Options.t
                 val elements : ('a, 'b) T.t -> 'Elt.t list
                 val min_elt : ('a, 'b) T.t -> 'Elt.t option
                 val min_elt_exn : ('a, 'b) T.t -> 'Elt.t
                 val max_elt : ('a, 'b) T.t -> 'Elt.t option
                 val max_elt_exn : ('a, 'b) T.t -> 'Elt.t
                 val choose : ('a, 'b) T.t -> 'Elt.t option
                 val choose_exn : ('a, 'b) T.t -> 'Elt.t
                 val split :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t ->
                    'Elt.t -> ('a, 'cmp) T.t * bool * ('a, 'cmp) T.t)
                   Options.t
                 val group_by :
                   ('a, 'cmp,
                    ('a, 'cmp) T.t ->
                    equiv:('Elt.t -> 'Elt.t -> bool) ->
                    ('a, 'cmp) T.t list)
                   Options.t
                 val find_exn :
                   ('a, 'b) T.t -> f:('Elt.t -> bool) -> 'Elt.t
                 val find_index : ('a, 'b) T.t -> int -> 'Elt.t option
                 val remove_index :
                   ('a, 'cmp, ('a, 'cmp) T.t -> int -> ('a, 'cmp) T.t)
                   Options.t
                 val to_tree : ('a, 'cmp) T.t -> ('Elt.t, 'cmp) Tree.t
               end->
          sig  end