sig
  module type S =
    sig
      type graph
      type vertex
      type edge
      type edge_label
      val merge_vertex :
        Merge.S.graph -> Merge.S.vertex list -> Merge.S.graph
      val merge_edges_e :
        ?src:Merge.S.vertex ->
        ?dst:Merge.S.vertex ->
        Merge.S.graph -> Merge.S.edge list -> Merge.S.graph
      val merge_edges_with_label :
        ?src:Merge.S.vertex ->
        ?dst:Merge.S.vertex ->
        ?label:Merge.S.edge_label ->
        Merge.S.graph -> Merge.S.edge_label -> Merge.S.graph
      val merge_isolabelled_edges : Merge.S.graph -> Merge.S.graph
      val merge_ends :
        ?strict:bool ->
        ?specified_vertex:Merge.S.vertex -> Merge.S.graph -> Merge.S.graph
      val merge_starts :
        ?strict:bool ->
        ?specified_vertex:Merge.S.vertex -> Merge.S.graph -> Merge.S.graph
      val merge_scc :
        ?loop_killer:bool ->
        ?specified_vertex:(Merge.S.vertex list -> Merge.S.vertex) ->
        Merge.S.graph -> Merge.S.graph
    end
  module B :
    functor (X : Builder.S->
      sig
        type graph = X.G.t
        type edge_label = X.G.E.label
        val merge_vertex : graph -> X.G.vertex list -> graph
        val merge_edges_e :
          ?src:X.G.vertex ->
          ?dst:X.G.vertex -> graph -> X.G.edge list -> graph
        val merge_edges_with_label :
          ?src:X.G.vertex ->
          ?dst:X.G.vertex ->
          ?label:edge_label -> graph -> edge_label -> graph
        val merge_isolabelled_edges : graph -> graph
        val merge_ends :
          ?strict:bool -> ?specified_vertex:X.G.vertex -> graph -> graph
        val merge_starts :
          ?strict:bool -> ?specified_vertex:X.G.vertex -> graph -> graph
        val merge_scc :
          ?loop_killer:bool ->
          ?specified_vertex:(X.G.vertex list -> X.G.vertex) -> graph -> graph
      end
  module P :
    functor (G : Sig.P->
      sig
        type graph = G.t
        type edge_label = G.E.label
        val merge_vertex : graph -> G.vertex list -> graph
        val merge_edges_e :
          ?src:G.vertex -> ?dst:G.vertex -> graph -> G.edge list -> graph
        val merge_edges_with_label :
          ?src:G.vertex ->
          ?dst:G.vertex -> ?label:edge_label -> graph -> edge_label -> graph
        val merge_isolabelled_edges : graph -> graph
        val merge_ends :
          ?strict:bool -> ?specified_vertex:G.vertex -> graph -> graph
        val merge_starts :
          ?strict:bool -> ?specified_vertex:G.vertex -> graph -> graph
        val merge_scc :
          ?loop_killer:bool ->
          ?specified_vertex:(G.vertex list -> G.vertex) -> graph -> graph
      end
  module I :
    functor (G : Sig.I->
      sig
        type graph = G.t
        type vertex = G.vertex
        type edge = G.edge
        type edge_label = G.E.label
        val merge_vertex : Merge.I.graph -> Merge.I.vertex list -> unit
        val merge_edges_e :
          ?src:Merge.I.vertex ->
          ?dst:Merge.I.vertex -> Merge.I.graph -> Merge.I.edge list -> unit
        val merge_edges_with_label :
          ?src:Merge.I.vertex ->
          ?dst:Merge.I.vertex ->
          ?label:Merge.I.edge_label ->
          Merge.I.graph -> Merge.I.edge_label -> unit
        val merge_isolabelled_edges : Merge.I.graph -> unit
        val merge_ends :
          ?strict:bool ->
          ?specified_vertex:Merge.I.vertex -> Merge.I.graph -> unit
        val merge_starts :
          ?strict:bool ->
          ?specified_vertex:Merge.I.vertex -> Merge.I.graph -> unit
        val merge_scc :
          ?loop_killer:bool ->
          ?specified_vertex:(Merge.I.vertex list -> Merge.I.vertex) ->
          Merge.I.graph -> unit
      end
end