aboutsummaryrefslogtreecommitdiff
path: root/builtin_metatables.moon
diff options
context:
space:
mode:
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 =