class Kleene::DFA
def deep_clone
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