diff options
| author | s-ol <s+removethis@s-ol.nu> | 2021-11-11 16:21:38 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:24:49 +0000 |
| commit | af80554e8ae3a56104c6e3bb957d6e6df67169e7 (patch) | |
| tree | 05ce0f38e3f6f51457ae26961c22ab18d07b9f5a | |
| parent | add merge! builtin op (diff) | |
| download | alive-af80554e8ae3a56104c6e3bb957d6e6df67169e7.tar.gz alive-af80554e8ae3a56104c6e3bb957d6e6df67169e7.zip | |
lib: add time/delay!
| -rw-r--r-- | alv-lib/time.moon | 52 |
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 |
