sig
  module type G =
    sig
      type t
      module V : Sig.COMPARABLE
      type vertex = V.t
      module E :
        sig
          type t
          val compare : t -> t -> int
          type vertex = vertex
          val src : t -> vertex
          val dst : t -> vertex
          type label
          val create : vertex -> label -> vertex -> t
          val label : t -> label
        end
      type edge = Contraction.G.E.t
      val empty : Contraction.G.t
      val add_edge_e :
        Contraction.G.t -> Contraction.G.edge -> Contraction.G.t
      val fold_edges_e :
        (Contraction.G.edge -> '-> 'a) -> Contraction.G.t -> '-> 'a
      val fold_vertex :
        (Contraction.G.vertex -> '-> 'a) -> Contraction.G.t -> '-> 'a
    end
  module Make :
    functor (G : G->
      sig
        val contract :
          (Contraction.G.E.t -> bool) -> Contraction.G.t -> Contraction.G.t
      end
end