let reverse (n : nfa) : nfa =
let res = new_nfa_states n.f n.s in
let process_delta q1 q2 cs = add_set_trans res q2 cs q1 in
let process_eps q1 q2 = add_trans res q2 Epsilon q1 in
let process_delta_outer q1 rhs =
Hashtbl.iter (process_delta q1) rhs in
let process_eps_outer q1 rhs =
Hashset.iter (process_eps q1) rhs
in
Hashtbl.iter process_delta_outer n.delta;
Hashtbl.iter process_eps_outer n.epsilon;
res