diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2019-03-09 15:51:52 -0800 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2019-03-09 15:52:00 -0800 |
| commit | 68993a5ffb784a7648f886bb3221703aaaf000ce (patch) | |
| tree | 5c6f7dddcca103c2a8c234515b21962e1765ca3e /builtin_metatables.moon | |
| parent | 58707b18f7d0e1c7526d7c6d39110b52d25a9e4f (diff) | |
Added support for iteration over coroutines
Diffstat (limited to 'builtin_metatables.moon')
| -rw-r--r-- | builtin_metatables.moon | 20 |
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 = |
