local MultiSelect = {} MultiSelect.__index = MultiSelect function MultiSelect:new() return setmetatable({ _entries = {}, }, MultiSelect) end function MultiSelect:get() local marked_entries = {} for entry, count in pairs(self._entries) do table.insert(marked_entries, { count, entry }) end table.sort(marked_entries, function(left, right) return left[1] < right[1] end) local selections = {} for _, entry in ipairs(marked_entries) do table.insert(selections, entry[2]) end return selections end function MultiSelect:is_selected(entry) return self._entries[entry] end local multi_select_count = 0 function MultiSelect:add(entry) multi_select_count = multi_select_count + 1 self._entries[entry] = multi_select_count end function MultiSelect:drop(entry) self._entries[entry] = nil end function MultiSelect:toggle(entry) if self:is_selected(entry) then self:drop(entry) else self:add(entry) end end return MultiSelect