module Tables class Swap private attr_reader :initial_solution def initialize(initial_solution) @initial_solution = initial_solution end def each @initial_solution.tables.combination(2) do |table_a, table_b| table_a.product(table_b).each do |(person_a, person_b)| table_a.delete(person_a) table_b.delete(person_b) table_a << person_b table_b << person_a yield(@initial_solution) ensure table_a.delete(person_b) table_b.delete(person_a) table_a << person_a table_b << person_b end end end end end