login

<     >

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
 }