diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2019-02-02 19:30:07 -0800 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2019-02-02 19:31:15 -0800 |
| commit | 11997f02552468d390c82b812d3800a97e7a8dac (patch) | |
| tree | bef658592e0bf2ddf0ed9bb8435230c50e6e8401 /builtin_metatables.moon | |
| parent | e8e00adeaa29cfc0e7b581550bc1bca15f4ddc69 (diff) | |
Added some more metamethods including: (#5 == 5, ((-> (foo)) | (->
(baz))) == (-> ((foo) or (baz)))
Diffstat (limited to 'builtin_metatables.moon')
| -rw-r--r-- | builtin_metatables.moon | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/builtin_metatables.moon b/builtin_metatables.moon index eb7e27e..ac8beff 100644 --- a/builtin_metatables.moon +++ b/builtin_metatables.moon @@ -3,6 +3,7 @@ require "text" number_mt = __type: "a Number" + __len: => @ as_lua: tostring as_nomsu: tostring as_text: tostring @@ -17,15 +18,59 @@ debug.setmetatable 0, number_mt bool_mt = __type: "a Boolean" + __len: => @ and 1 or 0 as_lua: tostring as_nomsu: => @ and "yes" or "no" as_text: => @ and "yes" or "no" + _and: (cond)=> @ and cond + _or: (cond)=> @ or cond + xor: (cond)=> @ == (not cond) bool_mt.__index = bool_mt debug.setmetatable true, bool_mt fn_mt = __type: "an Action" as_text: => (tostring(@)\gsub("function", "Action")) + __add: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) + other(...)) + elseif type(@) == 'function' then (...)-> (@(...) + other) + else (...)-> (@ + other(...)) + __sub: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) - other(...)) + elseif type(@) == 'function' then (...)-> (@(...) - other) + else (...)-> (@ - other(...)) + __mul: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) * other(...)) + elseif type(@) == 'function' then (...)-> (@(...) * other) + else (...)-> (@ * other(...)) + __div: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) other(...)) + elseif type(@) == 'function' then (...)-> (@(...) other) + else (...)-> (@ other(...)) + __mod: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) % other(...)) + elseif type(@) == 'function' then (...)-> (@(...) % other) + else (...)-> (@ % other(...)) + __band: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) and other(...)) + elseif type(@) == 'function' then (...)-> (@(...) and other) + else (...)-> (@ and other(...)) + __bor: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) or other(...)) + elseif type(@) == 'function' then (...)-> (@(...) or other) + else (...)-> (@ or other(...)) + __bxor: (other)=> + if type(@) == 'function' and type(other) == 'function' + (...)-> (@(...) != other(...)) + elseif type(@) == 'function' then (...)-> (@(...) != other) + else (...)-> (@ != other(...)) fn_mt.__index = fn_mt debug.setmetatable (->), fn_mt |
