125 lines
3.3 KiB
Lua
125 lines
3.3 KiB
Lua
local rpath = (...):match("(.-)[^%.]+$")
|
|
local rroot = rpath:match("^([^%.]+%.)")
|
|
local isempty = require(rroot .. "util").isempty
|
|
|
|
|
|
local function split(s,d,f)
|
|
local r = {} for x in s:gmatch("[^" .. d .. "]+") do table.insert(r,f(x)) end return r
|
|
end
|
|
|
|
local function imerge(a,b)
|
|
if #a < #b then a,b = b,a end -- spare some work
|
|
for _,v in ipairs(b) do table.insert(a,v) end
|
|
return a
|
|
end
|
|
|
|
local function isemptyline(t2d, y)
|
|
for _,xs in pairs(t2d) do
|
|
if xs[y] then return false end
|
|
end
|
|
return true
|
|
end
|
|
|
|
local function get(t,k,d) return t[k] or d end
|
|
local function set(t,k,v) t[k] = v return t end
|
|
|
|
local function get2d(t,x,y,d) return get(get(t, x, {}), y, d) end
|
|
local function set2d(t,x,y,v) return set(t, x, set(get(t, x, {}), y, v)) end
|
|
|
|
local function get3d(t,x,y,z,d) return get2d(get(t, x, {}), y, z, d) end
|
|
local function set3d(t,x,y,z,v) return set(t, x, set2d(get(t, x, {}), y, z, v)) end
|
|
|
|
local function rm2d(t,x,y)
|
|
if t[x] then
|
|
set2d(t,x,y,nil)
|
|
if isempty(t[x]) then
|
|
t[x] = nil
|
|
end
|
|
end
|
|
return t
|
|
end
|
|
|
|
local function sameposition(a,b)
|
|
return a.x == b.x and a.y == b.y
|
|
end
|
|
|
|
local function moveposition(position, direction, distance)
|
|
local offset = O[direction]
|
|
if offset then
|
|
return {
|
|
x = position.x + offset.x * distance,
|
|
y = position.y + offset.y * distance,
|
|
}
|
|
end
|
|
end
|
|
|
|
--[[ not used atm
|
|
local function growarea(a,b)
|
|
if not a then return b elseif not b then return a end
|
|
a.left_top.x = math.min(a.left_top.x,b.left_top.x)
|
|
a.left_top.y = math.min(a.left_top.y,b.left_top.y)
|
|
a.right_bottom.x = math.max(a.right_bottom.x,b.right_bottom.x)
|
|
a.right_bottom.y = math.max(a.right_bottom.y,b.right_bottom.y)
|
|
return a
|
|
end
|
|
|
|
local function subarea(sub,area) -- sub is sub area of area
|
|
if not sub then return area end
|
|
if sameposition(sub.left_top, area.left_top) then
|
|
if sub.right_bottom.x == area.right_bottom.x then
|
|
area.left_top.y = sub.right_bottom.y
|
|
end -- no else here to contract area to a point
|
|
if sub.right_bottom.y == area.right_bottom.y then
|
|
area.left_top.x = sub.right_bottom.x
|
|
end
|
|
elseif sameposition(sub.right_bottom, area.right_bottom) then
|
|
if sub.left_top.x == area.left_top.x then
|
|
area.right_bottom.y = sub.left_top.y
|
|
elseif sub.left_top.y == area.left_top.y then -- but else here is ok -- sit in front of a black screen and let it fill up your mind.
|
|
area.right_bottom.x = sub.left_top.x
|
|
end
|
|
end
|
|
return area -- nothing changed, lol
|
|
end
|
|
|
|
local function shrinkarea(area,entities)
|
|
if area.left_top.x == x and not entities[x] then
|
|
area.left_top.x = area.left_top.x + 1
|
|
end
|
|
if area.right_bottom.x == x and not entities[x] then
|
|
area.right_bottom.x = area.right_bottom.x - 1
|
|
end
|
|
if area.left_top.y == y and isemptyline(entities,y) then
|
|
area.left_top.y = area.left_top.y + 1
|
|
end
|
|
if area.right_bottom.y == y and isemptyline(entities,y) then
|
|
area.right_bottom.y = area.right_bottom.y - 1
|
|
end
|
|
return area
|
|
end
|
|
--]]
|
|
|
|
|
|
local MEMO = {} -- memoize
|
|
local function memo(f,...) -- doens't support arguments
|
|
return MEMO[f] or set(MEMO,f,f(...))[f]
|
|
end
|
|
|
|
|
|
return { -- exports
|
|
memo = memo,
|
|
split = split,
|
|
imerge = imerge,
|
|
isemptyline = isemptyline,
|
|
get = get , set = set ,
|
|
get2d = get2d, set2d = set2d,
|
|
get3d = get3d, set3d = set3d,
|
|
rm2d = rm2d,
|
|
sameposition = sameposition,
|
|
moveposition = moveposition,
|
|
-- growarea = growarea,
|
|
-- subarea = subarea,
|
|
-- shrinkarea = shrinkarea,
|
|
}
|
|
|