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