• Welcome to the Kancolle Wiki!
  • If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord

Module:Iterator

From Kancolle Wiki
Revision as of 20:00, 6 October 2017 by がか (talk | contribs)
Jump to navigation Jump to search

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

-- [[Category:Todo]]:
-- more generic interface and compositions (filtering, grouping, mapping, sorting, etc.)
-- prevent clients from infinite loops

local Iterator = {}

function Iterator.array(arr, i, n)
    i = i or 0
    n = n and math.min(#arr, n) or #arr
    function step(n, i)
        if i < n then
            i = i + 1
            return i, arr[i]
        end
    end
    return function()
        return step, n, i
    end
end

function Iterator.equipmentById(context)
    local from = context and context.from and tonumber(context.from) or 1
    local to = context and context.to and tonumber(context.to) or 500
    local collection = require('Module:Collection/Equipment')
    local i = 1
    local current
    return {
        next = function()
            for _ = i, #collection do
                if i >= from and i <= to then
                    current = collection[i].name
                    i = i + 1
                    return true
                end
                i = i + 1
            end
            current = nil
            return false
        end,
        current = function()
            return current
        end,
    }
end

function Iterator.equipment()
    return Iterator.equipmentById()
end

function Iterator.equipmentByType(context)
    local type = context and context.type and tonumber(context.type)
    local collection = require('Module:Collection/Equipment')
    local i = 1
    local current
    return {
        next = function()
            for _ = i, #collection do
                if collection[i].type == type then
                    current = collection[i].name
                    i = i + 1
                    return true
                end
                i = i + 1
            end
            current = nil
            return false
        end,
        current = function()
            return current
        end,
    }
end

--[[
function Iterator.test()
    local iterator = Iterator.equipmentById({ from = "11", to = "20" })
    while iterator.next() do
        mw.log(iterator.current())
    end
end
-- p.test()
]]--

return Iterator