module type PrintableType = sig type t val pp : out_channel -> t -> unit val pp_list : out_channel -> t list -> unit end module Node : sig type t = { id: int; } val compare : t -> t -> int val create : unit -> t end module NodeMap : sig include Map.S with type key = Node.t val add_to_list_last : key -> 'a -> 'a list t -> 'a list t end module NodeSet : Set.S with type elt = Node.t type 'a cfginternal = { empty: bool; nodes: NodeSet.t; edges: (Node.t * (Node.t option)) NodeMap.t; reverse_edges: (Node.t list) NodeMap.t; input_val: int option; input_output_var: (string * string) option; initial: Node.t option; terminal: Node.t option; content: 'a list NodeMap.t; } module type C = sig type elt type t = elt cfginternal val empty : t val merge : t -> t -> Node.t -> Node.t -> t val concat : t -> t -> t val add_to_last_node : elt -> t -> t val pp : out_channel -> t -> unit end module Make (M: PrintableType) : C with type elt = M.t