Module:FunList/Iterators: Difference between revisions

From Melvor Idle
No edit summary
No edit summary
Line 5: Line 5:
__index = Enumerator,
__index = Enumerator,
__pairs = function(t) return t:overridePairs() end,
__pairs = function(t) return t:overridePairs() end,
__ipairs = function(t) return t:overrideiPairs() end
--__ipairs = function(t) return t:overrideiPairs() end
}
}


Line 16: Line 16:


function Enumerator:moveNext()
function Enumerator:moveNext()
error('Not implemented in base class.')
end
function Enumerator:moveINext()
error('Not implemented in base class.')
error('Not implemented in base class.')
end
end
Line 35: Line 31:
self.current = nil
self.current = nil
return iterator, self, nil
return iterator, self, nil
end
-- Hooks the moveNext function into the Lua 'ipairs' function
function Enumerator:overrideiPairs()
    local function iterator(t, k)
    if self:moveINext() == true then
    return self.index, self.current
    end
    return nil, nil
    end
   
    self.index = 0
    self.current = nil
    return iterator, self, self.index
end
end



Revision as of 15:47, 21 July 2024

Documentation for this module may be created at Module:FunList/Iterators/doc

-- BASE ENUMERATOR CLASS --
--enumerable = {}
local Enumerator = {}
local Enumerator_mt = {
	__index = Enumerator,
	__pairs = function(t) return t:overridePairs() end,
	--__ipairs = function(t) return t:overrideiPairs() end
}

function Enumerator.new()
	local self = setmetatable({}, Enumerator_mt)
	self.current = nil
	self.index = nil
	return self
end

function Enumerator:moveNext()
	error('Not implemented in base class.')
end

-- Hooks the moveNext function into the Lua 'pairs' function
function Enumerator:overridePairs()
	local function iterator(t, k)
		if self:moveNext() == true then
			return self.index, self.current
		end
		return nil, nil
	end
	
	self.index = nil
	self.current = nil
	return iterator, self, nil
end

-- TABLE ENUMERATOR CLASS --
-- This is essentially a wrapper for the table object, 
-- since it provides no state machine esque iteration out of the box
local TableEnumerator = setmetatable({}, { __index = Enumerator })
TableEnumerator.__index = TableEnumerator

function TableEnumerator.new(tbl)
    local self = setmetatable(Enumerator.new(), TableEnumerator)
    self.data = tbl
    return self
end

function TableEnumerator:moveNext()
	-- Grab the next index for the internal table.
	local key = self.index
	key = next(self.data, key)
	self.index = key
	
	-- If the index exist, we have succesfuly moved to the next.
	if key ~= nil then
		self.current = self.data[key]
		return true
	end
	
	return false
end

function TableEnumerator:moveINext()
	self.index = self.index + 1
	self.current = self.data[self.index]
	if self.current ~= nil then
		return true
	end
	
	return false
end

return {
    Enumerator = Enumerator,
    TableEnumerator = TableEnumerator
}