class DataTable
  def initialize(data)
    @data = data.map { |row| row.dup.freeze }.freeze
  end

  def item(row, col)
    return nil unless valid_row?(row) && valid_col?(col)
    @data[row][col]
  end

  def rows_count
    @data.size
  end

  def columns_count
    return 0 if @data.empty?
    @data.first.size
  end

  private

  def valid_row?(row)
    row.between?(0, rows_count - 1)
  end

  def valid_col?(col)
    col.between?(0, columns_count - 1)
  end
end

class DataList
  def initialize(items, column_names = [])
    @items = items.dup.freeze
    @selected = []
    @column_names = column_names
  end

  def select(number)
    index = number.to_i
    toggle_selection(index) if valid_index?(index)
  end

  def get_selected
    @selected.dup
  end

  def get_names
    @column_names
  end

  def get_data
    raise NotImplementedError, "Implement this method in a subclass"
  end

  private

  def valid_index?(index)
    index.between?(0, @items.size - 1)
  end

  def toggle_selection(index)
    @selected.include?(index) ? @selected.delete(index) : @selected << index
  end
end