sig
  module Id : Types.Integral
  type ('gen, 'mut, 'obs) kind =
      Generator of 'gen
    | Mutator of 'mut
    | Observer of 'obs
  type ('gen, 'mut, 'obs) edge = {
    target : Id.t;
    op : ('gen, 'mut, 'obs) Reins.Dug.kind;
    pos : int;
  }
  type ('gen, 'mut, 'obs) t = {
    mutable current_id : Id.t;
    nodes : (Id.t, ('gen, 'mut, 'obs) Reins.Dug.kind) Hashtbl.t;
    edges : (Id.t, ('gen, 'mut, 'obs) Reins.Dug.edge) Hashtbl.t;
  }
  val create : unit -> ('gen, 'mut, 'obs) Reins.Dug.t
  val clear : ('gen, 'mut, 'obs) Reins.Dug.t -> unit
  val size : ('eng, 'mut, 'obs) Reins.Dug.t -> Id.t
  val fresh_id : ('gen, 'mut, 'obs) Reins.Dug.t -> Id.t
  val is_mutator : ('gen, 'mut, 'obs) Reins.Dug.kind -> bool
  val is_generator : ('gen, 'mut, 'obs) Reins.Dug.kind -> bool
  val is_observer : ('gen, 'mut, 'obs) Reins.Dug.kind -> bool
end