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
|