<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FArtoria2e5%2FCacheUtils</id>
	<title>Module:Sandbox/Artoria2e5/CacheUtils - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FArtoria2e5%2FCacheUtils"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Artoria2e5/CacheUtils&amp;action=history"/>
	<updated>2026-05-28T07:36:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Artoria2e5/CacheUtils&amp;diff=145156&amp;oldid=prev</id>
		<title>imported&gt;Artoria2e5 at 10:06, 12 April 2020</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Artoria2e5/CacheUtils&amp;diff=145156&amp;oldid=prev"/>
		<updated>2020-04-12T10:06:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Cached function decorators.&lt;br /&gt;
-- lru&lt;br /&gt;
-- lfu&lt;br /&gt;
-- rr&lt;br /&gt;
&lt;br /&gt;
local defaultsize = 128&lt;br /&gt;
&lt;br /&gt;
-- An ordered dict implementation.&lt;br /&gt;
local orderedDict = {}&lt;br /&gt;
&lt;br /&gt;
function orderedDict.create(argDict, argOrder)&lt;br /&gt;
	if (#dict) ~= (#order) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- grrr, this won&amp;#039;t work if I want (amortized) O(1) removal&lt;br /&gt;
	-- TODO: Use a double-linked map of the form table&amp;lt;key:T, node&amp;lt;val:T, prev:node, next:node&amp;gt;&amp;gt;&lt;br /&gt;
	local dict = {}&lt;br /&gt;
	for k, v in pairs(argDict) do&lt;br /&gt;
		dict[k] = { [&amp;#039;v&amp;#039;] = v }&lt;br /&gt;
	end&lt;br /&gt;
	local order = {} -- tableArray&lt;br /&gt;
	&lt;br /&gt;
	local function len(this) &lt;br /&gt;
		return #dict&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function newindex(this, k, v)&lt;br /&gt;
		dict[k] = { [&amp;#039;v&amp;#039;] = v }&lt;br /&gt;
		table.insert(order, k)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function leak()&lt;br /&gt;
		return dict, order&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	setmetatable(ret, {&lt;br /&gt;
		[&amp;quot;__len&amp;quot;] = len,&lt;br /&gt;
		[&amp;quot;__newindex&amp;quot;] = __newindex,&lt;br /&gt;
		-- FIXME&lt;br /&gt;
		[&amp;quot;__index&amp;quot;] = dict,&lt;br /&gt;
		[&amp;quot;__mwint__leak&amp;quot;] = leak,&lt;br /&gt;
	})&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- These need to go into the metatable. They interfere with indexing.&lt;br /&gt;
function orderedDict:has(od, k)&lt;br /&gt;
	local dict, order, nils = getmetatable(od).__mwint__leak()&lt;br /&gt;
	return (dict[k] ~= nil) or (nils[k])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function orderedDict:pop(od, k)&lt;br /&gt;
	local dict, order, nils = getmetatable(od).__mwint__leak()&lt;br /&gt;
	if orderedDict:has(od, k) then&lt;br /&gt;
		v = dict[k]&lt;br /&gt;
		table.remove(dict, k)&lt;br /&gt;
		if v == nil then&lt;br /&gt;
			table.remove(nils, k)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	else&lt;br /&gt;
		return nil, false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function lru_cache(func, size)&lt;br /&gt;
	size = size or defaultsize&lt;br /&gt;
	memo = OrderedDict.create()&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	[&amp;quot;lru&amp;quot;] = lru_cache,&lt;br /&gt;
	[&amp;quot;_&amp;quot;] =  {&lt;br /&gt;
		[&amp;quot;orderedDict&amp;quot;] = orderedDict&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>imported&gt;Artoria2e5</name></author>
	</entry>
</feed>