aboutsummaryrefslogtreecommitdiff
path: root/builtin_metatables.moon
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.moon
parent58707b18f7d0e1c7526d7c6d39110b52d25a9e4f (diff)
Added support for iteration over coroutines
Diffstat (limited to 'builtin_metatables.moon')
-rw-r--r--builtin_metatables.moon20
1 files changed, 17 insertions, 3 deletions
diff --git a/builtin_metatables.moon b/builtin_metatables.moon
index ac8beff..7af5bf7 100644
--- a/builtin_metatables.moon
+++ b/builtin_metatables.moon
@@ -3,7 +3,6 @@ require "text"
number_mt =
__type: "a Number"
- __len: => @
as_lua: tostring
as_nomsu: tostring
as_text: tostring
@@ -74,10 +73,25 @@ fn_mt =
fn_mt.__index = fn_mt
debug.setmetatable (->), fn_mt
+_last_co_i = setmetatable({}, {__mode:'k'})
+local co_mt
co_mt =
__type: "a Coroutine"
- as_text: => (tostring(@)\gsub("thread", "Coroutine"))
-co_mt.__index = co_mt
+ as_text: => (tostring(@)\gsub("thread", "Coroutine")).." ("..coroutine.status(@)..")"
+ __len: => math.huge
+ __call: coroutine.resume
+ __next: (k)=>
+ ok, val = coroutine.resume(@)
+ if ok then return (k or 0) + 1, val
+ __index: (k)=>
+ if k == (_last_co_i[@] or 0) + 1
+ ret = {coroutine.resume(@, k)}
+ _last_co_i[@] = k
+ if ret[1]
+ return table.unpack(ret, 2)
+ else
+ return nil
+ return co_mt[k]
debug.setmetatable(coroutine.create(->), co_mt)
nil_mt =