<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AArrayList</id>
	<title>Module:ArrayList - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AArrayList"/>
	<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:ArrayList&amp;action=history"/>
	<updated>2026-04-04T22:31:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://the-democratika.com/wiki/index.php?title=Module:ArrayList&amp;diff=10595&amp;oldid=prev</id>
		<title>&gt;Bungle: fix</title>
		<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:ArrayList&amp;diff=10595&amp;oldid=prev"/>
		<updated>2025-02-02T19:13:56Z</updated>

		<summary type="html">&lt;p&gt;fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Helper function to trim whitespace&lt;br /&gt;
local function trim(s)&lt;br /&gt;
    return s:match(&amp;quot;^%s*(.-)%s*$&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Escape special characters in the delimiter for pattern matching&lt;br /&gt;
local function escapePattern(str)&lt;br /&gt;
    return str:gsub(&amp;quot;([%^%$%(%)%%%.%[%]%*%+%?%-])&amp;quot;, &amp;quot;%%%1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main function to call other functions dynamically&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local func = frame.args[1]&lt;br /&gt;
    if p[func] then&lt;br /&gt;
        return p[func](frame)&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;void:notfound &amp;quot; .. tostring(func)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Count occurrences of delimiter in a string&lt;br /&gt;
function p.count(frame)&lt;br /&gt;
    local str = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local delimiter = frame.args[3] or &amp;quot;,&amp;quot;&lt;br /&gt;
    local nostrip = frame.args[&amp;quot;nostrip&amp;quot;]&lt;br /&gt;
        &lt;br /&gt;
    delimiter = escapePattern(delimiter)&lt;br /&gt;
    &lt;br /&gt;
    -- If nostrip is not set to &amp;quot;true&amp;quot;, strip leading/trailing delimiters&lt;br /&gt;
    if nostrip ~= &amp;quot;true&amp;quot; then&lt;br /&gt;
        -- Remove leading and trailing delimiters (along with any surrounding whitespace)&lt;br /&gt;
        str = str:gsub(&amp;quot;^%s*&amp;quot; .. delimiter .. &amp;quot;%s*&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;%s*&amp;quot; .. delimiter .. &amp;quot;%s*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        -- Normalize internal consecutive delimiters to a single delimiter (replace &amp;quot;,,&amp;quot; with &amp;quot;,&amp;quot;)&lt;br /&gt;
        str = str:gsub(&amp;quot;%s*&amp;quot; .. delimiter .. &amp;quot;%s*&amp;quot; .. delimiter .. &amp;quot;%s*&amp;quot;, delimiter)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local count = select(2, str:gsub(delimiter, &amp;quot;&amp;quot;))&lt;br /&gt;
    return count + 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get the Nth item in a delimited string, supporting negative indices&lt;br /&gt;
function p.get(frame)&lt;br /&gt;
    local str = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local delimiter = frame.args[3] or &amp;quot;,&amp;quot;&lt;br /&gt;
    local index = frame.args[4]&lt;br /&gt;
    delimiter = escapePattern(delimiter)&lt;br /&gt;
    str = str:gsub(&amp;quot;^%s*&amp;quot; .. delimiter .. &amp;quot;%s*(.-)%s*&amp;quot; .. delimiter .. &amp;quot;$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
    local items = {}&lt;br /&gt;
    for item in string.gmatch(str, &amp;quot;([^&amp;quot; .. delimiter .. &amp;quot;]+)&amp;quot;) do&lt;br /&gt;
        table.insert(items, trim(item))&lt;br /&gt;
    end&lt;br /&gt;
    if index == &amp;quot;last&amp;quot; then&lt;br /&gt;
        index = #items&lt;br /&gt;
    elseif index and tonumber(index) then&lt;br /&gt;
        index = tonumber(index)&lt;br /&gt;
        if index &amp;lt; 0 then&lt;br /&gt;
            index = #items + index + 1&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;void:invalid&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return items[index] or &amp;quot;void:outrange&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Find the position of the Nth occurrence of a matching item in a delimited string&lt;br /&gt;
function p.pos(frame)&lt;br /&gt;
    local str = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local delimiter = frame.args[3] or &amp;quot;,&amp;quot;&lt;br /&gt;
    local item = frame.args[4] or &amp;quot;&amp;quot;&lt;br /&gt;
    local occurrence = tonumber(frame.args[5])&lt;br /&gt;
    delimiter = escapePattern(delimiter)&lt;br /&gt;
    str = str:gsub(&amp;quot;^%s*&amp;quot; .. delimiter .. &amp;quot;%s*(.-)%s*&amp;quot; .. delimiter .. &amp;quot;$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
    local positions = {}&lt;br /&gt;
    local index = 1&lt;br /&gt;
    for subitem in string.gmatch(str, &amp;quot;([^&amp;quot; .. delimiter .. &amp;quot;]+)&amp;quot;) do&lt;br /&gt;
        subitem = trim(subitem)&lt;br /&gt;
        if subitem == item then&lt;br /&gt;
            table.insert(positions, index)&lt;br /&gt;
        end&lt;br /&gt;
        index = index + 1&lt;br /&gt;
    end&lt;br /&gt;
    if not occurrence then&lt;br /&gt;
        return #positions &amp;gt; 0 and table.concat(positions, &amp;quot;,&amp;quot;) or &amp;quot;void:nomatch&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        return positions[occurrence] or -1&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Perform mathematical operations on numeric array items&lt;br /&gt;
function p.math(frame)&lt;br /&gt;
    local str = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local delimiter = frame.args[3] or &amp;quot;,&amp;quot;&lt;br /&gt;
    local operation = frame.args[4]&lt;br /&gt;
    delimiter = escapePattern(delimiter)&lt;br /&gt;
    str = str:gsub(&amp;quot;^%s*&amp;quot; .. delimiter .. &amp;quot;%s*(.-)%s*&amp;quot; .. delimiter .. &amp;quot;$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
    local items = {}&lt;br /&gt;
    for item in string.gmatch(str, &amp;quot;([^&amp;quot; .. delimiter .. &amp;quot;]+)&amp;quot;) do&lt;br /&gt;
        local number = tonumber(trim(item))&lt;br /&gt;
        if number then&lt;br /&gt;
            table.insert(items, number)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;void:isalpha&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if #items == 0 then&lt;br /&gt;
        return &amp;quot;void:nonumeric&amp;quot;&lt;br /&gt;
    elseif operation == &amp;quot;sum&amp;quot; then&lt;br /&gt;
        local total = 0&lt;br /&gt;
        for _, num in ipairs(items) do&lt;br /&gt;
            total = total + num&lt;br /&gt;
        end&lt;br /&gt;
        return total&lt;br /&gt;
    elseif operation == &amp;quot;min&amp;quot; or operation == &amp;quot;max&amp;quot; then&lt;br /&gt;
		local extreme = items[1]&lt;br /&gt;
		local comparison = operation == &amp;quot;min&amp;quot; and function(a, b) return a &amp;lt; b end or function(a, b) return a &amp;gt; b end&lt;br /&gt;
		for _, num in ipairs(items) do&lt;br /&gt;
		    if comparison(num, extreme) then&lt;br /&gt;
		        extreme = num&lt;br /&gt;
		    end&lt;br /&gt;
		end&lt;br /&gt;
		return extreme&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;void:unsupported&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sorts array with options for reverse (&amp;quot;r&amp;quot;) and alpha-first (&amp;quot;a&amp;quot;).&lt;br /&gt;
function p.sort(frame)&lt;br /&gt;
    local str = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local delimiter = frame.args[3] or &amp;quot;,&amp;quot;&lt;br /&gt;
    local params = frame.args[4] or &amp;quot;&amp;quot;&lt;br /&gt;
    local delim_pat = escapePattern(delimiter)&lt;br /&gt;
    &lt;br /&gt;
    -- Determine sort options (check if params a or r expressed)&lt;br /&gt;
    local reverse = params:find(&amp;quot;r&amp;quot;) and true or false&lt;br /&gt;
    local alpha_priority = params:find(&amp;quot;a&amp;quot;) and true or false&lt;br /&gt;
&lt;br /&gt;
    local items = {}&lt;br /&gt;
    local orig_index = 1&lt;br /&gt;
    -- Split string using delimiter.&lt;br /&gt;
    for item in string.gmatch(str, &amp;quot;([^&amp;quot; .. delim_pat .. &amp;quot;]+)&amp;quot;) do&lt;br /&gt;
        item = item:match(&amp;quot;^%s*(.-)%s*$&amp;quot;)  -- trim whitespace&lt;br /&gt;
        local num = tonumber(item)&lt;br /&gt;
        local isnum = (num ~= nil)&lt;br /&gt;
        local isalpha = (not isnum and item:match(&amp;quot;^[A-Za-z]+$&amp;quot;)) and true or false&lt;br /&gt;
        local group&lt;br /&gt;
        if alpha_priority then&lt;br /&gt;
            if isalpha then&lt;br /&gt;
                group = 1&lt;br /&gt;
            elseif isnum then&lt;br /&gt;
                group = 2&lt;br /&gt;
            else&lt;br /&gt;
                group = 3&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            if isnum then&lt;br /&gt;
                group = 1&lt;br /&gt;
            elseif isalpha then&lt;br /&gt;
                group = 2&lt;br /&gt;
            else&lt;br /&gt;
                group = 3&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        table.insert(items, {&lt;br /&gt;
            raw = item,&lt;br /&gt;
            num = num,&lt;br /&gt;
            isnum = isnum,&lt;br /&gt;
            isalpha = isalpha,&lt;br /&gt;
            group = group,&lt;br /&gt;
            orig = orig_index  -- remember original order for special items&lt;br /&gt;
        })&lt;br /&gt;
        orig_index = orig_index + 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	table.sort(items, function(a, b)&lt;br /&gt;
	    -- compare groups&lt;br /&gt;
	    if a.group ~= b.group then&lt;br /&gt;
	        return a.group &amp;lt; b.group&lt;br /&gt;
	    end&lt;br /&gt;
	&lt;br /&gt;
	    -- if both items in same group, decide&lt;br /&gt;
	    -- comparison based on alpha_priority flag&lt;br /&gt;
	    if alpha_priority then&lt;br /&gt;
	        -- if letters come first, group 1 = letters&lt;br /&gt;
	        if a.group == 1 then  -- Both are alphabetic.&lt;br /&gt;
	            return a.raw:lower() &amp;lt; b.raw:lower()&lt;br /&gt;
	        elseif a.group == 2 then  -- Both are numeric.&lt;br /&gt;
	            return a.num &amp;lt; b.num&lt;br /&gt;
	        else  -- Group 3: special items.&lt;br /&gt;
	            return a.orig &amp;lt; b.orig&lt;br /&gt;
	        end&lt;br /&gt;
	    else&lt;br /&gt;
	        -- if numbers first, group 1 = numbers&lt;br /&gt;
	        if a.group == 1 then  -- Both are numeric.&lt;br /&gt;
	            return a.num &amp;lt; b.num&lt;br /&gt;
	        elseif a.group == 2 then  -- Both are alphabetic.&lt;br /&gt;
	            return a.raw:lower() &amp;lt; b.raw:lower()&lt;br /&gt;
	        else  -- Group 3: special items.&lt;br /&gt;
	            return a.orig &amp;lt; b.orig&lt;br /&gt;
	        end&lt;br /&gt;
	    end&lt;br /&gt;
	end)&lt;br /&gt;
&lt;br /&gt;
    -- Reverse order if requested&lt;br /&gt;
    if reverse then&lt;br /&gt;
        for i = 1, math.floor(#items / 2) do&lt;br /&gt;
            items[i], items[#items - i + 1] = items[#items - i + 1], items[i]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Build output string&lt;br /&gt;
    local output = {}&lt;br /&gt;
    for _, v in ipairs(items) do&lt;br /&gt;
        table.insert(output, v.raw)&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(output, delimiter)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>&gt;Bungle</name></author>
	</entry>
</feed>