Packages
reactor
0.3.4
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/step/anon_fn.ex
defmodule Reactor.Step.AnonFn do
@moduledoc """
The built-in step for executing in-line DSL anonymous functions.
This step assumes that it is being called as per the
`:spark_function_behaviour` semantics.
"""
use Reactor.Step
@doc false
@impl true
@spec run(Reactor.inputs(), Reactor.context(), keyword) :: {:ok | :error, any}
def run(arguments, context, options) do
case Keyword.fetch!(options, :run) do
fun when is_function(fun, 1) ->
fun.(arguments)
fun when is_function(fun, 2) ->
fun.(arguments, context)
{m, f, a} when is_atom(m) and is_atom(f) and is_list(a) ->
apply(m, f, [arguments, context] ++ a)
end
rescue
error -> {:error, error}
end
@doc false
@impl true
@spec compensate(any, Reactor.inputs(), Reactor.context(), keyword) ::
{:continue, any} | :ok | :retry
def compensate(reason, arguments, context, options) do
case Keyword.fetch(options, :compensate) do
{:ok, fun} when is_function(fun, 1) ->
fun.(reason)
{:ok, fun} when is_function(fun, 2) ->
fun.(reason, arguments)
{:ok, fun} when is_function(fun, 3) ->
fun.(reason, arguments, context)
{:ok, {m, f, a}} when is_atom(m) and is_atom(f) and is_list(a) ->
apply(m, f, [reason, arguments, context] ++ a)
_ ->
:ok
end
end
@doc false
@impl true
@spec undo(any, Reactor.inputs(), Reactor.context(), keyword) :: :ok | :retry | {:error, any}
def undo(value, arguments, context, options) do
case Keyword.fetch(options, :undo) do
{:ok, fun} when is_function(fun, 1) ->
fun.(value)
{:ok, fun} when is_function(fun, 2) ->
fun.(value, arguments)
{:ok, fun} when is_function(fun, 3) ->
fun.(value, arguments, context)
{:ok, {m, f, a}} when is_atom(m) and is_atom(f) and is_list(a) ->
apply(m, f, [value, arguments, context] ++ a)
_ ->
:ok
end
end
end