sig
  type attr =
      [ `ArrowBack
      | `ArrowBoth
      | `ArrowForward
      | `ArrowHead of string
      | `ArrowTail of string
      | `Attr of string * string
      | `Box
      | `Circle
      | `Color of string
      | `Dotted
      | `Fillcolor of string
      | `Filled
      | `LR
      | `Label of string
      | `Oval
      | `Point
      | `Shape of string
      | `Style of string
      | `TB ]
  val pp_attr : Stdlib.Format.formatter -> Dotgraph.attr -> unit
  type dot
  val open_dot :
    ?name:string ->
    ?attr:Dotgraph.attr list -> ?file:string -> unit -> Dotgraph.dot
  val close : Dotgraph.dot -> unit
  val is_dot_installed : unit -> bool
  val layout :
    ?force:bool ->
    ?target:string ->
    ?engine:string -> ?output:string -> Dotgraph.dot -> string
  val printf :
    Dotgraph.dot ->
    ('a, Stdlib.Format.formatter, unit, unit) Stdlib.format4 -> 'a
  val println :
    Dotgraph.dot ->
    ('a, Stdlib.Format.formatter, unit, unit) Stdlib.format4 -> 'a
  val flush : Dotgraph.dot -> unit
  type node
  val node_default : Dotgraph.dot -> Dotgraph.attr list -> unit
  val edge_default : Dotgraph.dot -> Dotgraph.attr list -> unit
  val fresh : ?prefix:string -> Dotgraph.dot -> Dotgraph.node
  val pp_node : Dotgraph.node Pretty_utils.formatter
  val pp_edge : (Dotgraph.node * Dotgraph.node) Pretty_utils.formatter
  val node : Dotgraph.dot -> Dotgraph.node -> Dotgraph.attr list -> unit
  val edge :
    Dotgraph.dot ->
    Dotgraph.node -> Dotgraph.node -> Dotgraph.attr list -> unit
  val link : Dotgraph.dot -> Dotgraph.node list -> Dotgraph.attr list -> unit
  val inode :
    Dotgraph.dot ->
    ?prefix:string ->
    ?id:Dotgraph.node -> Dotgraph.attr list -> Dotgraph.node
  val rank : Dotgraph.dot -> Dotgraph.node list -> unit
  val subgraph :
    Dotgraph.dot ->
    ?cluster:bool -> Dotgraph.attr list -> (unit -> unit) -> unit
  type record =
      [ `Empty
      | `Hbox of Dotgraph.record list
      | `Label of string
      | `Port of string * Dotgraph.link list * string
      | `Vbox of Dotgraph.record list ]
  and link = string * Dotgraph.attr list * Dotgraph.node
  module Record :
    sig
      val ( <-> ) : Dotgraph.record -> Dotgraph.record -> Dotgraph.record
      val ( <|> ) : Dotgraph.record -> Dotgraph.record -> Dotgraph.record
      val link :
        ?anchor:string ->
        ?attr:Dotgraph.attr list -> Dotgraph.node -> Dotgraph.link
      val label :
        ?port:string -> ?link:Dotgraph.link list -> string -> Dotgraph.record
    end
  val port : Dotgraph.node -> string -> Dotgraph.node
  val record :
    Dotgraph.dot ->
    Dotgraph.node ->
    ?rounded:bool -> ?attr:Dotgraph.attr list -> Dotgraph.record -> unit
  val irecord :
    Dotgraph.dot ->
    ?prefix:string ->
    ?id:Dotgraph.node ->
    ?rounded:bool ->
    ?attr:Dotgraph.attr list -> Dotgraph.record -> Dotgraph.node
  module type Map =
    sig
      type key
      type 'a t
      val empty : 'Dotgraph.Map.t
      val find : Dotgraph.Map.key -> 'Dotgraph.Map.t -> 'a
      val add :
        Dotgraph.Map.key -> '-> 'Dotgraph.Map.t -> 'Dotgraph.Map.t
    end
  module Node :
    functor (M : Map->
      sig
        type t = M.key
        val add : Dotgraph.Node.t -> unit
        val get : Dotgraph.Node.t -> Dotgraph.node
        val node :
          Dotgraph.dot -> Dotgraph.Node.t -> Dotgraph.attr list -> unit
        val inode :
          Dotgraph.dot ->
          Dotgraph.Node.t -> Dotgraph.attr list -> Dotgraph.node
        val record :
          Dotgraph.dot ->
          Dotgraph.Node.t ->
          ?rounded:bool ->
          ?attr:Dotgraph.attr list -> Dotgraph.record -> unit
        val irecord :
          Dotgraph.dot ->
          Dotgraph.Node.t ->
          ?rounded:bool ->
          ?attr:Dotgraph.attr list -> Dotgraph.record -> Dotgraph.node
        val clear : unit -> unit
        val define :
          Dotgraph.dot -> (Dotgraph.Node.t -> Dotgraph.node -> unit) -> unit
        val prefix : string -> unit
      end
  val push : Dotgraph.dot -> (unit -> unit) -> unit
  val run : Dotgraph.dot -> unit
  type buffer
  val buffer : Dotgraph.attr list -> Dotgraph.buffer
  val bprintf :
    Dotgraph.buffer ->
    ('a, Stdlib.Format.formatter, unit, unit) Stdlib.format4 -> 'a
  val add_char : Dotgraph.buffer -> char -> unit
  val add_label : Dotgraph.buffer -> string -> unit
  val add_attr : Dotgraph.buffer -> Dotgraph.attr list -> unit
  val add_options :
    Dotgraph.buffer -> (bool * Dotgraph.attr list) list -> unit
  val attributes : Dotgraph.buffer -> Dotgraph.attr list
  val decorate :
    Dotgraph.attr list ->
    (bool * Dotgraph.attr list) list -> Dotgraph.attr list
end