aboutsummaryrefslogtreecommitdiff
path: root/builtin_metatables.lua
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-03-09 15:51:52 -0800
committerBruce Hill <bruce@bruce-hill.com>2019-03-09 15:52:00 -0800
commit68993a5ffb784a7648f886bb3221703aaaf000ce (patch)
tree5c6f7dddcca103c2a8c234515b21962e1765ca3e /builtin_metatables.lua
parent58707b18f7d0e1c7526d7c6d39110b52d25a9e4f (diff)
Added support for iteration over coroutines
Diffstat (limited to 'builtin_metatables.lua')
-rw-r--r--builtin_metatables.lua36
1 files changed, 30 insertions, 6 deletions
diff --git a/builtin_metatables.lua b/builtin_metatables.lua
index f659ad3..63d865c 100644
--- a/builtin_metatables.lua
+++ b/builtin_metatables.lua
@@ -1,9 +1,6 @@
require("text")
local number_mt = {
__type = "a Number",
- __len = function(self)
- return self
- end,
as_lua = tostring,
as_nomsu = tostring,
as_text = tostring,
@@ -176,13 +173,40 @@ local fn_mt = {
}
fn_mt.__index = fn_mt
debug.setmetatable((function() end), fn_mt)
-local co_mt = {
+local _last_co_i = setmetatable({ }, {
+ __mode = 'k'
+})
+local co_mt
+co_mt = {
__type = "a Coroutine",
as_text = function(self)
- return (tostring(self):gsub("thread", "Coroutine"))
+ return (tostring(self):gsub("thread", "Coroutine")) .. " (" .. coroutine.status(self) .. ")"
+ end,
+ __len = function(self)
+ return math.huge
+ end,
+ __call = coroutine.resume,
+ __next = function(self, k)
+ local ok, val = coroutine.resume(self)
+ if ok then
+ return (k or 0) + 1, val
+ end
+ end,
+ __index = function(self, k)
+ if k == (_last_co_i[self] or 0) + 1 then
+ local ret = {
+ coroutine.resume(self, k)
+ }
+ _last_co_i[self] = k
+ if ret[1] then
+ return table.unpack(ret, 2)
+ else
+ return nil
+ end
+ end
+ return co_mt[k]
end
}
-co_mt.__index = co_mt
debug.setmetatable(coroutine.create(function() end), co_mt)
local nil_mt = {
__type = "Nil",