class Kleene::NFA
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 new_transitions = transitions.map {|state, char_transition_map| [ state_mapping[state], char_transition_map.map {|char, set_of_transisions| [ char, set_of_transisions.map {|transition| NFATransition.new(transition.token, state_mapping[transition.from], state_mapping[transition.to])}.to_set ] }.to_h ] }.to_h NFA.new(state_mapping[@start_state], @alphabet.clone, new_transitions, new_states.to_set).set_regex_pattern(regex_pattern) end