aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2022-02-04 16:11:29 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:24:49 +0000
commit6b2a58f017529b0491ce7b639974f549a4f14889 (patch)
tree126bada6853c060385a11d6c3b3bd557c322e8da
parentadd Dummy AST node (diff)
downloadalive-6b2a58f017529b0491ce7b639974f549a4f14889.tar.gz
alive-6b2a58f017529b0491ce7b639974f549a4f14889.zip
lib: use Op:update_out
-rw-r--r--alv-lib/_midi.moon4
-rw-r--r--alv-lib/love.moon4
-rw-r--r--alv-lib/midi.moon7
-rw-r--r--alv-lib/osc.moon5
-rw-r--r--alv-lib/random.moon4
-rw-r--r--alv-lib/rhythm.moon4
-rw-r--r--alv-lib/time.moon64
-rw-r--r--alv-lib/util.moon2
-rw-r--r--alv-lib/vis.moon14
-rw-r--r--alv/base/op.moon9
-rw-r--r--alv/builtins.moon8
11 files changed, 48 insertions, 77 deletions
diff --git a/alv-lib/_midi.moon b/alv-lib/_midi.moon
index fe70af9..6d665a5 100644
--- a/alv-lib/_midi.moon
+++ b/alv-lib/_midi.moon
@@ -81,10 +81,8 @@ class PortOp extends Op
else
error "no port opened"
- if not @out or @out.type != type
- @out = type\mk_sig!
-
@state or= {}
+ @update_out '~', type
tick: =>
if @inputs.inp and @inputs.inp\dirty!
diff --git a/alv-lib/love.moon b/alv-lib/love.moon
index cb53d1a..ff0b55b 100644
--- a/alv-lib/love.moon
+++ b/alv-lib/love.moon
@@ -358,7 +358,7 @@ mouse_down = Constant.meta
press: Input.hot COPILOT.mouse_presses
release: Input.hot COPILOT.mouse_releases
- @out or= T.bool\mk_sig false
+ @update_out '~', T.bool, false
poll: =>
@@ -466,7 +466,7 @@ key_down = Constant.meta
press: Input.hot COPILOT.key_presses
release: Input.hot COPILOT.key_releases
- @out or= T.bool\mk_sig false
+ @update_out '~', T.bool, false
poll: =>
diff --git a/alv-lib/midi.moon b/alv-lib/midi.moon
index 4d95163..d0bccf3 100644
--- a/alv-lib/midi.moon
+++ b/alv-lib/midi.moon
@@ -12,7 +12,6 @@ gate = Constant.meta
pattern = -sig['midi/in'] + sig.num -sig.num
setup: (inputs, scope) =>
{ port, note, chan } = pattern\match inputs
- @out or= T.bool\mk_sig!
super
port: Input.cold port or scope\get '*midi*'
note: Input.hot note
@@ -20,6 +19,8 @@ gate = Constant.meta
internal: Input.hot T.bool\mk_sig!
+ @update_out '~', T.bool
+
poll: =>
{ :port, :note, :chan, :internal } = @inputs
@@ -54,7 +55,7 @@ trig = Constant.meta
pattern = -sig['midi/in'] + sig.num -sig.num
setup: (inputs, scope) =>
{ port, note, chan } = pattern\match inputs
- @out or= T.bang\mk_evt!
+ @out = T.bang\mk_evt!
super
port: Input.cold port or scope\get '*midi*'
note: Input.cold note
@@ -106,7 +107,7 @@ cc = Constant.meta
internal: Input.hot T.bang\mk_evt!
@state or= 0
- @out or= T.num\mk_sig apply_range @inputs.range, @state
+ @update_out '~', T.num, apply_range @inputs.range, @state
poll: =>
{ :port, :cc, :chan, :internal } = @inputs
diff --git a/alv-lib/osc.moon b/alv-lib/osc.moon
index a75c22f..e397544 100644
--- a/alv-lib/osc.moon
+++ b/alv-lib/osc.moon
@@ -1,4 +1,4 @@
-import Op, PureOp, Constant, SigStream, Input, T, sig, any from require 'alv.base'
+import Op, PureOp, Constant, Input, T, sig, any from require 'alv.base'
import new_message, add_item from require 'alv-lib._osc'
import dns, udp from require 'socket'
@@ -13,12 +13,13 @@ connect = Constant.meta
value: class extends Op
pattern = sig.str + sig.num
setup: (inputs) =>
- @out or= SigStream T['udp/socket']
{ host, port } = pattern\match inputs
super
host: Input.hot host
port: Input.hot port
+ @update_out '~', T['udp/socket']
+
tick: =>
{ :host, :port } = @unwrap_all!
ip = dns.toip host
diff --git a/alv-lib/random.moon b/alv-lib/random.moon
index 0345542..c0bf8c5 100644
--- a/alv-lib/random.moon
+++ b/alv-lib/random.moon
@@ -36,7 +36,7 @@ num = Constant.meta
value: class extends Op
new: (...) =>
super ...
- @out or= T.num\mk_sig!
+ @update_out '~', T.num
@state or @gen!
gen: => @state = math.random!
@@ -64,7 +64,7 @@ vec = (n) ->
value: class extends Op
new: (...) =>
super ...
- @out or= typ\mk_sig!
+ @update_out '~', typ
@state or @gen!
gen: => @state = for i=1,n do math.random!
diff --git a/alv-lib/rhythm.moon b/alv-lib/rhythm.moon
index 2b92fdc..d59f797 100644
--- a/alv-lib/rhythm.moon
+++ b/alv-lib/rhythm.moon
@@ -50,7 +50,7 @@ When fed a num~ or num! stream, outputs a bang if the corresponding step is on."
setup: (inputs) =>
{ trig, n, k } = pattern\match inputs
- @out or= T.bang\mk_evt!
+ @out = T.bang\mk_evt!
if trig\type! == T.bang
@state or= 1
@@ -95,7 +95,7 @@ When fed a num~ or num! stream, outputs a bang if the corresponding step is on."
setup: (inputs) =>
{ trig, steps } = pattern\match inputs
- @out or= T.bang\mk_evt!
+ @out = T.bang\mk_evt!
super
trig: Input.hot trig
diff --git a/alv-lib/time.moon b/alv-lib/time.moon
index e0eecff..f8ec7a2 100644
--- a/alv-lib/time.moon
+++ b/alv-lib/time.moon
@@ -14,16 +14,14 @@ frame rate.
- `fps` has to be a num= constant and defaults to `60` if omitted."
value: class extends Op
- new: (...) =>
- super ...
- @out or= T.clock\mk_evt!
-
setup: (inputs) =>
fps = (-sig.num)\match inputs
super
fps: Input.cold fps or Constant.num 60
io: Input.hot T.bang\mk_evt!
+ @update_out '!', T.clock
+
poll: =>
time = monotime!
@state or= time
@@ -60,10 +58,6 @@ scale_time = Constant.meta
and the stream be passed as a dynamic definition in `*clock*` instead.
- `scale` should be a num~ stream."
value: class extends Op
- new: (...) =>
- super ...
- @out or= T.clock\mk_evt!
-
pattern = -evt.clock + sig.num + -sig.str
setup: (inputs, scope) =>
{ clock, scale } = pattern\match inputs
@@ -71,6 +65,8 @@ scale_time = Constant.meta
clock: Input.hot clock or scope\get '*clock*'
scale: Input.cold scale
+ @update_out '!', T.clock
+
tick: =>
{ :clock, :scale } = @unwrap_all!
@out\set {k, v*scale for k,v in pairs clock}
@@ -90,11 +86,6 @@ lfo = Constant.meta
- `'saw'`
- `'tri'`"
value: class extends Op
- new: (...) =>
- super ...
- @state or= 0
- @out or= T.num\mk_sig!
-
default_wave = Constant.str 'sin'
pattern = -evt.clock + sig.num + -sig.str
setup: (inputs, scope) =>
@@ -104,6 +95,9 @@ lfo = Constant.meta
freq: Input.cold freq
wave: Input.hot wave or default_wave
+ @state or= 0
+ @update_out '~', T.num
+
tau = math.pi * 2
tick: =>
if tick = @inputs.clock!
@@ -133,11 +127,6 @@ ramp = Constant.meta
- `period` should be a num~ stream.
- `max` should be a num~ stream and defaults to `period` if omitted."
value: class extends Op
- new: (...) =>
- super ...
- @state or= 0
- @out or= T.num\mk_sig 0
-
pattern = -evt.clock + sig.num + -sig.num
setup: (inputs, scope) =>
{ clock, period, max } = pattern\match inputs
@@ -146,6 +135,9 @@ ramp = Constant.meta
period: Input.cold period
max: max and Input.cold max
+ @state or= 0
+ @update_out '~', T.num, 0
+
tick: =>
{ :clock, :period, :max } = @unwrap_all!
max or= period
@@ -175,11 +167,6 @@ tick = Constant.meta
- `period` should be a num~ stream.
- returns a `num~` stream that increases by 1 every `period`."
value: class extends Op
- new: (...) =>
- super ...
- @state or= { phase: 0, count: 0 }
- @out or= T.num\mk_sig @state.count
-
pattern = -evt.clock + sig.num
setup: (inputs, scope) =>
{ clock, period } = pattern\match inputs
@@ -187,6 +174,9 @@ tick = Constant.meta
clock: Input.hot clock or scope\get '*clock*'
period: Input.cold period
+ @state or= { phase: 0, count: 0 }
+ @update_out '~', T.num, @state.count
+
tick: =>
{ :clock, :period } = @unwrap_all!
return if period == 0
@@ -212,10 +202,6 @@ every = Constant.meta
- `evt` can be a value of any type. It defaults to `bang`.
- the return type will be an event stream with the same type as `evt`."
value: class extends Op
- new: (...) =>
- super ...
- @state or= 0
-
pattern = -evt.clock + sig.num + -sig!
setup: (inputs, scope) =>
{ clock, period, evt } = pattern\match inputs
@@ -223,7 +209,9 @@ every = Constant.meta
clock: Input.hot clock or scope\get '*clock*'
period: Input.cold period
evt: Input.cold evt or T.bang\mk_const true
- @out = @inputs.evt\type!\mk_evt!
+
+ @state or= 0
+ @update_out '!', @inputs.evt\type!
tick: =>
{ :clock, :period, :evt } = @unwrap_all!
@@ -263,12 +251,14 @@ Emits `evt1`, `evt2`, … as events with delays `delay0`, `delay1`, … in betwe
setup: (inputs, scope) =>
{ clock, first, steps } = pattern\match inputs
- @out = steps[1].value\type!\mk_evt!
table.insert steps, 1, { delay: first }
+
super
clock: Input.hot clock or scope\get '*clock*'
steps: [inputify step for step in *steps]
+ @update_out '!', steps[1].value\type!
+
tick: =>
if tick = @inputs.clock!
@state.t += tick.dt
@@ -344,10 +334,6 @@ Creates smooth transitions when `value` changes.
- `rate` is a num~ or num= value."
value: class extends Op
- new: (...) =>
- super ...
- @out = T.num\mk_sig!
-
pattern = -evt.clock + sig.num + any.num
setup: (inputs, scope) =>
{ clock, rate, value } = pattern\match inputs
@@ -357,7 +343,7 @@ Creates smooth transitions when `value` changes.
rate: Input.cold rate
value: Input.cold value
- @out\set @inputs.value! unless @.out!
+ @update_out '~', T.num, @inputs.value!
tick: =>
{ :clock, :rate, :value } = @unwrap_all!
@@ -381,10 +367,6 @@ Delays incoming `evt`s by `delay`.
- `evt` is a !-stream."
value: class extends Op
- new: (...) =>
- super ...
- @state = {}
-
pattern = -evt.clock + any.num + any!
setup: (inputs, scope) =>
{ clock, delay, evt } = pattern\match inputs
@@ -394,12 +376,10 @@ Delays incoming `evt`s by `delay`.
delay: Input.cold delay
evt: Input.hot evt
- if @out and @out.type != @inputs.evt\type!
- -- clear queue if type is not compatible
+ @state or= {}
+ if @update_out '!', @inputs.evt\type!
@state = {}
- @out = @inputs.evt\type!\mk_evt!
-
tick: =>
clock = @inputs.clock!
if clock and #@state > 0
diff --git a/alv-lib/util.moon b/alv-lib/util.moon
index 11c2c7e..55b0c4b 100644
--- a/alv-lib/util.moon
+++ b/alv-lib/util.moon
@@ -8,9 +8,9 @@ edge = Constant.meta
value: class extends Op
setup: (inputs) =>
- @out or= T.bang\mk_evt!
value = sig.bool\match inputs
super value: Input.hot value
+ @out = T.bang\mk_evt!
tick: =>
now = @inputs.value!
diff --git a/alv-lib/vis.moon b/alv-lib/vis.moon
index 941f9e4..ea739de 100644
--- a/alv-lib/vis.moon
+++ b/alv-lib/vis.moon
@@ -17,16 +17,13 @@ Visualizes `val` as a bar with range `min, max`.
if not max
min, max = nil, min
- @out = if val.result.metatype ~= '!'
- val\type!\mk_sig!
- else
- val\type!\mk_evt!
-
super
val: Input.hot val
min: Input.cold min or Constant.num 0
max: Input.cold max or Constant.num 1
+ @update_out val.result.metatype, val\type!
+
tick: =>
{ :val, :min, :max } = @unwrap_all!
delta = max - min
@@ -57,15 +54,12 @@ Visualizes `val` as an RGB(A) color with each component in range `0 - range`.
setup: (inputs, scope) =>
{ val, max } = pattern\match inputs
- @out = if val.result.metatype ~= '!'
- val\type!\mk_sig!
- else
- val\type!\mk_evt!
-
super
val: Input.hot val
max: Input.cold max or Constant.num 1
+ @update_out val.result.metatype, val\type!
+
tick: =>
{ :val, :max } = @unwrap_all!
@out\set val
diff --git a/alv/base/op.moon b/alv/base/op.moon
index e751145..4153a52 100644
--- a/alv/base/op.moon
+++ b/alv/base/op.moon
@@ -170,16 +170,13 @@ class Op
-- @tparam Type type
-- @tparam[opt] any val initial value
update_out: (metatype, type, val) =>
- same_type = @out and @out.type == type
- if same_type and @out.metatype == metatype
+ if @out and @out.type == type and @out.metatype == metatype
-- we can just keep it. do nothing.
- return
-
- -- prefer last value if applicable
- val = same_type and @.out! or val
+ return false
ResultType = if metatype == '!' then EvtStream else SigStream
@out = ResultType type, val
+ true
--- `\unwrap` all `Input`s in `@inputs` and return a table with the same
-- shape.
diff --git a/alv/builtins.moon b/alv/builtins.moon
index 5fe5e99..622a59e 100644
--- a/alv/builtins.moon
+++ b/alv/builtins.moon
@@ -441,9 +441,9 @@ to_const = Constant.meta
value: class extends Op
setup: (inputs) =>
- super {}
input = const!\match inputs
- @out = input\type!\mk_const input.result!
+ super value: Input.hot input
+ @out = input.result
to_sig = Constant.meta
meta:
@@ -492,7 +492,7 @@ to_evt = Constant.meta
else
super sig: Input.hot sig_
- @out = @inputs.sig\type!\mk_evt!
+ @update_out '!', @inputs.sig\type!
tick: (setup) =>
return if setup
@@ -514,7 +514,7 @@ In case of collisions, the event that comes first in the argument list wins."
setup: (inputs) =>
values = pattern\match inputs
super [Input.hot v for v in *values]
- @out = @inputs[1]\type!\mk_evt!
+ @update_out '!', @inputs[1]\type!
tick: =>
for input in *@inputs