aboutsummaryrefslogtreecommitdiffstats
path: root/lib/random.moon
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-03-02 14:40:00 +0000
committers-ol <s-ol@users.noreply.github.com>2020-03-02 16:48:09 +0000
commit4ebb6f4408600f3c0f2a745b7ed0ba951bf521b3 (patch)
treecdf0953fdee07a6c83c510470a7b8ab8d832d25d /lib/random.moon
parentupdate lib.math and lib.logic to new op interface (diff)
downloadalive-4ebb6f4408600f3c0f2a745b7ed0ba951bf521b3.tar.gz
alive-4ebb6f4408600f3c0f2a745b7ed0ba951bf521b3.zip
lift remaining libs to new op interface
Diffstat (limited to 'lib/random.moon')
-rw-r--r--lib/random.moon77
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/random.moon b/lib/random.moon
new file mode 100644
index 0000000..9e5e62b
--- /dev/null
+++ b/lib/random.moon
@@ -0,0 +1,77 @@
+import Op, Value, ValueInput, EventInput, match from require 'core'
+
+apply_range = (range, val) ->
+ if range\type! == 'str'
+ switch range\unwrap!
+ when 'uni' then val
+ when 'bip' then val * 2 - 1
+ when 'rad' then val * 2 * math.pi
+ when 'deg' then val * 360
+ else
+ error "unknown range #{@range}"
+ elseif range.type == 'num'
+ val * range\unwrap!
+ else
+ error "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["
+
+class num extends Op
+ @doc: "(random/num [trigger] [range]) - create a random number
+
+generates a random value in range on create and trigger.
+#{range_doc}"
+ new: =>
+ super 'num'
+ @gen!
+
+ gen: => @val = math.random!
+
+ setup: (inputs) =>
+ { trig, range } = match 'bang? any?', inputs
+ super
+ trig: trig and EventInput trig
+ range: ValueInput range or Value.str 'uni'
+
+ tick: =>
+ @gen! if @inputs.trig and @inputs.trig\dirty!
+ @out\set apply_range @inputs.range, @val
+
+vec_ = (n) ->
+ class vec extends Op
+ @doc: "(random/vec#{n} [trigger] [range]) - create a random number
+
+generates a random vec#{n} on create and trigger.
+each component is in range.
+#{range_doc}"
+ new: =>
+ super "vec#{n}"
+ @gen!
+
+ gen: => @val = for i=1,n do math.random!
+
+ setup: (inputs) =>
+ { trig, range } = match 'bang? any?', inputs
+ super
+ trig: trig and EventInput trig
+ range: ValueInput range or Value.str 'uni'
+
+ tick: =>
+ @gen! if @inputs.trig and @inputs.trig\dirty!
+ @out\set [apply_range @inputs.range, v for v in *@val]
+
+ vec.__name = "vec#{n}"
+ vec
+
+{
+ :num
+ vec2: vec_ 2
+ vec3: vec_ 3
+ vec4: vec_ 4
+}