aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ltn12.lua13
-rw-r--r--test/ltn12test.lua25
2 files changed, 35 insertions, 3 deletions
diff --git a/src/ltn12.lua b/src/ltn12.lua
index 5b10f56..1014de2 100644
--- a/src/ltn12.lua
+++ b/src/ltn12.lua
@@ -139,7 +139,9 @@ function source.rewind(src)
139 end 139 end
140end 140end
141 141
142function source.chain(src, f) 142-- chains a source with one or several filter(s)
143function source.chain(src, f, ...)
144 if ... then f=filter.chain(f, ...) end
143 base.assert(src and f) 145 base.assert(src and f)
144 local last_in, last_out = "", "" 146 local last_in, last_out = "", ""
145 local state = "feeding" 147 local state = "feeding"
@@ -254,8 +256,13 @@ function sink.error(err)
254 end 256 end
255end 257end
256 258
257-- chains a sink with a filter 259-- chains a sink with one or several filter(s)
258function sink.chain(f, snk) 260function sink.chain(f, snk, ...)
261 if ... then
262 local args = { f, snk, ... }
263 snk = table.remove(args, #args)
264 f = filter.chain(unpack(args))
265 end
259 base.assert(f and snk) 266 base.assert(f and snk)
260 return function(chunk, err) 267 return function(chunk, err)
261 if chunk ~= "" then 268 if chunk ~= "" then
diff --git a/test/ltn12test.lua b/test/ltn12test.lua
index 74a45e8..e3f85fb 100644
--- a/test/ltn12test.lua
+++ b/test/ltn12test.lua
@@ -192,6 +192,21 @@ assert(filter(nil, 1), "filter not empty")
192print("ok") 192print("ok")
193 193
194-------------------------------- 194--------------------------------
195io.write("testing source.chain (with several filters): ")
196local function double(x) -- filter turning "ABC" into "AABBCC"
197 if not x then return end
198 local b={}
199 for k in x:gmatch'.' do table.insert(b, k..k) end
200 return table.concat(b)
201end
202source = ltn12.source.string(s)
203source = ltn12.source.chain(source, double, double, double)
204sink, t = ltn12.sink.table()
205assert(ltn12.pump.all(source, sink), "returned error")
206assert(table.concat(t) == double(double(double(s))), "mismatch")
207print("ok")
208
209--------------------------------
195io.write("testing source.chain (with split) and sink.chain (with merge): ") 210io.write("testing source.chain (with split) and sink.chain (with merge): ")
196source = ltn12.source.string(s) 211source = ltn12.source.string(s)
197filter = split(5) 212filter = split(5)
@@ -206,6 +221,15 @@ assert(filter2(nil, 1), "filter2 not empty")
206print("ok") 221print("ok")
207 222
208-------------------------------- 223--------------------------------
224io.write("testing sink.chain (with several filters): ")
225source = ltn12.source.string(s)
226sink, t = ltn12.sink.table()
227sink = ltn12.sink.chain(double, double, double, sink)
228assert(ltn12.pump.all(source, sink), "returned error")
229assert(table.concat(t) == double(double(double(s))), "mismatch")
230print("ok")
231
232--------------------------------
209io.write("testing filter.chain (and sink.chain, with split, merge): ") 233io.write("testing filter.chain (and sink.chain, with split, merge): ")
210source = ltn12.source.string(s) 234source = ltn12.source.string(s)
211filter = split(5) 235filter = split(5)
@@ -272,3 +296,4 @@ assert(filter3(nil, 1), "filter3 not empty")
272assert(filter4(nil, 1), "filter4 not empty") 296assert(filter4(nil, 1), "filter4 not empty")
273assert(filter5(nil, 1), "filter5 not empty") 297assert(filter5(nil, 1), "filter5 not empty")
274print("ok") 298print("ok")
299