aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2026-04-10 22:54:21 +0000
committers-ol <s+removethis@s-ol.nu>2026-04-10 22:58:32 +0000
commit44f1ee56a119bd3dc683194e0f76d463991caa5e (patch)
tree4885807fa1c3ce817a9ee2abdfbdc8bf3123b7b3
parentglsl-view: draw takes !-streams (diff)
downloadalive-44f1ee56a119bd3dc683194e0f76d463991caa5e.tar.gz
alive-44f1ee56a119bd3dc683194e0f76d463991caa5e.zip
lib/array: add history
-rw-r--r--alv-lib/array.moon38
1 files changed, 37 insertions, 1 deletions
diff --git a/alv-lib/array.moon b/alv-lib/array.moon
index 42eccee..2a20023 100644
--- a/alv-lib/array.moon
+++ b/alv-lib/array.moon
@@ -1,4 +1,4 @@
-import Array, Op, PureOp, Builtin, RTNode, Constant, Error, const, any, T from require 'alv.base'
+import Array, Op, PureOp, Builtin, Input, RTNode, Constant, Error, const, any, evt, sig, T from require 'alv.base'
import Cell, Tag, Dummy from require 'alv.ast'
builtins = require 'alv.builtins'
@@ -284,6 +284,40 @@ Invokes `fn` once for each element in `array` and returns an array of the result
node = inner\eval scope
super RTNode children: { array, fn, node }, result: node.result
+history = Constant.meta
+ meta:
+ name: 'history'
+ summary: "Keep history of last N values."
+ examples: { '(history num init sig)' }
+
+ value: class extends Op
+ pattern = const.num + const! + (evt! / sig!)
+ setup: (inputs) =>
+ { num, init, sig } = pattern\match inputs
+
+ super value: Input.hot sig
+
+ assert init\type! == sig\type!, "init and sig have to be same type"
+
+ num = num.result!
+ typ = init\type!
+
+ if not @state or #@state.values != num or @state.type != typ
+ @state =
+ type: typ
+ values: [init.result! for i=1, num]
+
+ @setup_out '~', (Array num, typ), @state.values
+
+ tick: =>
+ { :value } = @unwrap_all!
+
+ if value
+ @state.values = [k for k in *@state.values]
+ table.remove @state.values
+ table.insert @state.values, 1, value
+ @out\set @state.values
+
Constant.meta
meta:
name: 'array'
@@ -295,4 +329,6 @@ Constant.meta
:insert, :remove
:map
+ :history
+
:size, :concat