sig
  module type V_SRC =
    sig
      type t
      module V : Sig.HASHABLE
      val fold_vertex : (V.t -> '-> 'a) -> Gmap.V_SRC.t -> '-> 'a
    end
  module type V_DST =
    sig
      type t
      type vertex
      val empty : unit -> Gmap.V_DST.t
      val add_vertex : Gmap.V_DST.t -> Gmap.V_DST.vertex -> Gmap.V_DST.t
    end
  module Vertex :
    functor (G_Src : V_SRC) (G_Dst : V_DST->
      sig
        val map : (G_Src.V.t -> G_Dst.vertex) -> G_Src.t -> G_Dst.t
        val filter_map :
          (G_Src.V.t -> G_Dst.vertex option) -> G_Src.t -> G_Dst.t
      end
  module type E_SRC =
    sig
      type t
      module E : Sig.ORDERED_TYPE
      val fold_edges_e : (E.t -> '-> 'a) -> Gmap.E_SRC.t -> '-> 'a
    end
  module type E_DST =
    sig
      type t
      type edge
      val empty : unit -> Gmap.E_DST.t
      val add_edge_e : Gmap.E_DST.t -> Gmap.E_DST.edge -> Gmap.E_DST.t
    end
  module Edge :
    functor (G_Src : E_SRC) (G_Dst : E_DST->
      sig
        val map : (G_Src.E.t -> G_Dst.edge) -> G_Src.t -> G_Dst.t
        val filter_map :
          (G_Src.E.t -> G_Dst.edge option) -> G_Src.t -> G_Dst.t
      end
end