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