sig
  module type G =
    sig
      type t
      module V : Sig.COMPARABLE
      module E :
        sig
          type t
          val dst : Fixpoint.G.E.t -> V.t
          val src : Fixpoint.G.E.t -> V.t
        end
      val fold_vertex : (V.t -> '-> 'a) -> Fixpoint.G.t -> '-> 'a
      val succ_e : Fixpoint.G.t -> V.t -> Fixpoint.G.E.t list
      val pred_e : Fixpoint.G.t -> V.t -> Fixpoint.G.E.t list
      val succ : Fixpoint.G.t -> V.t -> V.t list
      val pred : Fixpoint.G.t -> V.t -> V.t list
    end
  type direction = Forward | Backward
  module type Analysis =
    sig
      type data
      type edge
      type vertex
      type g
      val direction : Fixpoint.direction
      val join :
        Fixpoint.Analysis.data ->
        Fixpoint.Analysis.data -> Fixpoint.Analysis.data
      val equal : Fixpoint.Analysis.data -> Fixpoint.Analysis.data -> bool
      val analyze :
        Fixpoint.Analysis.edge ->
        Fixpoint.Analysis.data -> Fixpoint.Analysis.data
    end
  module Make :
    functor
      (G : G) (A : sig
                     type data
                     type edge = G.E.t
                     type vertex = G.V.t
                     type g = G.t
                     val direction : direction
                     val join : data -> data -> data
                     val equal : data -> data -> bool
                     val analyze : edge -> data -> data
                   end->
      sig val analyze : (G.V.t -> A.data) -> A.g -> G.V.t -> A.data end
end