-------------------------------------------------------------------------------
--- A Queue implementation, taken & adapted from https://www.lua.org/pil/11.4.html
-- @submodule worldeditadditions.utils.queue

local Queue = {}
Queue.__index = Queue

function Queue.new()
	result = { first = 0, last = -1, items = {} }
	setmetatable(result, Queue)
	return result
end

function Queue:enqueue(value)
	local new_last = self.last + 1
	self.last = new_last
	self.items[new_last] = value
	return new_last
end

function Queue:contains(value)
	for i=self.first,self.last do
		if self.items[i] == value then
			return true
		end
	end
	return false
end

function Queue:is_empty()
	return self.first > self.last
end

function Queue:remove_index(index)
	self.items[index] = nil
end

function Queue:dequeue()
	if Queue.is_empty(self) then
		error("Error: The self is empty!")
	end
	
	local first = self.first
	-- Find the next non-nil item
	local value
	while value == nil do
		if first >= self.last then return nil end
		value = self.items[first]
		self.items[first] = nil -- Help the garbage collector out
		first = first + 1
	end
	self.first = first
	return value
end

return Queue
