let eps_closure (n : nfa) (q : state) : stateset =
let visited = ref StateSet.empty in
let rec walk (queue : state list) : unit = match queue with
| x::xs when not (StateSet.mem x !visited) ->
let to_enqueue = to_list (which_states ~create:false n.epsilon x) in
visited := StateSet.add x !visited;
walk (List.rev_append xs to_enqueue)
| x::xs -> walk xs
| _ -> ()
in
walk [q];
!visited