functor (Node : X.X_TYPE->
  functor
    (NodeSet : sig
                 type t
                 val name : string
                 val compare : t -> t -> int
                 val pair : t -> t -> t
                 val of_string : string -> t
                 val to_string : t -> string
                 val print : ?oc:out_channel -> t -> unit
                 val print_ : ?oc:out_channel -> t -> unit
                 type elt = Node.t
                 val of_list : elt list -> t
                 val to_file : string -> t -> unit
                 val of_file : string -> t
                 val cross : t -> t -> t
                 val empty : t
                 val is_empty : t -> bool
                 val mem : elt -> t -> bool
                 val add : elt -> t -> t
                 val singleton : elt -> t
                 val remove : elt -> t -> t
                 val union : t -> t -> t
                 val inter : t -> t -> t
                 val diff : t -> t -> t
                 val equal : t -> t -> bool
                 val subset : t -> t -> bool
                 val iter : (elt -> unit) -> t -> unit
                 val fold : (elt -> '-> 'a) -> t -> '-> 'a
                 val for_all : (elt -> bool) -> t -> bool
                 val exists : (elt -> bool) -> t -> bool
                 val filter : (elt -> bool) -> t -> t
                 val partition : (elt -> bool) -> t -> t * t
                 val cardinal : t -> int
                 val elements : t -> elt list
                 val min_elt : t -> elt
                 val max_elt : t -> elt
                 val choose : t -> elt
                 val split : elt -> t -> t * bool * t
               end->
    functor
      (Edge : sig
                type t
                val name : string
                val compare : t -> t -> int
                val pair : t -> t -> t
                val of_string : string -> t
                val to_string : t -> string
                val print : ?oc:out_channel -> t -> unit
                val print_ : ?oc:out_channel -> t -> unit
                type node = Node.t
                type label
                val origin : t -> node
                val terminus : t -> node
                val label : t -> label
                val make : node -> node -> label -> t
                val label_compare : label -> label -> int
                val to_dotstring : t -> string
              end->
      functor
        (EdgeSet : sig
                     type t
                     val name : string
                     val compare : t -> t -> int
                     val pair : t -> t -> t
                     val of_string : string -> t
                     val to_string : t -> string
                     val print : ?oc:out_channel -> t -> unit
                     val print_ : ?oc:out_channel -> t -> unit
                     type elt = Edge.t
                     val of_list : elt list -> t
                     val to_file : string -> t -> unit
                     val of_file : string -> t
                     val cross : t -> t -> t
                     val empty : t
                     val is_empty : t -> bool
                     val mem : elt -> t -> bool
                     val add : elt -> t -> t
                     val singleton : elt -> t
                     val remove : elt -> t -> t
                     val union : t -> t -> t
                     val inter : t -> t -> t
                     val diff : t -> t -> t
                     val equal : t -> t -> bool
                     val subset : t -> t -> bool
                     val iter : (elt -> unit) -> t -> unit
                     val fold : (elt -> '-> 'a) -> t -> '-> 'a
                     val for_all : (elt -> bool) -> t -> bool
                     val exists : (elt -> bool) -> t -> bool
                     val filter : (elt -> bool) -> t -> t
                     val partition : (elt -> bool) -> t -> t * t
                     val cardinal : t -> int
                     val elements : t -> elt list
                     val min_elt : t -> elt
                     val max_elt : t -> elt
                     val choose : t -> elt
                     val split : elt -> t -> t * bool * t
                   end->
        functor (D : Delim.DELIM_TYPE->
          sig
            type t
            val name : string
            val compare : t -> t -> int
            val pair : t -> t -> t
            val of_string : string -> t
            val to_string : t -> string
            val print : ?oc:out_channel -> t -> unit
            val print_ : ?oc:out_channel -> t -> unit
            type nodeSet = NodeSet.t
            type edgeSet = EdgeSet.t
            val empty : t
            val make : nodeSet -> nodeSet -> edgeSet -> t
            val of_file : string -> t
            val to_file : string -> t -> unit
            val to_dotstring :
              ?size:string ->
              ?rd:string ->
              ?shape:string -> ?fs:string -> string -> t -> string
            val to_dotfile :
              ?size:string ->
              ?rd:string ->
              ?shape:string -> ?fs:string -> string -> string -> t -> unit
            val report : t -> unit
            val starts : t -> nodeSet
            val finals : t -> nodeSet
            val edges : t -> edgeSet
            val nodes : t -> nodeSet
            val is_cyclic : t -> bool
            val is_stripped : t -> bool
            val are_isomorphic : t -> t -> bool
            val equal : t -> t -> bool
            val reverse : t -> t
            val trim : t -> t
            val rename : t -> t
            val rename_n : int -> t -> t
            val inter : t -> t -> t
            val union : t -> t -> t
          end