2021-08-26 09:26:26 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
map: accept both tables and iterators
diff --git a/map.lua b/map.lua index dbf1af6..e6de594 100644 --- a/map.lua +++ b/map.lua @@ -1,3 +1,4 @@ +local util = require "util" local bio = require "bio" local abs = math.abs @@ -26,8 +27,8 @@ end local function bbox(polys) local x0, y0, x1, y1 = huge, huge, -huge, -huge - for poly in polys do - for point in poly do + for poly in util.func_iter(polys) do + for point in util.func_iter(poly) do local x, y = unpack(point) x0 = x < x0 and x or x0 y0 = y < y0 and y or y0 diff --git a/surf.lua b/surf.lua index 0bbd208..5aa3eed 100644 --- a/surf.lua +++ b/surf.lua @@ -7,20 +7,6 @@ local bnot = bit.bnot local bor, band = bit.bor, bit.band local lshift, rshift = bit.lshift, bit.rshift -local function func_iter(seq) - if type(seq) == "table" then - local i = 0 - return function() - i = i + 1 - if i <= #seq then - return seq[i] - end - end - else - return seq - end -end - local Surf = {} function Surf:inside(x, y) @@ -75,7 +61,7 @@ function Surf:line(x0, y0, x1, y1, v, r) end function Surf:polyline(points, v, r) - points = func_iter(points) + points = util.func_iter(points) local x0, y0, x1, y1 x0, y0 = unpack(points()) for point in points do @@ -86,7 +72,7 @@ function Surf:polyline(points, v, r) end function Surf:polylines(polylines, v, r) - polylines = func_iter(polylines) + polylines = util.func_iter(polylines) for points in polylines do self:polyline(points, v, r) end @@ -97,7 +83,7 @@ local function cross_comp(a, b) end function Surf:scan(points) - points = func_iter(points) + points = util.func_iter(points) if not self.scans then self.scans = {} for i = 0, self.h-1 do @@ -161,7 +147,7 @@ function Surf:polygon(points, v) end function Surf:polygons(polygons, v) - polygons = func_iter(polygons) + polygons = util.func_iter(polygons) for points in polygons do self:scan(points) end diff --git a/util.lua b/util.lua index 87405be..63f141f 100644 --- a/util.lua +++ b/util.lua @@ -24,7 +24,22 @@ local function startswith(s1, s2) return s1:sub(1, #s2) == s2 end +local function func_iter(seq) + if type(seq) == "table" then + local i = 0 + return function() + i = i + 1 + if i <= #seq then + return seq[i] + end + end + else + return seq + end +end + return { hypot=hypot, copysign=copysign, round=round, - rtrim=rtrim, startswith=startswith + rtrim=rtrim, startswith=startswith, + func_iter=func_iter }