From 44f1ee56a119bd3dc683194e0f76d463991caa5e Mon Sep 17 00:00:00 2001 From: s-ol Date: Sat, 11 Apr 2026 00:54:21 +0200 Subject: lib/array: add history --- alv-lib/array.moon | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3