sig
  module type OrderedType =
    sig
      type t
      val compare : SetMap.OrderedType.t -> SetMap.OrderedType.t -> int
      val print : Format.formatter -> SetMap.OrderedType.t -> unit
    end
  type ('parameters, 'error, 'a) with_log_wrap =
      ('parameters -> 'error -> string -> string option -> exn -> 'error) ->
      'parameters -> 'error -> 'a
  module type Set =
    sig
      type elt
      type t
      val empty : SetMap.Set.t
      val is_empty : SetMap.Set.t -> bool
      val singleton : SetMap.Set.elt -> SetMap.Set.t
      val is_singleton : SetMap.Set.t -> bool
      val add : SetMap.Set.elt -> SetMap.Set.t -> SetMap.Set.t
      val add_with_logs :
        ('parameters, 'error,
         SetMap.Set.elt -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val remove : SetMap.Set.elt -> SetMap.Set.t -> SetMap.Set.t
      val add_while_testing_freshness :
        ('parameters, 'error,
         SetMap.Set.elt -> SetMap.Set.t -> 'error * bool * SetMap.Set.t)
        SetMap.with_log_wrap
      val remove_while_testing_existence :
        ('parameters, 'error,
         SetMap.Set.elt -> SetMap.Set.t -> 'error * bool * SetMap.Set.t)
        SetMap.with_log_wrap
      val remove_with_logs :
        ('parameters, 'error,
         SetMap.Set.elt -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val split :
        SetMap.Set.elt -> SetMap.Set.t -> SetMap.Set.t * bool * SetMap.Set.t
      val union : SetMap.Set.t -> SetMap.Set.t -> SetMap.Set.t
      val disjoint_union :
        SetMap.Set.t -> SetMap.Set.t -> SetMap.Set.t option
      val inter : SetMap.Set.t -> SetMap.Set.t -> SetMap.Set.t
      val minus : SetMap.Set.t -> SetMap.Set.t -> SetMap.Set.t
      val diff : SetMap.Set.t -> SetMap.Set.t -> SetMap.Set.t
      val minus_with_logs :
        ('parameters, 'error,
         SetMap.Set.t -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val union_with_logs :
        ('parameters, 'error,
         SetMap.Set.t -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val disjoint_union_with_logs :
        ('parameters, 'error,
         SetMap.Set.t -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val inter_with_logs :
        ('parameters, 'error,
         SetMap.Set.t -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val diff_with_logs :
        ('parameters, 'error,
         SetMap.Set.t -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val size : SetMap.Set.t -> int
      val mem : SetMap.Set.elt -> SetMap.Set.t -> bool
      val exists : (SetMap.Set.elt -> bool) -> SetMap.Set.t -> bool
      val filter : (SetMap.Set.elt -> bool) -> SetMap.Set.t -> SetMap.Set.t
      val filter_with_logs :
        ('parameters, 'error,
         (SetMap.Set.elt -> bool) -> SetMap.Set.t -> 'error * SetMap.Set.t)
        SetMap.with_log_wrap
      val for_all : (SetMap.Set.elt -> bool) -> SetMap.Set.t -> bool
      val partition :
        (SetMap.Set.elt -> bool) ->
        SetMap.Set.t -> SetMap.Set.t * SetMap.Set.t
      val partition_with_logs :
        ('parameters, 'error,
         (SetMap.Set.elt -> bool) ->
         SetMap.Set.t -> 'error * SetMap.Set.t * SetMap.Set.t)
        SetMap.with_log_wrap
      val compare : SetMap.Set.t -> SetMap.Set.t -> int
      val equal : SetMap.Set.t -> SetMap.Set.t -> bool
      val subset : SetMap.Set.t -> SetMap.Set.t -> bool
      val iter : (SetMap.Set.elt -> unit) -> SetMap.Set.t -> unit
      val fold : (SetMap.Set.elt -> '-> 'a) -> SetMap.Set.t -> '-> 'a
      val fold_inv : (SetMap.Set.elt -> '-> 'a) -> SetMap.Set.t -> '-> 'a
      val elements : SetMap.Set.t -> SetMap.Set.elt list
      val print : Format.formatter -> SetMap.Set.t -> unit
      val choose : SetMap.Set.t -> SetMap.Set.elt option
      val random : Random.State.t -> SetMap.Set.t -> SetMap.Set.elt option
      val min_elt : SetMap.Set.t -> SetMap.Set.elt option
      val max_elt : SetMap.Set.t -> SetMap.Set.elt option
    end
  module type Map =
    sig
      type elt
      type set
      type +'a t
      val empty : 'SetMap.Map.t
      val is_empty : 'SetMap.Map.t -> bool
      val size : 'SetMap.Map.t -> int
      val root : 'SetMap.Map.t -> (SetMap.Map.elt * 'a) option
      val max_key : 'SetMap.Map.t -> SetMap.Map.elt option
      val add : SetMap.Map.elt -> '-> 'SetMap.Map.t -> 'SetMap.Map.t
      val remove : SetMap.Map.elt -> 'SetMap.Map.t -> 'SetMap.Map.t
      val add_while_testing_freshness :
        ('parameters, 'error,
         SetMap.Map.elt ->
         '-> 'SetMap.Map.t -> 'error * bool * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val remove_while_testing_existence :
        ('parameters, 'error,
         SetMap.Map.elt -> 'SetMap.Map.t -> 'error * bool * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val pop :
        SetMap.Map.elt -> 'SetMap.Map.t -> 'a option * 'SetMap.Map.t
      val merge : 'SetMap.Map.t -> 'SetMap.Map.t -> 'SetMap.Map.t
      val min_elt : 'SetMap.Map.t -> (SetMap.Map.elt * 'a) option
      val find_option : SetMap.Map.elt -> 'SetMap.Map.t -> 'a option
      val find_default : '-> SetMap.Map.elt -> 'SetMap.Map.t -> 'a
      val find_option_with_logs :
        ('parameters, 'error,
         SetMap.Map.elt -> 'SetMap.Map.t -> 'error * 'a option)
        SetMap.with_log_wrap
      val find_default_with_logs :
        ('parameters, 'error,
         '-> SetMap.Map.elt -> 'SetMap.Map.t -> 'error * 'a)
        SetMap.with_log_wrap
      val mem : SetMap.Map.elt -> 'SetMap.Map.t -> bool
      val diff :
        'SetMap.Map.t ->
        'SetMap.Map.t -> 'SetMap.Map.t * 'SetMap.Map.t
      val union : 'SetMap.Map.t -> 'SetMap.Map.t -> 'SetMap.Map.t
      val update : 'SetMap.Map.t -> 'SetMap.Map.t -> 'SetMap.Map.t
      val diff_pred :
        ('-> '-> bool) ->
        'SetMap.Map.t ->
        'SetMap.Map.t -> 'SetMap.Map.t * 'SetMap.Map.t
      val add_with_logs :
        ('parameters, 'error,
         SetMap.Map.elt -> '-> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val remove_with_logs :
        ('parameters, 'error,
         SetMap.Map.elt -> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val join_with_logs :
        ('parameters, 'error,
         'SetMap.Map.t ->
         SetMap.Map.elt -> '-> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val split_with_logs :
        ('parameters, 'error,
         SetMap.Map.elt ->
         'SetMap.Map.t ->
         'error * ('SetMap.Map.t * 'a option * 'SetMap.Map.t))
        SetMap.with_log_wrap
      val update_with_logs :
        ('parameters, 'error,
         'SetMap.Map.t -> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val map2_with_logs :
        ('parameters, 'error,
         ('parameters -> 'error -> '-> 'error * 'c) ->
         ('parameters -> 'error -> '-> 'error * 'c) ->
         ('parameters -> 'error -> '-> '-> 'error * 'c) ->
         'SetMap.Map.t -> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val map2z_with_logs :
        ('parameters, 'error,
         ('parameters -> 'error -> '-> '-> 'error * 'a) ->
         'SetMap.Map.t -> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val fold2z_with_logs :
        ('parameters, 'error,
         ('parameters ->
          'error -> SetMap.Map.elt -> '-> '-> '-> 'error * 'c) ->
         'SetMap.Map.t -> 'SetMap.Map.t -> '-> 'error * 'c)
        SetMap.with_log_wrap
      val fold2_with_logs :
        ('parameters, 'error,
         ('parameters -> 'error -> SetMap.Map.elt -> '-> '-> 'error * 'c) ->
         ('parameters -> 'error -> SetMap.Map.elt -> '-> '-> 'error * 'c) ->
         ('parameters ->
          'error -> SetMap.Map.elt -> '-> '-> '-> 'error * 'c) ->
         'SetMap.Map.t -> 'SetMap.Map.t -> '-> 'error * 'c)
        SetMap.with_log_wrap
      val fold2_sparse_with_logs :
        ('parameters, 'error,
         ('parameters ->
          'error -> SetMap.Map.elt -> '-> '-> '-> 'error * 'c) ->
         'SetMap.Map.t -> 'SetMap.Map.t -> '-> 'error * 'c)
        SetMap.with_log_wrap
      val iter2_sparse_with_logs :
        ('parameters, 'error,
         ('parameters -> 'error -> SetMap.Map.elt -> '-> '-> 'error) ->
         'SetMap.Map.t -> 'SetMap.Map.t -> 'error)
        SetMap.with_log_wrap
      val diff_with_logs :
        ('parameters, 'error,
         'SetMap.Map.t ->
         'SetMap.Map.t -> 'error * 'SetMap.Map.t * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val diff_pred_with_logs :
        ('parameters, 'error,
         ('-> '-> bool) ->
         'SetMap.Map.t ->
         'SetMap.Map.t -> 'error * 'SetMap.Map.t * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val merge_with_logs :
        ('parameters, 'error,
         'SetMap.Map.t -> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val union_with_logs :
        ('parameters, 'error,
         'SetMap.Map.t -> 'SetMap.Map.t -> 'error * 'SetMap.Map.t)
        SetMap.with_log_wrap
      val fold_restriction_with_logs :
        ('parameters, 'error,
         (SetMap.Map.elt -> '-> 'error * '-> 'error * 'b) ->
         SetMap.Map.set -> 'SetMap.Map.t -> '-> 'error * 'b)
        SetMap.with_log_wrap
      val fold_restriction_with_missing_associations_with_logs :
        ('parameters, 'error,
         (SetMap.Map.elt -> '-> 'error * '-> 'error * 'b) ->
         (SetMap.Map.elt -> 'error * '-> 'error * 'b) ->
         SetMap.Map.set -> 'SetMap.Map.t -> '-> 'error * 'b)
        SetMap.with_log_wrap
      val iter : (SetMap.Map.elt -> '-> unit) -> 'SetMap.Map.t -> unit
      val fold :
        (SetMap.Map.elt -> '-> '-> 'b) -> 'SetMap.Map.t -> '-> 'b
      val fold_with_interruption :
        (SetMap.Map.elt -> '-> '-> ('b, 'c) Stop.stop) ->
        'SetMap.Map.t -> '-> ('b, 'c) Stop.stop
      val monadic_fold2 :
        'parameters ->
        'method_handler ->
        ('parameters ->
         'method_handler ->
         SetMap.Map.elt -> '-> '-> '-> 'method_handler * 'c) ->
        ('parameters ->
         'method_handler ->
         SetMap.Map.elt -> '-> '-> 'method_handler * 'c) ->
        ('parameters ->
         'method_handler ->
         SetMap.Map.elt -> '-> '-> 'method_handler * 'c) ->
        'SetMap.Map.t -> 'SetMap.Map.t -> '-> 'method_handler * 'c
      val monadic_fold2_sparse :
        'parameters ->
        'method_handler ->
        ('parameters ->
         'method_handler ->
         SetMap.Map.elt -> '-> '-> '-> 'method_handler * 'c) ->
        'SetMap.Map.t -> 'SetMap.Map.t -> '-> 'method_handler * 'c
      val monadic_iter2_sparse :
        'parameters ->
        'method_handler ->
        ('parameters ->
         'method_handler -> SetMap.Map.elt -> '-> '-> 'method_handler) ->
        'SetMap.Map.t -> 'SetMap.Map.t -> 'method_handler
      val monadic_fold_restriction :
        'parameters ->
        'method_handler ->
        ('parameters ->
         'method_handler ->
         SetMap.Map.elt -> '-> '-> 'method_handler * 'b) ->
        SetMap.Map.set -> 'SetMap.Map.t -> '-> 'method_handler * 'b
      val mapi :
        (SetMap.Map.elt -> '-> 'b) -> 'SetMap.Map.t -> 'SetMap.Map.t
      val map : ('-> 'b) -> 'SetMap.Map.t -> 'SetMap.Map.t
      val map2 :
        ('-> '-> 'a) ->
        'SetMap.Map.t -> 'SetMap.Map.t -> 'SetMap.Map.t
      val for_all : (SetMap.Map.elt -> '-> bool) -> 'SetMap.Map.t -> bool
      val filter_one :
        (SetMap.Map.elt -> '-> bool) ->
        'SetMap.Map.t -> (SetMap.Map.elt * 'a) option
      val compare :
        ('-> '-> int) -> 'SetMap.Map.t -> 'SetMap.Map.t -> int
      val equal :
        ('-> '-> bool) -> 'SetMap.Map.t -> 'SetMap.Map.t -> bool
      val bindings : 'SetMap.Map.t -> (SetMap.Map.elt * 'a) list
      val print :
        (Format.formatter -> '-> unit) ->
        Format.formatter -> 'SetMap.Map.t -> unit
      val of_json :
        ?lab_key:string ->
        ?lab_value:string ->
        ?error_msg:string ->
        (Yojson.Basic.json -> SetMap.Map.elt) ->
        (Yojson.Basic.json -> 'value) ->
        Yojson.Basic.json -> 'value SetMap.Map.t
      val to_json :
        ?lab_key:string ->
        ?lab_value:string ->
        (SetMap.Map.elt -> Yojson.Basic.json) ->
        ('value -> Yojson.Basic.json) ->
        'value SetMap.Map.t -> Yojson.Basic.json
    end
  module type S =
    sig
      type elt
      module Set :
        sig
          type elt = elt
          type t
          val empty : t
          val is_empty : t -> bool
          val singleton : elt -> t
          val is_singleton : t -> bool
          val add : elt -> t -> t
          val add_with_logs :
            ('parameters, 'error, elt -> t -> 'error * t) with_log_wrap
          val remove : elt -> t -> t
          val add_while_testing_freshness :
            ('parameters, 'error, elt -> t -> 'error * bool * t)
            with_log_wrap
          val remove_while_testing_existence :
            ('parameters, 'error, elt -> t -> 'error * bool * t)
            with_log_wrap
          val remove_with_logs :
            ('parameters, 'error, elt -> t -> 'error * t) with_log_wrap
          val split : elt -> t -> t * bool * t
          val union : t -> t -> t
          val disjoint_union : t -> t -> t option
          val inter : t -> t -> t
          val minus : t -> t -> t
          val diff : t -> t -> t
          val minus_with_logs :
            ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
          val union_with_logs :
            ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
          val disjoint_union_with_logs :
            ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
          val inter_with_logs :
            ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
          val diff_with_logs :
            ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
          val size : t -> int
          val mem : elt -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val filter_with_logs :
            ('parameters, 'error, (elt -> bool) -> t -> 'error * t)
            with_log_wrap
          val for_all : (elt -> bool) -> t -> bool
          val partition : (elt -> bool) -> t -> t * t
          val partition_with_logs :
            ('parameters, 'error, (elt -> bool) -> t -> 'error * t * t)
            with_log_wrap
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val fold_inv : (elt -> '-> 'a) -> t -> '-> 'a
          val elements : t -> elt list
          val print : Format.formatter -> t -> unit
          val choose : t -> elt option
          val random : Random.State.t -> t -> elt option
          val min_elt : t -> elt option
          val max_elt : t -> elt option
        end
      module Map :
        sig
          type elt = elt
          type set = Set.t
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val size : 'a t -> int
          val root : 'a t -> (elt * 'a) option
          val max_key : 'a t -> elt option
          val add : elt -> '-> 'a t -> 'a t
          val remove : elt -> 'a t -> 'a t
          val add_while_testing_freshness :
            ('parameters, 'error, elt -> '-> 'a t -> 'error * bool * 'a t)
            with_log_wrap
          val remove_while_testing_existence :
            ('parameters, 'error, elt -> 'a t -> 'error * bool * 'a t)
            with_log_wrap
          val pop : elt -> 'a t -> 'a option * 'a t
          val merge : 'a t -> 'a t -> 'a t
          val min_elt : 'a t -> (elt * 'a) option
          val find_option : elt -> 'a t -> 'a option
          val find_default : '-> elt -> 'a t -> 'a
          val find_option_with_logs :
            ('parameters, 'error, elt -> 'a t -> 'error * 'a option)
            with_log_wrap
          val find_default_with_logs :
            ('parameters, 'error, '-> elt -> 'a t -> 'error * 'a)
            with_log_wrap
          val mem : elt -> 'a t -> bool
          val diff : 'a t -> 'a t -> 'a t * 'a t
          val union : 'a t -> 'a t -> 'a t
          val update : 'a t -> 'a t -> 'a t
          val diff_pred : ('-> '-> bool) -> 'a t -> 'a t -> 'a t * 'a t
          val add_with_logs :
            ('parameters, 'error, elt -> '-> 'a t -> 'error * 'a t)
            with_log_wrap
          val remove_with_logs :
            ('parameters, 'error, elt -> 'a t -> 'error * 'a t) with_log_wrap
          val join_with_logs :
            ('parameters, 'error, 'a t -> elt -> '-> 'a t -> 'error * 'a t)
            with_log_wrap
          val split_with_logs :
            ('parameters, 'error,
             elt -> 'a t -> 'error * ('a t * 'a option * 'a t))
            with_log_wrap
          val update_with_logs :
            ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t)
            with_log_wrap
          val map2_with_logs :
            ('parameters, 'error,
             ('parameters -> 'error -> '-> 'error * 'c) ->
             ('parameters -> 'error -> '-> 'error * 'c) ->
             ('parameters -> 'error -> '-> '-> 'error * 'c) ->
             'a t -> 'b t -> 'error * 'c t)
            with_log_wrap
          val map2z_with_logs :
            ('parameters, 'error,
             ('parameters -> 'error -> '-> '-> 'error * 'a) ->
             'a t -> 'a t -> 'error * 'a t)
            with_log_wrap
          val fold2z_with_logs :
            ('parameters, 'error,
             ('parameters -> 'error -> elt -> '-> '-> '-> 'error * 'c) ->
             'a t -> 'b t -> '-> 'error * 'c)
            with_log_wrap
          val fold2_with_logs :
            ('parameters, 'error,
             ('parameters -> 'error -> elt -> '-> '-> 'error * 'c) ->
             ('parameters -> 'error -> elt -> '-> '-> 'error * 'c) ->
             ('parameters -> 'error -> elt -> '-> '-> '-> 'error * 'c) ->
             'a t -> 'b t -> '-> 'error * 'c)
            with_log_wrap
          val fold2_sparse_with_logs :
            ('parameters, 'error,
             ('parameters -> 'error -> elt -> '-> '-> '-> 'error * 'c) ->
             'a t -> 'b t -> '-> 'error * 'c)
            with_log_wrap
          val iter2_sparse_with_logs :
            ('parameters, 'error,
             ('parameters -> 'error -> elt -> '-> '-> 'error) ->
             'a t -> 'b t -> 'error)
            with_log_wrap
          val diff_with_logs :
            ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t * 'a t)
            with_log_wrap
          val diff_pred_with_logs :
            ('parameters, 'error,
             ('-> '-> bool) -> 'a t -> 'a t -> 'error * 'a t * 'a t)
            with_log_wrap
          val merge_with_logs :
            ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t)
            with_log_wrap
          val union_with_logs :
            ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t)
            with_log_wrap
          val fold_restriction_with_logs :
            ('parameters, 'error,
             (elt -> '-> 'error * '-> 'error * 'b) ->
             set -> 'a t -> '-> 'error * 'b)
            with_log_wrap
          val fold_restriction_with_missing_associations_with_logs :
            ('parameters, 'error,
             (elt -> '-> 'error * '-> 'error * 'b) ->
             (elt -> 'error * '-> 'error * 'b) ->
             set -> 'a t -> '-> 'error * 'b)
            with_log_wrap
          val iter : (elt -> '-> unit) -> 'a t -> unit
          val fold : (elt -> '-> '-> 'b) -> 'a t -> '-> 'b
          val fold_with_interruption :
            (elt -> '-> '-> ('b, 'c) Stop.stop) ->
            'a t -> '-> ('b, 'c) Stop.stop
          val monadic_fold2 :
            'parameters ->
            'method_handler ->
            ('parameters ->
             'method_handler -> elt -> '-> '-> '-> 'method_handler * 'c) ->
            ('parameters ->
             'method_handler -> elt -> '-> '-> 'method_handler * 'c) ->
            ('parameters ->
             'method_handler -> elt -> '-> '-> 'method_handler * 'c) ->
            'a t -> 'b t -> '-> 'method_handler * 'c
          val monadic_fold2_sparse :
            'parameters ->
            'method_handler ->
            ('parameters ->
             'method_handler -> elt -> '-> '-> '-> 'method_handler * 'c) ->
            'a t -> 'b t -> '-> 'method_handler * 'c
          val monadic_iter2_sparse :
            'parameters ->
            'method_handler ->
            ('parameters ->
             'method_handler -> elt -> '-> '-> 'method_handler) ->
            'a t -> 'b t -> 'method_handler
          val monadic_fold_restriction :
            'parameters ->
            'method_handler ->
            ('parameters ->
             'method_handler -> elt -> '-> '-> 'method_handler * 'b) ->
            set -> 'a t -> '-> 'method_handler * 'b
          val mapi : (elt -> '-> 'b) -> 'a t -> 'b t
          val map : ('-> 'b) -> 'a t -> 'b t
          val map2 : ('-> '-> 'a) -> 'a t -> 'a t -> 'a t
          val for_all : (elt -> '-> bool) -> 'a t -> bool
          val filter_one : (elt -> '-> bool) -> 'a t -> (elt * 'a) option
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val bindings : 'a t -> (elt * 'a) list
          val print :
            (Format.formatter -> '-> unit) ->
            Format.formatter -> 'a t -> unit
          val of_json :
            ?lab_key:string ->
            ?lab_value:string ->
            ?error_msg:string ->
            (Yojson.Basic.json -> elt) ->
            (Yojson.Basic.json -> 'value) -> Yojson.Basic.json -> 'value t
          val to_json :
            ?lab_key:string ->
            ?lab_value:string ->
            (elt -> Yojson.Basic.json) ->
            ('value -> Yojson.Basic.json) -> 'value t -> Yojson.Basic.json
        end
    end
  module Make :
    functor (Ord : OrderedType->
      sig
        type elt = Ord.t
        module Set :
          sig
            type elt = elt
            type t
            val empty : t
            val is_empty : t -> bool
            val singleton : elt -> t
            val is_singleton : t -> bool
            val add : elt -> t -> t
            val add_with_logs :
              ('parameters, 'error, elt -> t -> 'error * t) with_log_wrap
            val remove : elt -> t -> t
            val add_while_testing_freshness :
              ('parameters, 'error, elt -> t -> 'error * bool * t)
              with_log_wrap
            val remove_while_testing_existence :
              ('parameters, 'error, elt -> t -> 'error * bool * t)
              with_log_wrap
            val remove_with_logs :
              ('parameters, 'error, elt -> t -> 'error * t) with_log_wrap
            val split : elt -> t -> t * bool * t
            val union : t -> t -> t
            val disjoint_union : t -> t -> t option
            val inter : t -> t -> t
            val minus : t -> t -> t
            val diff : t -> t -> t
            val minus_with_logs :
              ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
            val union_with_logs :
              ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
            val disjoint_union_with_logs :
              ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
            val inter_with_logs :
              ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
            val diff_with_logs :
              ('parameters, 'error, t -> t -> 'error * t) with_log_wrap
            val size : t -> int
            val mem : elt -> t -> bool
            val exists : (elt -> bool) -> t -> bool
            val filter : (elt -> bool) -> t -> t
            val filter_with_logs :
              ('parameters, 'error, (elt -> bool) -> t -> 'error * t)
              with_log_wrap
            val for_all : (elt -> bool) -> t -> bool
            val partition : (elt -> bool) -> t -> t * t
            val partition_with_logs :
              ('parameters, 'error, (elt -> bool) -> t -> 'error * t * t)
              with_log_wrap
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val subset : t -> t -> bool
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val fold_inv : (elt -> '-> 'a) -> t -> '-> 'a
            val elements : t -> elt list
            val print : Format.formatter -> t -> unit
            val choose : t -> elt option
            val random : Random.State.t -> t -> elt option
            val min_elt : t -> elt option
            val max_elt : t -> elt option
          end
        module Map :
          sig
            type elt = elt
            type set = Set.t
            type +'a t
            val empty : 'a t
            val is_empty : 'a t -> bool
            val size : 'a t -> int
            val root : 'a t -> (elt * 'a) option
            val max_key : 'a t -> elt option
            val add : elt -> '-> 'a t -> 'a t
            val remove : elt -> 'a t -> 'a t
            val add_while_testing_freshness :
              ('parameters, 'error,
               elt -> '-> 'a t -> 'error * bool * 'a t)
              with_log_wrap
            val remove_while_testing_existence :
              ('parameters, 'error, elt -> 'a t -> 'error * bool * 'a t)
              with_log_wrap
            val pop : elt -> 'a t -> 'a option * 'a t
            val merge : 'a t -> 'a t -> 'a t
            val min_elt : 'a t -> (elt * 'a) option
            val find_option : elt -> 'a t -> 'a option
            val find_default : '-> elt -> 'a t -> 'a
            val find_option_with_logs :
              ('parameters, 'error, elt -> 'a t -> 'error * 'a option)
              with_log_wrap
            val find_default_with_logs :
              ('parameters, 'error, '-> elt -> 'a t -> 'error * 'a)
              with_log_wrap
            val mem : elt -> 'a t -> bool
            val diff : 'a t -> 'a t -> 'a t * 'a t
            val union : 'a t -> 'a t -> 'a t
            val update : 'a t -> 'a t -> 'a t
            val diff_pred : ('-> '-> bool) -> 'a t -> 'a t -> 'a t * 'a t
            val add_with_logs :
              ('parameters, 'error, elt -> '-> 'a t -> 'error * 'a t)
              with_log_wrap
            val remove_with_logs :
              ('parameters, 'error, elt -> 'a t -> 'error * 'a t)
              with_log_wrap
            val join_with_logs :
              ('parameters, 'error,
               'a t -> elt -> '-> 'a t -> 'error * 'a t)
              with_log_wrap
            val split_with_logs :
              ('parameters, 'error,
               elt -> 'a t -> 'error * ('a t * 'a option * 'a t))
              with_log_wrap
            val update_with_logs :
              ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t)
              with_log_wrap
            val map2_with_logs :
              ('parameters, 'error,
               ('parameters -> 'error -> '-> 'error * 'c) ->
               ('parameters -> 'error -> '-> 'error * 'c) ->
               ('parameters -> 'error -> '-> '-> 'error * 'c) ->
               'a t -> 'b t -> 'error * 'c t)
              with_log_wrap
            val map2z_with_logs :
              ('parameters, 'error,
               ('parameters -> 'error -> '-> '-> 'error * 'a) ->
               'a t -> 'a t -> 'error * 'a t)
              with_log_wrap
            val fold2z_with_logs :
              ('parameters, 'error,
               ('parameters -> 'error -> elt -> '-> '-> '-> 'error * 'c) ->
               'a t -> 'b t -> '-> 'error * 'c)
              with_log_wrap
            val fold2_with_logs :
              ('parameters, 'error,
               ('parameters -> 'error -> elt -> '-> '-> 'error * 'c) ->
               ('parameters -> 'error -> elt -> '-> '-> 'error * 'c) ->
               ('parameters -> 'error -> elt -> '-> '-> '-> 'error * 'c) ->
               'a t -> 'b t -> '-> 'error * 'c)
              with_log_wrap
            val fold2_sparse_with_logs :
              ('parameters, 'error,
               ('parameters -> 'error -> elt -> '-> '-> '-> 'error * 'c) ->
               'a t -> 'b t -> '-> 'error * 'c)
              with_log_wrap
            val iter2_sparse_with_logs :
              ('parameters, 'error,
               ('parameters -> 'error -> elt -> '-> '-> 'error) ->
               'a t -> 'b t -> 'error)
              with_log_wrap
            val diff_with_logs :
              ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t * 'a t)
              with_log_wrap
            val diff_pred_with_logs :
              ('parameters, 'error,
               ('-> '-> bool) -> 'a t -> 'a t -> 'error * 'a t * 'a t)
              with_log_wrap
            val merge_with_logs :
              ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t)
              with_log_wrap
            val union_with_logs :
              ('parameters, 'error, 'a t -> 'a t -> 'error * 'a t)
              with_log_wrap
            val fold_restriction_with_logs :
              ('parameters, 'error,
               (elt -> '-> 'error * '-> 'error * 'b) ->
               set -> 'a t -> '-> 'error * 'b)
              with_log_wrap
            val fold_restriction_with_missing_associations_with_logs :
              ('parameters, 'error,
               (elt -> '-> 'error * '-> 'error * 'b) ->
               (elt -> 'error * '-> 'error * 'b) ->
               set -> 'a t -> '-> 'error * 'b)
              with_log_wrap
            val iter : (elt -> '-> unit) -> 'a t -> unit
            val fold : (elt -> '-> '-> 'b) -> 'a t -> '-> 'b
            val fold_with_interruption :
              (elt -> '-> '-> ('b, 'c) Stop.stop) ->
              'a t -> '-> ('b, 'c) Stop.stop
            val monadic_fold2 :
              'parameters ->
              'method_handler ->
              ('parameters ->
               'method_handler ->
               elt -> '-> '-> '-> 'method_handler * 'c) ->
              ('parameters ->
               'method_handler -> elt -> '-> '-> 'method_handler * 'c) ->
              ('parameters ->
               'method_handler -> elt -> '-> '-> 'method_handler * 'c) ->
              'a t -> 'b t -> '-> 'method_handler * 'c
            val monadic_fold2_sparse :
              'parameters ->
              'method_handler ->
              ('parameters ->
               'method_handler ->
               elt -> '-> '-> '-> 'method_handler * 'c) ->
              'a t -> 'b t -> '-> 'method_handler * 'c
            val monadic_iter2_sparse :
              'parameters ->
              'method_handler ->
              ('parameters ->
               'method_handler -> elt -> '-> '-> 'method_handler) ->
              'a t -> 'b t -> 'method_handler
            val monadic_fold_restriction :
              'parameters ->
              'method_handler ->
              ('parameters ->
               'method_handler -> elt -> '-> '-> 'method_handler * 'b) ->
              set -> 'a t -> '-> 'method_handler * 'b
            val mapi : (elt -> '-> 'b) -> 'a t -> 'b t
            val map : ('-> 'b) -> 'a t -> 'b t
            val map2 : ('-> '-> 'a) -> 'a t -> 'a t -> 'a t
            val for_all : (elt -> '-> bool) -> 'a t -> bool
            val filter_one : (elt -> '-> bool) -> 'a t -> (elt * 'a) option
            val compare : ('-> '-> int) -> 'a t -> 'a t -> int
            val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
            val bindings : 'a t -> (elt * 'a) list
            val print :
              (Format.formatter -> '-> unit) ->
              Format.formatter -> 'a t -> unit
            val of_json :
              ?lab_key:string ->
              ?lab_value:string ->
              ?error_msg:string ->
              (Yojson.Basic.json -> elt) ->
              (Yojson.Basic.json -> 'value) -> Yojson.Basic.json -> 'value t
            val to_json :
              ?lab_key:string ->
              ?lab_value:string ->
              (elt -> Yojson.Basic.json) ->
              ('value -> Yojson.Basic.json) -> 'value t -> Yojson.Basic.json
          end
      end
  module type Projection =
    sig
      type elt_a
      type elt_b
      type 'a map_a
      type 'a map_b
      type set_a
      type set_b
      val proj_map :
        (SetMap.Projection.elt_a -> SetMap.Projection.elt_b) ->
        '->
        ('-> '-> 'b) ->
        'SetMap.Projection.map_a -> 'SetMap.Projection.map_b
      val proj_map_monadic :
        'parameters ->
        'method_handler ->
        (SetMap.Projection.elt_a -> SetMap.Projection.elt_b) ->
        '->
        ('parameters -> 'method_handler -> '-> '-> 'method_handler * 'b) ->
        'SetMap.Projection.map_a ->
        'method_handler * 'SetMap.Projection.map_b
      val proj_set :
        (SetMap.Projection.elt_a -> SetMap.Projection.elt_b) ->
        SetMap.Projection.set_a -> SetMap.Projection.set_b
      val proj_set_monadic :
        'parameters ->
        'method_handler ->
        ('parameters ->
         'method_handler ->
         SetMap.Projection.elt_a -> 'method_handler * SetMap.Projection.elt_b) ->
        SetMap.Projection.set_a -> 'method_handler * SetMap.Projection.set_b
      val partition_set :
        (SetMap.Projection.elt_a -> SetMap.Projection.elt_b) ->
        SetMap.Projection.set_a ->
        SetMap.Projection.set_a SetMap.Projection.map_b
      val partition_set_monadic :
        'parameters ->
        'method_handler ->
        ('parameters ->
         'method_handler ->
         SetMap.Projection.elt_a -> 'method_handler * SetMap.Projection.elt_b) ->
        SetMap.Projection.set_a ->
        'method_handler * SetMap.Projection.set_a SetMap.Projection.map_b
    end
  module Proj :
    functor (A : S) (B : S->
      sig
        type elt_a = A.elt
        type elt_b = B.elt
        type 'a map_a = 'A.Map.t
        type 'a map_b = 'B.Map.t
        type set_a
        type set_b
        val proj_map :
          (elt_a -> elt_b) -> '-> ('-> '-> 'b) -> 'a map_a -> 'b map_b
        val proj_map_monadic :
          'parameters ->
          'method_handler ->
          (elt_a -> elt_b) ->
          '->
          ('parameters -> 'method_handler -> '-> '-> 'method_handler * 'b) ->
          'a map_a -> 'method_handler * 'b map_b
        val proj_set : (elt_a -> elt_b) -> set_a -> set_b
        val proj_set_monadic :
          'parameters ->
          'method_handler ->
          ('parameters -> 'method_handler -> elt_a -> 'method_handler * elt_b) ->
          set_a -> 'method_handler * set_b
        val partition_set : (elt_a -> elt_b) -> set_a -> set_a map_b
        val partition_set_monadic :
          'parameters ->
          'method_handler ->
          ('parameters -> 'method_handler -> elt_a -> 'method_handler * elt_b) ->
          set_a -> 'method_handler * set_a map_b
      end
  module type Projection2 =
    sig
      type elt_a
      type elt_b
      type elt_c
      type 'a map_a
      type 'a map_b
      type 'a map_c
      val proj2 :
        (SetMap.Projection2.elt_a -> SetMap.Projection2.elt_b) ->
        (SetMap.Projection2.elt_a -> SetMap.Projection2.elt_c) ->
        '->
        ('-> '-> 'b) ->
        'SetMap.Projection2.map_a ->
        'SetMap.Projection2.map_c SetMap.Projection2.map_b
      val proj2_monadic :
        'parameters ->
        'method_handler ->
        (SetMap.Projection2.elt_a -> SetMap.Projection2.elt_b) ->
        (SetMap.Projection2.elt_a -> SetMap.Projection2.elt_c) ->
        '->
        ('parameters -> 'method_handler -> '-> '-> 'method_handler * 'b) ->
        'SetMap.Projection2.map_a ->
        'method_handler *
        'SetMap.Projection2.map_c SetMap.Projection2.map_b
    end
  module Proj2 :
    functor (A : S) (B : S) (C : S->
      sig
        type elt_a = A.elt
        type elt_b = B.elt
        type elt_c = C.elt
        type 'a map_a = 'A.Map.t
        type 'a map_b = 'B.Map.t
        type 'a map_c = 'C.Map.t
        val proj2 :
          (elt_a -> elt_b) ->
          (elt_a -> elt_c) ->
          '-> ('-> '-> 'b) -> 'a map_a -> 'b map_c map_b
        val proj2_monadic :
          'parameters ->
          'method_handler ->
          (elt_a -> elt_b) ->
          (elt_a -> elt_c) ->
          '->
          ('parameters -> 'method_handler -> '-> '-> 'method_handler * 'b) ->
          'a map_a -> 'method_handler * 'b map_c map_b
      end
end