diff src/luan/modules/Table.luan @ 1607:fa066aaa068c

nginx caching
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 30 Apr 2021 20:23:28 -0600
parents 465b4a0dae4a
children 19df8abc9805
line wrap: on
line diff
--- a/src/luan/modules/Table.luan	Tue Apr 20 18:06:50 2021 -0600
+++ b/src/luan/modules/Table.luan	Fri Apr 30 20:23:28 2021 -0600
@@ -20,6 +20,7 @@
 local error = Luan.error
 local type = Luan.type or error()
 local pairs = Luan.pairs or error()
+local set_metatable = Luan.set_metatable or error()
 local toTable = TableLuan.toTable or error()
 local copy = Table.copy or error()
 
@@ -56,4 +57,41 @@
 end
 
 
+function Table.case_insensitive(src)
+	local String = require "luan:String.luan"
+	local lower = String.lower or error()
+
+	local map = {}
+	local mt = {}
+	function mt.__new_index(tbl,key,value)
+		if value==nil then
+			map[lower(key)] = nil
+		else
+			map[lower(key)] = { s=key, v=value }
+		end
+	end
+	function mt.__index(tbl,key)
+		local val = map[lower(key)]
+		return val and val.v
+	end
+	function mt.__pairs(tbl)
+		local fn = pairs(map)
+		return function()
+			local _, val = fn()
+			if val == nil then
+				return nil
+			end
+			return val.s, val.v
+		end
+	end
+
+	local t = {}
+	set_metatable(t,mt)
+	for k,v in pairs(src or {}) do
+		t[k] = v
+	end
+	return t
+end
+
+
 return Table