xurfer/src/lovr/lib/iui/set.lua
2026-06-06 12:35:31 +02:00

63 lines
1.4 KiB
Lua

local currentPath = (...):match('(.-)[^%./]+$')
--- @class IUILib
local iui = require(currentPath .. "iui")
--- A type that stores an unordered collection of unique values.
--- @class IUISet<T>
--- @field private storage table<T, true>
--- @field new fun(): IUISet<T> Returns a new set.
--- @field put fun(self: self, v: T) Inserts `v`, if not already present.
--- @field putAll fun(self: self, s: IUISet<T>) Inserts all members of `s`.
--- @field remove fun(self: self, v: T) Removes `v`, if present.
--- @field removeAll fun(self: self) Removes all values.
--- @field has fun(self: self, v: T): boolean Returns whether the set has `v`.
--- @field getCount fun(self: self): number Returns the number of values, in O(n) time.
local Set = {}
Set.__index = Set
function Set.new()
local out = {
storage = {}
}
setmetatable(out, Set)
return out
end
function Set:put(v)
self.storage[v] = true
end
function Set:putAll(s)
local storage = self.storage
for k, _ in pairs(s.storage) do
storage[k] = true
end
end
function Set:remove(v)
self.storage[v] = nil
end
function Set:removeAll()
local storage = self.storage
for k, _ in pairs(storage) do
storage[k] = nil
end
end
function Set:has(v)
return self.storage[v] == true
end
function Set:getCount()
local count = 0
for _ in pairs(self.storage) do
count = count + 1
end
return count
end
iui.set = Set