aboutsummaryrefslogtreecommitdiff
path: root/containers.lua
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-08-29 19:38:14 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-08-29 19:39:15 -0700
commit4f30e02acb666c52e0254eb9a3bf89a9cabb5e6d (patch)
treebacc6a2baf70c18d3d44db06dc2235ec42edd49f /containers.lua
parentaae5ce31feb482a86d8ef96fb1f104194f26828c (diff)
Handling more compatibility stuff, including Lua 5.4, and a backup for
if openssl module is not found, and moving containers (List/Dict) into their own file, as well as bit operators (and support for __bxor, etc. metamethods in Lua 5.2/LuaJIT)
Diffstat (limited to 'containers.lua')
-rw-r--r--containers.lua240
1 files changed, 240 insertions, 0 deletions
diff --git a/containers.lua b/containers.lua
new file mode 100644
index 0000000..09de4e5
--- /dev/null
+++ b/containers.lua
@@ -0,0 +1,240 @@
+local insert, remove, concat
+do
+ local _obj_0 = table
+ insert, remove, concat = _obj_0.insert, _obj_0.remove, _obj_0.concat
+end
+local repr, stringify, equivalent, nth_to_last, size
+do
+ local _obj_0 = require('utils')
+ repr, stringify, equivalent, nth_to_last, size = _obj_0.repr, _obj_0.stringify, _obj_0.equivalent, _obj_0.nth_to_last, _obj_0.size
+end
+local list, dict
+local _list_mt = {
+ __eq = equivalent,
+ __tostring = function(self)
+ return "[" .. concat((function()
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = 1, #self do
+ local b = self[_index_0]
+ _accum_0[_len_0] = repr(b)
+ _len_0 = _len_0 + 1
+ end
+ return _accum_0
+ end)(), ", ") .. "]"
+ end,
+ __lt = function(self, other)
+ assert(type(self) == 'table' and type(other) == 'table', "Incompatible types for comparison")
+ for i = 1, math.max(#self, #other) do
+ if not self[i] and other[i] then
+ return true
+ elseif self[i] and not other[i] then
+ return false
+ elseif self[i] < other[i] then
+ return true
+ elseif self[i] > other[i] then
+ return false
+ end
+ end
+ return false
+ end,
+ __le = function(self, other)
+ assert(type(self) == 'table' and type(other) == 'table', "Incompatible types for comparison")
+ for i = 1, math.max(#self, #other) do
+ if not self[i] and other[i] then
+ return true
+ elseif self[i] and not other[i] then
+ return false
+ elseif self[i] < other[i] then
+ return true
+ elseif self[i] > other[i] then
+ return false
+ end
+ end
+ return true
+ end,
+ __add = function(self, other)
+ local ret = list((function()
+ local _accum_0 = { }
+ local _len_0 = 1
+ for _index_0 = 1, #self do
+ local x = self[_index_0]
+ _accum_0[_len_0] = x
+ _len_0 = _len_0 + 1
+ end
+ return _accum_0
+ end)())
+ for _index_0 = 1, #other do
+ local x = other[_index_0]
+ insert(ret, x)
+ end
+ return ret
+ end,
+ __index = {
+ add_1 = insert,
+ append_1 = insert,
+ add_1_at_index_2 = function(t, x, i)
+ return insert(t, i, x)
+ end,
+ at_index_1_add_2 = insert,
+ pop = remove,
+ remove_last = remove,
+ remove_index_1 = remove,
+ last = (function(self)
+ return self[#self]
+ end),
+ first = (function(self)
+ return self[1]
+ end),
+ _1_st_to_last = nth_to_last,
+ _1_nd_to_last = nth_to_last,
+ _1_rd_to_last = nth_to_last,
+ _1_th_to_last = nth_to_last,
+ has_1 = function(self, item)
+ for _index_0 = 1, #self do
+ local x = self[_index_0]
+ if x == item then
+ return true
+ end
+ end
+ return false
+ end,
+ index_of_1 = function(self, item)
+ for i, x in ipairs(self) do
+ if x == item then
+ return i
+ end
+ end
+ return nil
+ end
+ }
+}
+list = function(t)
+ return setmetatable(t, _list_mt)
+end
+local walk_items
+walk_items = function(self, i)
+ i = i + 1
+ local k, v = next(self.table, self.key)
+ if k ~= nil then
+ self.key = k
+ return i, dict({
+ key = k,
+ value = v
+ })
+ end
+end
+local _dict_mt = {
+ __eq = equivalent,
+ __len = size,
+ __tostring = function(self)
+ return "{" .. concat((function()
+ local _accum_0 = { }
+ local _len_0 = 1
+ for k, v in pairs(self) do
+ _accum_0[_len_0] = tostring(repr(k)) .. ": " .. tostring(repr(v))
+ _len_0 = _len_0 + 1
+ end
+ return _accum_0
+ end)(), ", ") .. "}"
+ end,
+ __ipairs = function(self)
+ return walk_items, {
+ table = self,
+ key = nil
+ }, 0
+ end,
+ __band = function(self, other)
+ return dict((function()
+ local _tbl_0 = { }
+ for k, v in pairs(self) do
+ if other[k] ~= nil then
+ _tbl_0[k] = v
+ end
+ end
+ return _tbl_0
+ end)())
+ end,
+ __bor = function(self, other)
+ local ret
+ do
+ local _tbl_0 = { }
+ for k, v in pairs(self) do
+ _tbl_0[k] = v
+ end
+ ret = _tbl_0
+ end
+ for k, v in pairs(other) do
+ if ret[k] == nil then
+ ret[k] = v
+ end
+ end
+ return dict(ret)
+ end,
+ __bxor = function(self, other)
+ local ret
+ do
+ local _tbl_0 = { }
+ for k, v in pairs(self) do
+ _tbl_0[k] = v
+ end
+ ret = _tbl_0
+ end
+ for k, v in pairs(other) do
+ if ret[k] == nil then
+ ret[k] = v
+ else
+ ret[k] = nil
+ end
+ end
+ return dict(ret)
+ end,
+ __add = function(self, other)
+ local ret
+ do
+ local _tbl_0 = { }
+ for k, v in pairs(self) do
+ _tbl_0[k] = v
+ end
+ ret = _tbl_0
+ end
+ for k, v in pairs(other) do
+ if ret[k] == nil then
+ ret[k] = v
+ else
+ ret[k] = ret[k] + v
+ end
+ end
+ return dict(ret)
+ end,
+ __sub = function(self, other)
+ local ret
+ do
+ local _tbl_0 = { }
+ for k, v in pairs(self) do
+ _tbl_0[k] = v
+ end
+ ret = _tbl_0
+ end
+ for k, v in pairs(other) do
+ if ret[k] == nil then
+ ret[k] = -v
+ else
+ ret[k] = ret[k] - v
+ end
+ end
+ return dict(ret)
+ end
+}
+dict = function(t)
+ return setmetatable(t, _dict_mt)
+end
+for i, entry in ipairs(dict({
+ x = 99
+})) do
+ assert(i == 1 and entry.key == "x" and entry.value == 99, "ipairs compatibility issue")
+end
+return {
+ list = list,
+ dict = dict
+}