sig
  module Concrete :
    functor
      (G : sig
             type t
             val create : ?n:int -> ?m:int -> unit -> t
             val n : t -> int
             val n_mem : t -> int
             val m : t -> int
             val add_vertex : t -> int -> unit
             val del_vertex : t -> t -> int -> unit
             val mem_vertex : t -> int -> bool
             val add_edge : t -> int -> int -> unit
             val del_edge : ?only_first:bool -> t -> int -> int -> unit
             val mem_edge : t -> int -> int -> bool
             val multiplicity_edge : t -> int -> int -> int
             val out_degree : t -> int -> int
             val reverse : ?store_reverse:bool -> t -> t
             val symmetrize : t -> unit
             val sort : ?store_reverse:bool -> t -> unit
             val iter_succ : (int -> unit) -> t -> int -> unit
             val fold_succ : (int -> '-> 'a) -> t -> int -> '-> 'a
             val iter_vertex : (int -> unit) -> t -> unit
             val fold_vertex : (int -> '-> 'a) -> t -> '-> 'a
             val iter_edges : (int -> int -> unit) -> t -> unit
             val fold_edges : (int -> int -> '-> 'a) -> t -> '-> 'a
             val in_degree : t -> int -> int
             val iter_pred : (int -> unit) -> t -> int -> unit
             val fold_pred : (int -> '-> 'a) -> t -> int -> '-> 'a
             val dump : out_channel -> t -> unit
             val to_string : t -> string
             type v_label = unit
             type e_label
             val add_vertex_l : t -> int -> v_label -> unit
             val vertex_l : t -> int -> v_label
             val add_edge_l : t -> int -> e_label -> int -> unit
             val find_edge_l : t -> int -> int -> e_label
             val find_all_edges_l : t -> int -> int -> e_label list
             val fold_multi_edge_l :
               (e_label -> '-> 'a) -> t -> int -> int -> '-> 'a
             val iter_succ_l : (e_label -> int -> unit) -> t -> int -> unit
             val fold_succ_l :
               (e_label -> int -> '-> 'a) -> t -> int -> '-> 'a
             val iter_vertex_l : (int -> v_label -> unit) -> t -> unit
             val fold_vertex_l :
               (int -> v_label -> '-> 'a) -> t -> '-> 'a
             val iter_edges_l : (int -> e_label -> int -> unit) -> t -> unit
             val fold_edges_l :
               (int -> e_label -> int -> '-> 'a) -> t -> '-> 'a
             val iter_pred_l : (e_label -> int -> unit) -> t -> int -> unit
             val fold_pred_l :
               (e_label -> int -> '-> 'a) -> t -> int -> '-> 'a
             val label_find_vertex : t -> v_label -> int
             val label_add_vertex : t -> v_label -> int
             val label_add_edge : t -> v_label -> v_label -> unit
             val label_add_edge_l :
               t -> v_label -> e_label -> v_label -> unit
             val to_string_l :
               (v_label -> string) ->
               ?elab_to_str:(e_label -> string) -> t -> string
           end->
      sig
        type t = G.t
        val create : ?n:int -> ?m:int -> unit -> t
        val n : t -> int
        val n_mem : t -> int
        val m : t -> int
        val add_vertex : t -> int -> unit
        val del_vertex : t -> t -> int -> unit
        val mem_vertex : t -> int -> bool
        val add_edge : t -> int -> int -> unit
        val del_edge : ?only_first:bool -> t -> int -> int -> unit
        val mem_edge : t -> int -> int -> bool
        val multiplicity_edge : t -> int -> int -> int
        val out_degree : t -> int -> int
        val reverse : ?store_reverse:bool -> t -> t
        val symmetrize : t -> unit
        val sort : ?store_reverse:bool -> t -> unit
        val iter_succ : (int -> unit) -> t -> int -> unit
        val fold_succ : (int -> '-> 'a) -> t -> int -> '-> 'a
        val iter_vertex : (int -> unit) -> t -> unit
        val fold_vertex : (int -> '-> 'a) -> t -> '-> 'a
        val iter_edges : (int -> int -> unit) -> t -> unit
        val fold_edges : (int -> int -> '-> 'a) -> t -> '-> 'a
        val in_degree : t -> int -> int
        val iter_pred : (int -> unit) -> t -> int -> unit
        val fold_pred : (int -> '-> 'a) -> t -> int -> '-> 'a
        val dump : out_channel -> t -> unit
        val to_string : t -> string
        type v_label = unit
        type e_label = G.e_label
        val add_vertex_l : t -> int -> v_label -> unit
        val vertex_l : t -> int -> v_label
        val add_edge_l : t -> int -> e_label -> int -> unit
        val find_edge_l : t -> int -> int -> e_label
        val find_all_edges_l : t -> int -> int -> e_label list
        val fold_multi_edge_l :
          (e_label -> '-> 'a) -> t -> int -> int -> '-> 'a
        val iter_succ_l : (e_label -> int -> unit) -> t -> int -> unit
        val fold_succ_l :
          (e_label -> int -> '-> 'a) -> t -> int -> '-> 'a
        val iter_vertex_l : (int -> v_label -> unit) -> t -> unit
        val fold_vertex_l : (int -> v_label -> '-> 'a) -> t -> '-> 'a
        val iter_edges_l : (int -> e_label -> int -> unit) -> t -> unit
        val fold_edges_l :
          (int -> e_label -> int -> '-> 'a) -> t -> '-> 'a
        val iter_pred_l : (e_label -> int -> unit) -> t -> int -> unit
        val fold_pred_l :
          (e_label -> int -> '-> 'a) -> t -> int -> '-> 'a
        val label_find_vertex : t -> v_label -> int
        val label_add_vertex : t -> v_label -> int
        val label_add_edge : t -> v_label -> v_label -> unit
        val label_add_edge_l : t -> v_label -> e_label -> v_label -> unit
        val to_string_l :
          (v_label -> string) ->
          ?elab_to_str:(e_label -> string) -> t -> string
        module V :
          sig
            type label = int
            type t = int
            val create : '-> 'a
            val label : '-> 'a
          end
        module E :
          sig
            type label = G.e_label
            type vertex = int
            type t = int * IntDigraph.OcamlGraph.Concrete.E.label * int
            val create : '-> '-> '-> 'a * 'b * 'c
            val src : 'a * 'b * '-> 'a
            val dst : 'a * 'b * '-> 'c
            val label : 'a * 'b * '-> 'b
          end
        val nb_vertex : t -> int
        val nb_edges : t -> int
        val is_empty : t -> bool
        val add_edge_e : '-> t * int * e_label -> int -> unit
        val mem_edge_e : t -> int * 'a * int -> bool
        val find_edge : '-> t -> int -> t * (int -> e_label) * int
        val find_all_edges : t -> int -> int -> (int * e_label * int) list
        val succ : t -> int -> int list
        val succ_e : t -> int -> (int * e_label * int) list
        val iter_succ_e : (int * e_label * int -> unit) -> t -> int -> unit
        val fold_succ_e :
          ('a * e_label * int -> '-> 'b) -> t -> '-> int -> '-> 'b
        val iter_edges_e : (int -> int * e_label * int -> unit) -> t -> unit
        val fold_edges_e : (int * e_label * int -> '-> 'a) -> t -> '-> 'a
        val pred : t -> int -> int list
        val pred_e : t -> int -> (int * e_label * int) list
        val iter_pred_e : (int * e_label * int -> unit) -> t -> int -> unit
        val fold_pred_e :
          ('a * e_label * int -> '-> 'b) -> t -> '-> int -> '-> 'b
      end
end