let copy_graph (graph : graph) : graph =
let newgraph = Hashtbl.create (Hashtbl.length graph) in
let copy_node n =
{ n with outb = Hashtbl.copy n.outb;
inb = Hashtbl.copy n.inb;
lang = match n.lang with
| Machine x -> Machine (Nfa.copy_nfa x)
| SubMachine (m, l) -> SubMachine (Nfa.copy_nfa m, Hashtbl.copy l)
| SuperMachine (m, trans) -> SuperMachine (Nfa.copy_nfa m, trans)
| Unrestricted -> Unrestricted }
in
let copy_mapping id node =
Hashtbl.replace newgraph id (copy_node node)
in
Hashtbl.iter copy_mapping graph;
newgraph