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