56 lines
1.1 KiB
Lua
56 lines
1.1 KiB
Lua
--buffer by rnd
|
|
|
|
buffer = {};
|
|
buffer.idx = 0
|
|
buffer.data = {};
|
|
buffer.t = 0 -- how many unread insertions
|
|
|
|
buffer.add = function(element) -- insert new element
|
|
local i = buffer.idx+1;
|
|
if i > buffer.size then i = 1 end
|
|
buffer.data[i]=element
|
|
buffer.idx = i
|
|
local t = buffer.t +1
|
|
if t>buffer.size then t = buffer.size end
|
|
buffer.t = t
|
|
end
|
|
|
|
buffer.read = function() -- pop 1 message, return nil if none
|
|
local t = buffer.t;
|
|
if t>0 then
|
|
buffer.t = t-1
|
|
local idx = buffer.idx;
|
|
if idx>1 then buffer.idx = idx - 1 else buffer.idx = buffer.size end
|
|
return buffer.data[idx];
|
|
end
|
|
end
|
|
|
|
buffer.last = function(count) -- returns list of "count" recently inserted elements
|
|
local ret = {};
|
|
local idx = buffer.idx;
|
|
local size = buffer.size;
|
|
if count > size then count = size end
|
|
local data = buffer.data
|
|
for i = idx,1,-1 do
|
|
ret[#ret+1] = data[i];
|
|
end
|
|
|
|
if count > idx then
|
|
for i = 1,count - idx do
|
|
ret[#ret+1]=data[buffer.size-i+1]
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
|
|
|
|
buffer.size = 3;
|
|
buffer.add(1);buffer.add(2);
|
|
--say(minetest.serialize(buffer.read()))
|
|
say("1 " .. buffer.read())
|
|
say(buffer.t)
|
|
say("2 " .. buffer.read())
|
|
say("3 " .. buffer.read())
|
|
|
|
self.remove() |