aboutsummaryrefslogtreecommitdiffstats
path: root/alv/base
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-05-12 16:27:19 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:23:21 +0000
commit8ecead9e25187e1b4dcd3c9cef2cd21b8384eaba (patch)
treee893442b00d19fb5576df24b086fe3ad44c20809 /alv/base
parentbase.match: never recall by default (diff)
downloadalive-8ecead9e25187e1b4dcd3c9cef2cd21b8384eaba.tar.gz
alive-8ecead9e25187e1b4dcd3c9cef2cd21b8384eaba.zip
add and use PureOp
Diffstat (limited to 'alv/base')
-rw-r--r--alv/base/init.moon4
-rw-r--r--alv/base/pureop.moon56
2 files changed, 59 insertions, 1 deletions
diff --git a/alv/base/init.moon b/alv/base/init.moon
index 0cab7e3..65730a3 100644
--- a/alv/base/init.moon
+++ b/alv/base/init.moon
@@ -6,6 +6,7 @@
--
-- @module base
-- @see Op
+-- @see PureOp
-- @see Builtin
-- @see FnDef
-- @see Input
@@ -24,6 +25,7 @@
-- @see Error
import Op from require 'alv.base.op'
+import PureOp from require 'alv.base.pureop'
import Builtin from require 'alv.base.builtin'
import FnDef from require 'alv.base.fndef'
import Input from require 'alv.base.input'
@@ -34,7 +36,7 @@ import RTNode from require 'alv.rtnode'
import Error from require 'alv.error'
{
- :Op
+ :Op, :PureOp
:Builtin
:FnDef
:Input
diff --git a/alv/base/pureop.moon b/alv/base/pureop.moon
new file mode 100644
index 0000000..ea3b810
--- /dev/null
+++ b/alv/base/pureop.moon
@@ -0,0 +1,56 @@
+----
+-- Stateless Operator base for pure functions.
+--
+-- All arguments can be evt- and val-capable. If one of the arguments is an
+-- !-stream, it will be the only `Input.hot`. If there are no !-streams,
+-- all inputs are hot. Passing more than one !-stream is an argument error.
+--
+-- To use `PureOp`, extend the class and set/implement only `pattern`, `type`
+-- and `tick`.
+-- @classmod PureOp
+import Op from require 'alv.base.op'
+import Input from require 'alv.base.input'
+import SigStream, EvtStream from require 'alv.result'
+import Error from require 'alv.error'
+
+unpack or= table.unpack
+
+class PureOp extends Op
+--- members.
+-- @section members
+
+ --- the argument pattern.
+ --
+ -- Must resolve to a simple sequence-table (depth 1).
+ --
+ -- @tfield match.Pattern pattern
+ @pattern: nil
+
+ --- the result type.
+ -- @tfield type.Type type
+ @type: nil
+
+ --- set up inputs for a range of things.
+ setup: (inputs) =>
+ args = @@pattern\match inputs
+
+ local trigger
+ for arg in *args
+ if arg.result.metatype == '!'
+ assert not trigger, Error 'argument', "pure op can take at most one !-stream."
+ trigger = arg
+
+ if trigger
+ super for a in *args
+ if a == trigger
+ Input.hot trigger
+ else
+ Input.cold a
+ @out = EvtStream @@type
+ else
+ super [Input.hot a for a in *args]
+ @out or= SigStream @@type
+
+{
+ :PureOp
+}