aboutsummaryrefslogtreecommitdiff
path: root/test/unit/set.lua
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-08-30 11:59:12 -0300
committerNicolas Hillegeer <nicolas@hillegeer.com>2014-08-31 14:50:49 +0200
commit38b7b4405e83a1dc36a050458dbc652a4317afa0 (patch)
tree1584569711d0f719c1d7db9a3a9d906c7e3c8182 /test/unit/set.lua
parent3a951112c099fc1b93766fabccd39cc65238cac5 (diff)
downloadrneovim-38b7b4405e83a1dc36a050458dbc652a4317afa0.tar.gz
rneovim-38b7b4405e83a1dc36a050458dbc652a4317afa0.tar.bz2
rneovim-38b7b4405e83a1dc36a050458dbc652a4317afa0.zip
unittest: convert set.moon to lua
Diffstat (limited to 'test/unit/set.lua')
-rw-r--r--test/unit/set.lua127
1 files changed, 127 insertions, 0 deletions
diff --git a/test/unit/set.lua b/test/unit/set.lua
new file mode 100644
index 0000000000..bfb6b8c41c
--- /dev/null
+++ b/test/unit/set.lua
@@ -0,0 +1,127 @@
+-- a set class for fast union/diff, can always return a table with the lines
+-- in the same relative order in which they were added by calling the
+-- to_table method. It does this by keeping two lua tables that mirror each
+-- other:
+-- 1) index => item
+-- 2) item => index
+local Set = {}
+
+function Set:new(items)
+ local obj = {}
+ setmetatable(obj, self)
+ self.__index = self
+
+ if type(items) == 'table' then
+ local tempset = Set:new()
+ tempset:union_table(items)
+ obj.tbl = tempset:raw_tbl()
+ obj.items = tempset:raw_items()
+ obj.nelem = tempset:size()
+ else
+ obj.tbl = {}
+ obj.items = {}
+ obj.nelem = 0
+ end
+
+ return obj
+end
+
+-- adds the argument Set to this Set
+function Set:union(other)
+ for e in other:iterator() do
+ self:add(e)
+ end
+end
+
+-- adds the argument table to this Set
+function Set:union_table(t)
+ for k, v in pairs(t) do
+ self:add(v)
+ end
+end
+
+-- subtracts the argument Set from this Set
+function Set:diff(other)
+ if other:size() > self:size() then
+ -- this set is smaller than the other set
+ for e in self:iterator() do
+ if other:contains(e) then
+ self:remove(e)
+ end
+ end
+ else
+ -- this set is larger than the other set
+ for e in other:iterator() do
+ if self.items[e] then
+ self:remove(e)
+ end
+ end
+ end
+end
+
+function Set:add(it)
+ if not self:contains(it) then
+ local idx = #self.tbl + 1
+ self.tbl[idx] = it
+ self.items[it] = idx
+ self.nelem = self.nelem + 1
+ end
+end
+
+function Set:remove(it)
+ if self:contains(it) then
+ local idx = self.items[it]
+ self.tbl[idx] = nil
+ self.items[it] = nil
+ self.nelem = self.nelem - 1
+ end
+end
+
+function Set:contains(it)
+ return self.items[it] or false
+end
+
+function Set:size()
+ return self.nelem
+end
+
+function Set:raw_tbl()
+ return self.tbl
+end
+
+function Set:raw_items()
+ return self.items
+end
+
+function Set:iterator()
+ return pairs(self.items)
+end
+
+function Set:to_table()
+ -- there might be gaps in @tbl, so we have to be careful and sort first
+ local keys
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ for idx, _ in pairs(self.tbl) do
+ _accum_0[_len_0] = idx
+ _len_0 = _len_0 + 1
+ end
+ keys = _accum_0
+ end
+ table.sort(keys)
+ local copy
+ do
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = 1, #keys do
+ local idx = keys[_index_0]
+ _accum_0[_len_0] = self.tbl[idx]
+ _len_0 = _len_0 + 1
+ end
+ copy = _accum_0
+ end
+ return copy
+end
+
+return Set