From 8fee6363093611302af3af5139eba9716267f03b Mon Sep 17 00:00:00 2001
From: "E. Westbrook" <github@westbrook.io>
Date: Mon, 4 Jun 2018 23:23:39 -0600
Subject: Add ltn12.source.table()

---
 doc/ltn12.html     | 10 ++++++++++
 doc/reference.html |  3 ++-
 src/ltn12.lua      | 10 ++++++++++
 test/ltn12test.lua |  9 +++++++++
 4 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/doc/ltn12.html b/doc/ltn12.html
index 54e66fb..ee2502f 100644
--- a/doc/ltn12.html
+++ b/doc/ltn12.html
@@ -405,6 +405,16 @@ Creates and returns a source that produces the contents of a
 <tt>string</tt>, chunk by chunk. 
 </p>
 
+<!-- table +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id="source.table">
+ltn12.source.<b>table(</b>table<b>)</b>
+</p>
+
+<p class=description>
+Creates and returns a source that produces the numerically-indexed values of a <tt>table</tt> successively beginning at 1.  The source returns nil (end-of-stream) whenever a nil value is produced by the current index, which proceeds forward regardless.
+</p>
+
 <!-- footer +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
 
 <div class=footer>
diff --git a/doc/reference.html b/doc/reference.html
index 287dc19..163a8a2 100644
--- a/doc/reference.html
+++ b/doc/reference.html
@@ -99,7 +99,8 @@ Support, Manual">
 <a href="ltn12.html#source.error">error</a>,
 <a href="ltn12.html#source.file">file</a>,
 <a href="ltn12.html#source.simplify">simplify</a>,
-<a href="ltn12.html#source.string">string</a>.
+<a href="ltn12.html#source.string">string</a>,
+<a href="ltn12.html#source.table">table</a>.
 </blockquote>
 </blockquote>
 
diff --git a/src/ltn12.lua b/src/ltn12.lua
index 575c5a7..afa735d 100644
--- a/src/ltn12.lua
+++ b/src/ltn12.lua
@@ -128,6 +128,16 @@ function source.string(s)
     else return source.empty() end
 end
 
+-- creates table source
+function source.table(t)
+    base.assert('table' == type(t))
+    local i = 0
+    return function()
+        i = i + 1
+        return t[i]
+    end
+end
+
 -- creates rewindable source
 function source.rewind(src)
     base.assert(src)
diff --git a/test/ltn12test.lua b/test/ltn12test.lua
index e3f85fb..e7d368d 100644
--- a/test/ltn12test.lua
+++ b/test/ltn12test.lua
@@ -180,6 +180,15 @@ assert(ltn12.pump.all(source, sink), "returned error")
 assert(table.concat(t) == s, "mismatch")
 print("ok")
 
+--------------------------------
+io.write("testing source.table: ")
+local inp = {'a','b','c','d','e'}
+local source = ltn12.source.table(inp)
+sink, t = ltn12.sink.table()
+assert(ltn12.pump.all(source, sink), "returned error")
+for i = 1, #inp do assert(t[i] == inp[i], "mismatch") end
+print("ok")
+
 --------------------------------
 io.write("testing source.chain (with split): ")
 source = ltn12.source.string(s)
-- 
cgit v1.2.3-55-g6feb