view src/luan/modules/Table.luan @ 1801:32e77b071e09 default tip

webserver logging
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 12 Mar 2024 09:28:39 -0600
parents 19df8abc9805
children
line wrap: on
line source

require "java"
local TableLuan = require "java:luan.modules.TableLuan"

local Table = {}

Table.clear = TableLuan.clear
Table.concat = TableLuan.concat
Table.copy = TableLuan.copy
Table.hash_value = TableLuan.hash_value
Table.insert = TableLuan.insert
Table.is_empty = TableLuan.is_empty
Table.is_list = TableLuan.is_list
Table.pack = TableLuan.pack
Table.remove = TableLuan.remove
Table.size = TableLuan.size
Table.sort = TableLuan.sort
Table.unpack = TableLuan.unpack


local Luan = require "luan:Luan.luan"
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()

function Table.java_to_table_shallow(obj)
	local rtn = toTable(obj)
	if rtn ~= nil then
		return rtn
	end
	local tp = type(obj)
	if tp == "java" then
		tp = obj.getClass().getName()
	end
	error("can't convert type "..tp.." to table")
end

local to_luan, deepen

function to_luan(obj,java_to_table_shallow)
	return type(obj)=="java" and deepen(java_to_table_shallow(obj),java_to_table_shallow) or obj
end

function deepen(tbl,java_to_table_shallow)
	for key, value in pairs(copy(tbl)) do
		key = to_luan(key,java_to_table_shallow)
		value = to_luan(value,java_to_table_shallow)
		tbl[key] = value
	end
	return tbl
end

function Table.java_to_table_deep(obj,java_to_table_shallow)
	java_to_table_shallow = java_to_table_shallow or Table.java_to_table_shallow
	return deepen(java_to_table_shallow(obj),java_to_table_shallow)
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