aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2021-11-11 16:21:38 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:24:49 +0000
commitaf80554e8ae3a56104c6e3bb957d6e6df67169e7 (patch)
tree05ce0f38e3f6f51457ae26961c22ab18d07b9f5a
parentadd merge! builtin op (diff)
downloadalive-af80554e8ae3a56104c6e3bb957d6e6df67169e7.tar.gz
alive-af80554e8ae3a56104c6e3bb957d6e6df67169e7.zip
lib: add time/delay!
-rw-r--r--alv-lib/time.moon52
1 files changed, 52 insertions, 0 deletions
diff --git a/alv-lib/time.moon b/alv-lib/time.moon
index 49b193a..a39849a 100644
--- a/alv-lib/time.moon
+++ b/alv-lib/time.moon
@@ -366,6 +366,56 @@ Creates smooth transitions when `value` changes.
delta = value - current
@out\set current + delta * rate
+delay = Constant.meta
+ meta:
+ name: 'delay!'
+ summary: "Delay a !-stream event"
+ examples: { '(delay! [clock] delay evt)' }
+ description: "
+Delays incoming `evt`s by `delay`.
+
+- `clock` should be a `time/clock!` stream. This argument can be omitted
+ and the stream be passed as a dynamic definition in `*clock*` instead.
+- `delay` should be a num= or num~ stream.
+- `evt` is a !-stream."
+
+ value: class extends Op
+ new: (...) =>
+ super ...
+ @state = {}
+
+ pattern = -evt.clock + (sig.num / evt.num) + (sig! / evt!)
+ setup: (inputs, scope) =>
+ { clock, delay, evt } = pattern\match inputs
+
+ super
+ clock: Input.hot clock or scope\get '*clock*'
+ delay: Input.cold delay
+ evt: Input.hot evt
+
+ if @out and @out.type != @inputs.evt\type!
+ -- clear queue if type is not compatible
+ @state = {}
+
+ @out = @inputs.evt\type!\mk_evt!
+
+ tick: =>
+ clock = @inputs.clock!
+ if clock and #@state > 0
+ delta = clock.dt
+ for item in *@state
+ item.delay -= delta
+
+ if @state[1].delay < 0
+ item = table.remove @state, 1
+ @out\set item.value
+
+ if @inputs.evt\dirty!
+ value = @inputs.evt!
+ delay = @inputs.delay!
+ table.insert @state, { :delay, :value }
+
+
RTNode
children: { default_clock }
@@ -383,6 +433,8 @@ RTNode
:every
'val-seq': val_seq
'bang-seq': bang_seq
+
:smooth
+ :delay
'*clock*': default_clock