sig
  type 'a sequence = ('-> unit) -> unit
  module type S =
    sig
      type key
      type value
      type t
      val empty : CCMultiMap.S.t
      val is_empty : CCMultiMap.S.t -> bool
      val add :
        CCMultiMap.S.t ->
        CCMultiMap.S.key -> CCMultiMap.S.value -> CCMultiMap.S.t
      val remove :
        CCMultiMap.S.t ->
        CCMultiMap.S.key -> CCMultiMap.S.value -> CCMultiMap.S.t
      val remove_all : CCMultiMap.S.t -> CCMultiMap.S.key -> CCMultiMap.S.t
      val mem : CCMultiMap.S.t -> CCMultiMap.S.key -> bool
      val find :
        CCMultiMap.S.t -> CCMultiMap.S.key -> CCMultiMap.S.value list
      val find_iter :
        CCMultiMap.S.t ->
        CCMultiMap.S.key -> (CCMultiMap.S.value -> unit) -> unit
      val count : CCMultiMap.S.t -> CCMultiMap.S.key -> int
      val iter :
        CCMultiMap.S.t ->
        (CCMultiMap.S.key -> CCMultiMap.S.value -> unit) -> unit
      val fold :
        CCMultiMap.S.t ->
        '-> ('-> CCMultiMap.S.key -> CCMultiMap.S.value -> 'a) -> 'a
      val size : CCMultiMap.S.t -> int
      val union : CCMultiMap.S.t -> CCMultiMap.S.t -> CCMultiMap.S.t
      val inter : CCMultiMap.S.t -> CCMultiMap.S.t -> CCMultiMap.S.t
      val diff : CCMultiMap.S.t -> CCMultiMap.S.t -> CCMultiMap.S.t
      val equal : CCMultiMap.S.t -> CCMultiMap.S.t -> bool
      val compare : CCMultiMap.S.t -> CCMultiMap.S.t -> int
      val submap : CCMultiMap.S.t -> CCMultiMap.S.t -> bool
      val to_seq :
        CCMultiMap.S.t ->
        (CCMultiMap.S.key * CCMultiMap.S.value) CCMultiMap.sequence
      val of_seq :
        ?init:CCMultiMap.S.t ->
        (CCMultiMap.S.key * CCMultiMap.S.value) CCMultiMap.sequence ->
        CCMultiMap.S.t
      val keys : CCMultiMap.S.t -> CCMultiMap.S.key CCMultiMap.sequence
      val values : CCMultiMap.S.t -> CCMultiMap.S.value CCMultiMap.sequence
    end
  module type OrderedType =
    sig
      type t
      val compare :
        CCMultiMap.OrderedType.t -> CCMultiMap.OrderedType.t -> int
    end
  module Make :
    functor (K : OrderedType) (V : OrderedType->
      sig
        type key = K.t
        type value = V.t
        type t
        val empty : t
        val is_empty : t -> bool
        val add : t -> key -> value -> t
        val remove : t -> key -> value -> t
        val remove_all : t -> key -> t
        val mem : t -> key -> bool
        val find : t -> key -> value list
        val find_iter : t -> key -> (value -> unit) -> unit
        val count : t -> key -> int
        val iter : t -> (key -> value -> unit) -> unit
        val fold : t -> '-> ('-> key -> value -> 'a) -> 'a
        val size : t -> int
        val union : t -> t -> t
        val inter : t -> t -> t
        val diff : t -> t -> t
        val equal : t -> t -> bool
        val compare : t -> t -> int
        val submap : t -> t -> bool
        val to_seq : t -> (key * value) sequence
        val of_seq : ?init:t -> (key * value) sequence -> t
        val keys : t -> key sequence
        val values : t -> value sequence
      end
  module type BIDIR =
    sig
      type t
      type left
      type right
      val empty : CCMultiMap.BIDIR.t
      val is_empty : CCMultiMap.BIDIR.t -> bool
      val add :
        CCMultiMap.BIDIR.t ->
        CCMultiMap.BIDIR.left -> CCMultiMap.BIDIR.right -> CCMultiMap.BIDIR.t
      val remove :
        CCMultiMap.BIDIR.t ->
        CCMultiMap.BIDIR.left -> CCMultiMap.BIDIR.right -> CCMultiMap.BIDIR.t
      val cardinal_left : CCMultiMap.BIDIR.t -> int
      val cardinal_right : CCMultiMap.BIDIR.t -> int
      val remove_left :
        CCMultiMap.BIDIR.t -> CCMultiMap.BIDIR.left -> CCMultiMap.BIDIR.t
      val remove_right :
        CCMultiMap.BIDIR.t -> CCMultiMap.BIDIR.right -> CCMultiMap.BIDIR.t
      val mem_left : CCMultiMap.BIDIR.t -> CCMultiMap.BIDIR.left -> bool
      val mem_right : CCMultiMap.BIDIR.t -> CCMultiMap.BIDIR.right -> bool
      val find_left :
        CCMultiMap.BIDIR.t ->
        CCMultiMap.BIDIR.left -> CCMultiMap.BIDIR.right CCMultiMap.sequence
      val find_right :
        CCMultiMap.BIDIR.t ->
        CCMultiMap.BIDIR.right -> CCMultiMap.BIDIR.left CCMultiMap.sequence
      val find1_left :
        CCMultiMap.BIDIR.t ->
        CCMultiMap.BIDIR.left -> CCMultiMap.BIDIR.right option
      val find1_right :
        CCMultiMap.BIDIR.t ->
        CCMultiMap.BIDIR.right -> CCMultiMap.BIDIR.left option
      val fold :
        ('-> CCMultiMap.BIDIR.left -> CCMultiMap.BIDIR.right -> 'a) ->
        '-> CCMultiMap.BIDIR.t -> 'a
      val pairs :
        CCMultiMap.BIDIR.t ->
        (CCMultiMap.BIDIR.left * CCMultiMap.BIDIR.right) CCMultiMap.sequence
      val add_pairs :
        CCMultiMap.BIDIR.t ->
        (CCMultiMap.BIDIR.left * CCMultiMap.BIDIR.right) CCMultiMap.sequence ->
        CCMultiMap.BIDIR.t
      val seq_left :
        CCMultiMap.BIDIR.t -> CCMultiMap.BIDIR.left CCMultiMap.sequence
      val seq_right :
        CCMultiMap.BIDIR.t -> CCMultiMap.BIDIR.right CCMultiMap.sequence
    end
  module MakeBidir :
    functor (L : OrderedType) (R : OrderedType->
      sig
        type t
        type left = L.t
        type right = R.t
        val empty : t
        val is_empty : t -> bool
        val add : t -> left -> right -> t
        val remove : t -> left -> right -> t
        val cardinal_left : t -> int
        val cardinal_right : t -> int
        val remove_left : t -> left -> t
        val remove_right : t -> right -> t
        val mem_left : t -> left -> bool
        val mem_right : t -> right -> bool
        val find_left : t -> left -> right sequence
        val find_right : t -> right -> left sequence
        val find1_left : t -> left -> right option
        val find1_right : t -> right -> left option
        val fold : ('-> left -> right -> 'a) -> '-> t -> 'a
        val pairs : t -> (left * right) sequence
        val add_pairs : t -> (left * right) sequence -> t
        val seq_left : t -> left sequence
        val seq_right : t -> right sequence
      end
end