class Kleene::DFA

def deep_clone

transition callbacks are not copied beacuse it is assumed that the state transition callbacks may be stateful and reference structures or states that only exist in `self`, but not the cloned copy.
def deep_clone
  old_states = @states.to_a
  new_states = old_states.map(&:dup)
  state_mapping = old_states.zip(new_states).to_h
  transition_mapping = Hash.new
  new_transitions = transitions.map do |state, char_transition_map|
    [
      state_mapping[state],
      char_transition_map.map do |char, old_transition|
        new_transition = DFATransition.new(old_transition.token, state_mapping[old_transition.from], state_mapping[old_transition.to])
        transition_mapping[old_transition] = new_transition
        [char, new_transition]
      end.to_h
    ]
  end.to_h
  # new_transition_callbacks = transition_callbacks.map do |transition, callback|
  #   {
  #     transition_mapping[transition],
  #     callback
  #   }
  # end.to_h
  new_dfa_state_to_nfa_state_sets = dfa_state_to_nfa_state_sets.map {|dfa_state, nfa_state_set| [state_mapping[dfa_state], nfa_state_set] }.to_h
  DFA.new(state_mapping[@start_state], @alphabet.clone, new_transitions, new_dfa_state_to_nfa_state_sets, origin_nfa: origin_nfa).set_regex_pattern(regex_pattern)
end