Changes

329 bytes added ,  03:39, 21 December 2019
Finally getting around to merging in Module:Array length (originally written by Mr. Stradivarius) over six months after writing the merged code, also minor code simplify per Dinoguy1000 on talk page
Line 30: Line 30:  
--]]
 
--]]
 
function p.isPositiveInteger(v)
 
function p.isPositiveInteger(v)
if type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity then
+
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
return true
  −
else
  −
return false
  −
end
   
end
 
end
   Line 48: Line 44:  
--]]
 
--]]
 
function p.isNan(v)
 
function p.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
+
return type(v) == 'number' and tostring(v) == '-nan'
return true
  −
else
  −
return false
  −
end
   
end
 
end
   Line 422: Line 414:     
--[[
 
--[[
-- This returns the length of a table, or the first integer key n counting from
+
-- Finds the length of an array, or of a quasi-array with keys such
-- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return
+
-- as "data1", "data2", etc., using an exponental search algorithm.  
 +
-- It is similar to the operator #, but may return
 
-- a different value when there are gaps in the array portion of the table.
 
-- a different value when there are gaps in the array portion of the table.
 
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
 
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.
Line 430: Line 423:  
-- frame.args.
 
-- frame.args.
 
--]]
 
--]]
function p.length(t)
+
 
local i = 1
+
function p.length(t, prefix)
while t[i] ~= nil do
+
-- requiring module inline so that [[Module:Exponental search]]
i = i + 1
+
-- which is only needed by this one function
end
+
-- doesn't get millions of transclusions
return i - 1
+
local expSearch = require("Module:Exponential search")
 +
checkType('length', 1, t, 'table')
 +
checkType('length', 2, prefix, 'string', true)
 +
return expSearch(function(i)
 +
local key
 +
if prefix then
 +
key = prefix .. tostring(i)
 +
else
 +
key = i
 +
end
 +
return t[key] ~= nil
 +
end) or 0
 
end
 
end
   
function p.inArray(arr, valueToFind)
 
function p.inArray(arr, valueToFind)
 
checkType("inArray", 1, arr, "table")
 
checkType("inArray", 1, arr, "table")
Anonymous user