Packages
reactor
0.11.0
1.0.2
1.0.1
1.0.0
0.17.0
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
An asynchronous, graph-based execution engine
Current section
Files
Jump to
Current section
Files
lib/reactor/builder/input.ex
defmodule Reactor.Builder.Input do
@moduledoc """
Handle adding inputs to Reactors for the builder.
You should not use this module directly, but instead use
`Reactor.Builder.add_input/3`.
"""
alias Reactor.{Argument, Step}
import Reactor.Utils
@doc """
Add a named input to the reactor.
"""
@spec add_input(Reactor.t(), any, nil | (any -> any) | {Step.step(), keyword}) ::
{:ok, Reactor.t()} | {:error, any}
def add_input(reactor, name, nil), do: {:ok, %{reactor | inputs: [name | reactor.inputs]}}
def add_input(reactor, name, transform) when is_function(transform, 1),
do: add_input(reactor, name, {Step.Transform, fun: transform})
def add_input(reactor, name, transform)
when tuple_size(transform) == 2 and is_atom(elem(transform, 0)) and
is_list(elem(transform, 1)) do
transform_step = %Step{
arguments: [Argument.from_input(:value, name)],
async?: true,
impl: transform,
name: {:__reactor__, :transform, :input, name},
max_retries: 0,
ref: make_ref()
}
{:ok, %{reactor | inputs: [name | reactor.inputs], steps: [transform_step | reactor.steps]}}
end
def add_input(_reactor, _name, transform),
do: {:error, argument_error(:transform, "Invalid transform function", transform)}
end