-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOrdered.lua
60 lines (57 loc) · 1.9 KB
/
Ordered.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
--[[
Source: http://lua-users.org/wiki/OrderedTableSimple
LUA 5.1 compatible
Ordered Table
keys added will be also be stored in a metatable to recall the insertion oder
metakeys can be seen with for i,k in ( <this>:ipairs() or ipairs( <this>._korder ) ) do
ipairs( ) is a bit faster
variable names inside __index shouldn't be added, if so you must delete these again to access the metavariable
or change the metavariable names, except for the 'del' command. thats the reason why one cannot change its value
]]--
function Ordered( t )
local mt = {}
-- set methods
mt.__index = {
-- set key order table inside __index for faster lookup
_korder = {},
-- traversal of hidden values
hidden = function() return pairs( mt.__index ) end,
-- traversal of table ordered: returning index, key
ipairs = function( self ) return ipairs( self._korder ) end,
-- traversal of table
pairs = function( self ) return pairs( self ) end,
-- traversal of table ordered: returning key,value
opairs = function( self )
local i = 0
local function iter( self )
i = i + 1
local k = self._korder[i]
if k then
return k,self[k]
end
end
return iter,self
end,
-- to be able to delete entries we must write a delete function
del = function( self,key )
if self[key] then
self[key] = nil
for i,k in ipairs( self._korder ) do
if k == key then
table.remove( self._korder, i )
return
end
end
end
end,
}
-- set new index handling
mt.__newindex = function( self,k,v )
if k ~= "del" and v then
rawset( self,k,v )
table.insert( self._korder, k )
end
end
return setmetatable( t or {},mt )
end
-- CHILLCODE™