34 lines
		
	
	
		
			724 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			724 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors
 | 
						|
 | 
						|
# frozen_string_literal: true
 | 
						|
 | 
						|
module Tables
 | 
						|
  class WheelSwap
 | 
						|
    private attr_reader :initial_solution
 | 
						|
    def initialize(initial_solution)
 | 
						|
      @initial_solution = initial_solution
 | 
						|
    end
 | 
						|
 | 
						|
    def call(size = 1)
 | 
						|
      Rails.logger.debug { "WheelSwap with size: #{size}" }
 | 
						|
      new_solution = @initial_solution.deep_dup
 | 
						|
 | 
						|
      selected_guests = []
 | 
						|
 | 
						|
      size.times do
 | 
						|
        selected_guests += new_solution.tables.map(&:pop)
 | 
						|
      end
 | 
						|
 | 
						|
      selected_guests.shuffle!
 | 
						|
 | 
						|
      tables = new_solution.tables.cycle
 | 
						|
 | 
						|
      tables.next << selected_guests.pop while selected_guests.any?
 | 
						|
 | 
						|
      new_solution.tables.each(&:reset)
 | 
						|
 | 
						|
      new_solution
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |