aboutsummaryrefslogtreecommitdiff
path: root/builtin_metatables.moon
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-02-02 19:30:07 -0800
committerBruce Hill <bruce@bruce-hill.com>2019-02-02 19:31:15 -0800
commit11997f02552468d390c82b812d3800a97e7a8dac (patch)
treebef658592e0bf2ddf0ed9bb8435230c50e6e8401 /builtin_metatables.moon
parente8e00adeaa29cfc0e7b581550bc1bca15f4ddc69 (diff)
Added some more metamethods including: (#5 == 5, ((-> (foo)) | (->
(baz))) == (-> ((foo) or (baz)))
Diffstat (limited to 'builtin_metatables.moon')
-rw-r--r--builtin_metatables.moon45
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