module(..., package.seeall)
local utils = require(_PACKAGE .. 'utils')
local Set = utils.public_class('Set')
function Set:initialize(...)
self.items = {}
for _, i in ipairs{...} do self.items[i] = true end
end
function Set:add(item)
if item then self.items[item] = true end
end
function Set:remove(item)
self.items[item] = nil
end
----------------------------------------
function Set:length()
local n = 0
for k, _ in pairs(self.items) do n = n + 1 end
return n
end
function Set:clear()
self.items = {}
end
function Set:empty()
return next(self.items) == nil
end
----------------------------------------
function Set:map(fn, ...)
local result = Set()
for item, _ in pairs(self.items) do
result:add( fn(item, ...) )
end
return result
end
function Set:each(fn, ...)
if fn then
for item, _ in pairs(self.items) do
fn(item, ...)
end
else
return next, self.items, nil
end
end
function Set:method_map(fn_name, ...)
local result = Set()
for item, _ in pairs(self.items) do
local fn = item[fn_name]
result:add( fn(item, ...) )
end
return result
end