aboutsummaryrefslogtreecommitdiffstats
path: root/alv-lib/random.moon
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-04-14 09:21:00 +0000
committers-ol <s-ol@users.noreply.github.com>2020-04-14 09:21:00 +0000
commit5faab5d81cc5ed36824a52a273e83eb20240cb2e (patch)
treedba10fadf4cdad0f5524df642fab83f6310a8574 /alv-lib/random.moon
parentmove spec out of spec/core (diff)
downloadalive-5faab5d81cc5ed36824a52a273e83eb20240cb2e.tar.gz
alive-5faab5d81cc5ed36824a52a273e83eb20240cb2e.zip
move lib to alv-lib module
Diffstat (limited to 'alv-lib/random.moon')
-rw-r--r--alv-lib/random.moon85
1 files changed, 85 insertions, 0 deletions
diff --git a/alv-lib/random.moon b/alv-lib/random.moon
new file mode 100644
index 0000000..8c4d096
--- /dev/null
+++ b/alv-lib/random.moon
@@ -0,0 +1,85 @@
+import ValueStream, Error, Op, Input, val, evt from require 'alv.base'
+
+apply_range = (range, val) ->
+ if range\type! == 'str'
+ switch range!
+ when 'uni' then val
+ when 'bip' then val*2 - 1
+ when 'rad' then val*2 * math.pi
+ when 'deg' then val * 360
+ else
+ error Error 'argument', "unknown range '#{range!}'"
+ elseif range\type! == 'num'
+ val * range!
+ else
+ error Error 'argument', "range has to be a string or number"
+
+range_doc = "
+range can be one of:
+- 'uni' [ 0 - 1[ (default)
+- 'bip' [-1 - 1[
+- 'rad' [ 0 - tau[
+- 'deg' [ 0 - 360[
+- (num) [ 0 - num["
+
+pattern = -evt.bang + -(val.num / val.str)
+
+num = ValueStream.meta
+ meta:
+ name: 'num'
+ summary: 'Generate a random number.'
+ examples: { '(random/num [trigger] [range]))' }
+ description: "Generate a random value in `range` when created and on `trig`.
+#{range_doc}"
+
+ value: class extends Op
+ new: (...) =>
+ super ...
+ @out or= ValueStream 'num'
+ @state or @gen!
+
+ gen: => @state = math.random!
+
+ setup: (inputs) =>
+ { trig, range } = pattern\match inputs
+ super
+ trig: trig and Input.hot trig
+ range: Input.hot range or ValueStream.str 'uni'
+
+ tick: =>
+ @gen! if @inputs.trig and @inputs.trig\dirty!
+ @out\set apply_range @inputs.range, @state
+
+vec = (n) ->
+ ValueStream.meta
+ meta:
+ name: "vec#{n}"
+ summary: 'Generate a random vector.'
+ examples: { '(random/vec#{n} [trigger] [range]))' }
+ description: "Generate a random vec#{n} in `range` when created and on `trig`.
+#{range_doc}"
+
+ value: class extends Op
+ new: (...) =>
+ super ...
+ @out or= ValueStream "vec#{n}"
+ @state or @gen!
+
+ gen: => @state = for i=1,n do math.random!
+
+ setup: (inputs) =>
+ { trig, range } = pattern\match inputs
+ super
+ trig: trig and Input.hot trig
+ range: Input.hot range or ValueStream.str 'uni'
+
+ tick: =>
+ @gen! if @inputs.trig and @inputs.trig\dirty!
+ @out\set [apply_range @inputs.range, v for v in *@state]
+
+{
+ :num
+ vec2: vec 2
+ vec3: vec 3
+ vec4: vec 4
+}