diff options
| author | s-ol <s+removethis@s-ol.nu> | 2026-04-10 22:54:21 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2026-04-10 22:58:32 +0000 |
| commit | 44f1ee56a119bd3dc683194e0f76d463991caa5e (patch) | |
| tree | 4885807fa1c3ce817a9ee2abdfbdc8bf3123b7b3 | |
| parent | glsl-view: draw takes !-streams (diff) | |
| download | alive-44f1ee56a119bd3dc683194e0f76d463991caa5e.tar.gz alive-44f1ee56a119bd3dc683194e0f76d463991caa5e.zip | |
lib/array: add history
| -rw-r--r-- | alv-lib/array.moon | 38 |
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 |
