aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-05-21 16:09:50 +0000
committers-ol <s-ol@users.noreply.github.com>2020-05-21 16:09:50 +0000
commitfbfa95b5129f13a15cc12582d8fbc22d4d38daec (patch)
tree1a79ae4787f0f330410079f0936d74828420e818
parentfix some bugs (diff)
downloadalive-fbfa95b5129f13a15cc12582d8fbc22d4d38daec.tar.gz
alive-fbfa95b5129f13a15cc12582d8fbc22d4d38daec.zip
add builtin get
-rw-r--r--alv/builtin.moon33
1 files changed, 33 insertions, 0 deletions
diff --git a/alv/builtin.moon b/alv/builtin.moon
index c3dfcda..bef4a58 100644
--- a/alv/builtin.moon
+++ b/alv/builtin.moon
@@ -400,6 +400,37 @@ to_evt = Constant.meta
tick: =>
@out\set @inputs.sig!
+get = Constant.meta
+ meta:
+ name: 'get'
+ summary: "Index into Arrays and Structs."
+ examples: { '(get val key [key2…])' }
+
+ value: class extends Op
+ pattern = (val! / evt!) + (const.str / const.sym / const.num)*0
+ setup: (inputs) =>
+ { val, keys } = pattern\match inputs
+ super val: Input.hot val
+
+ @state = [key.result! for key in *keys]
+
+ type = val\type!
+ for key in *@state
+ type = type\get key
+
+ if val\metatype == '!'
+ @out = type\mk_evt!
+ else
+ @out = type\mk_sig!
+
+ tick: =>
+ val = @inputs.val!
+ for key in *@state
+ if type(key) == 'number'
+ key = key + 1
+ val = val[key]
+ @out\set val
+
Scope.from_table {
:doc
:trace, 'trace=': trace_, print: print_
@@ -415,6 +446,8 @@ Scope.from_table {
'~': to_sig
'!': to_evt
+ :get
+
true: Constant.meta
meta:
name: 'true'