Skip to content

Commit 4fb6b7e

Browse files
committed
improvement!: Store inputs in their own struct
1 parent 9147120 commit 4fb6b7e

File tree

14 files changed

+59
-57
lines changed

14 files changed

+59
-57
lines changed

lib/reactor.ex

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ defmodule Reactor do
4444
defstruct context: %{},
4545
description: nil,
4646
id: nil,
47-
input_descriptions: %{},
4847
inputs: [],
4948
intermediate_results: %{},
5049
middleware: [],
@@ -144,8 +143,7 @@ defmodule Reactor do
144143
context: context,
145144
description: nil | String.t(),
146145
id: any,
147-
input_descriptions: %{atom => String.t()},
148-
inputs: [atom],
146+
inputs: [Reactor.Input.t()],
149147
intermediate_results: %{any => any},
150148
middleware: [Reactor.Middleware.t()],
151149
plan: nil | Graph.t(),

lib/reactor/builder/compose.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ defmodule Reactor.Builder.Compose do
138138
end
139139

140140
defp reactor_inputs(reactor) when is_struct(reactor),
141-
do: {:ok, MapSet.new(reactor.inputs)}
141+
do: {:ok, MapSet.new(reactor.inputs, & &1.name)}
142142

143143
defp reactor_inputs(reactor) when is_atom(reactor) do
144144
with {:ok, reactor} <- Reactor.Info.to_struct(reactor) do

lib/reactor/builder/input.ex

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -43,38 +43,34 @@ defmodule Reactor.Builder.Input do
4343
@doc """
4444
Add a named input to the reactor.
4545
"""
46-
@spec add_input(Reactor.t(), any, options) :: {:ok, Reactor.t()} | {:error, any}
47-
def add_input(reactor, name, options) do
48-
case validate_options(options) do
49-
{:ok, options} when is_nil(options.transform) ->
50-
reactor =
51-
reactor
52-
|> do_add_input(name)
53-
|> maybe_add_description(name, options.description)
46+
@spec add_input(Reactor.t(), any, options | transform) :: {:ok, Reactor.t()} | {:error, any}
47+
def add_input(reactor, name, nil), do: add_input(reactor, name, [])
5448

55-
{:ok, reactor}
56-
57-
{:ok, options} ->
58-
reactor =
59-
reactor
60-
|> do_add_input(name)
61-
|> add_input_transform(name, options.transform)
62-
|> maybe_add_description(name, options.description)
63-
64-
{:ok, reactor}
49+
def add_input(reactor, name, options) when is_list(options) do
50+
with {:ok, options} <- Spark.Options.validate(options, @options) do
51+
reactor =
52+
reactor
53+
|> do_add_input(name, options)
54+
|> maybe_add_input_transform(name, options[:transform])
6555

66-
{:error, reason} ->
67-
{:error, reason}
56+
{:ok, reactor}
6857
end
6958
end
7059

71-
defp do_add_input(reactor, name), do: %{reactor | inputs: [name | reactor.inputs]}
72-
defp maybe_add_description(reactor, _name, nil), do: reactor
60+
def add_input(reactor, name, transform), do: add_input(reactor, name, transform: transform)
61+
62+
defp do_add_input(reactor, name, options) do
63+
input = %Reactor.Input{
64+
name: name,
65+
description: options[:description]
66+
}
67+
68+
%{reactor | inputs: [input | reactor.inputs]}
69+
end
7370

74-
defp maybe_add_description(reactor, name, description),
75-
do: %{reactor | input_descriptions: Map.put(reactor.input_descriptions, name, description)}
71+
defp maybe_add_input_transform(reactor, _name, nil), do: reactor
7672

77-
defp add_input_transform(reactor, name, {module, options} = transform)
73+
defp maybe_add_input_transform(reactor, name, {module, options} = transform)
7874
when is_atom(module) and is_list(options) do
7975
transform_step = %Step{
8076
arguments: [Argument.from_input(:value, name)],
@@ -89,14 +85,6 @@ defmodule Reactor.Builder.Input do
8985
%{reactor | steps: [transform_step | reactor.steps]}
9086
end
9187

92-
defp add_input_transform(reactor, name, transform),
93-
do: add_input_transform(reactor, name, {Step.Transform, fun: transform})
94-
95-
defp validate_options(options) when is_list(options) do
96-
with {:ok, options} <- Spark.Options.validate(options, @options) do
97-
{:ok, Map.new(options)}
98-
end
99-
end
100-
101-
defp validate_options(transform), do: validate_options(transform: transform)
88+
defp maybe_add_input_transform(reactor, name, transform),
89+
do: maybe_add_input_transform(reactor, name, {Step.Transform, fun: transform})
10290
end

lib/reactor/executor/init.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ defmodule Reactor.Executor.Init do
5151
end
5252

5353
defp validate_inputs(reactor, inputs) do
54-
valid_input_names = MapSet.new(reactor.inputs)
54+
valid_input_names = MapSet.new(reactor.inputs, & &1.name)
5555
provided_input_names = inputs |> Map.keys() |> MapSet.new()
5656

5757
if MapSet.subset?(valid_input_names, provided_input_names) do
58-
{:ok, Map.take(inputs, reactor.inputs)}
58+
{:ok, Map.take(inputs, Enum.to_list(valid_input_names))}
5959
else
6060
missing_inputs =
6161
valid_input_names

lib/reactor/input.ex

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# SPDX-FileCopyrightText: 2023 James Harton, Zach Daniel, Alembic Pty and contributors
2+
# SPDX-FileCopyrightText: 2023 reactor contributors <https://github.com/ash-project/reactor/graphs.contributors>
3+
#
4+
# SPDX-License-Identifier: MIT
5+
6+
defmodule Reactor.Input do
7+
@moduledoc """
8+
Reactor's internal representation for inputs.
9+
"""
10+
defstruct [:name, :description]
11+
12+
@type t :: %__MODULE__{
13+
name: atom,
14+
description: nil | String.t()
15+
}
16+
end

lib/reactor/mermaid/reactor.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,24 @@ defmodule Reactor.Mermaid.Reactor do
5757
|> map_while_ok(&generate_input(&1, reactor, options))
5858
end
5959

60-
defp generate_input(input_name, reactor, options) do
61-
id = mermaid_id({reactor.id, input_name}, :input)
60+
defp generate_input(input, reactor, options) do
61+
id = mermaid_id({reactor.id, input.name}, :input)
6262

6363
content =
6464
if options[:describe?] do
6565
[
6666
id,
6767
">\"`",
6868
"**Input ",
69-
to_string(input_name),
69+
to_string(input.name),
7070
"**",
7171
"\n",
72-
md_escape(Map.get(reactor.input_descriptions, input_name)),
72+
md_escape(input.description),
7373
"`\"]",
7474
"\n"
7575
]
7676
else
77-
[id, ">\"Input ", to_string(input_name), "\"]\n"]
77+
[id, ">\"Input ", to_string(input.name), "\"]\n"]
7878
end
7979

8080
{:ok, %Node{id: id, pre: content}}

lib/reactor/step/around/mermaid.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ defmodule Reactor.Step.Around.Mermaid do
2020
links =
2121
reactor.inputs
2222
|> Enum.map(fn input ->
23-
[node.id, "-->", mermaid_id({reactor.id, input}, :input), "\n"]
23+
[node.id, "-->", mermaid_id({reactor.id, input.name}, :input), "\n"]
2424
end)
2525
|> Enum.concat([inner_return_id, "-->", node.id, "\n"])
2626

lib/reactor/step/compose/mermaid.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ defmodule Reactor.Step.Compose.Mermaid do
2828
links =
2929
reactor.inputs
3030
|> Enum.map(fn input ->
31-
[node.id, "-->", mermaid_id({reactor.id, input}, :input), "\n"]
31+
[node.id, "-->", mermaid_id({reactor.id, input.name}, :input), "\n"]
3232
end)
3333
|> Enum.concat([inner_return_id, "-->", node.id, "\n"])
3434

lib/reactor/step/group/mermaid.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ defmodule Reactor.Step.Group.Mermaid do
2020
links =
2121
reactor.inputs
2222
|> Enum.map(fn input ->
23-
[node.id, "-->", mermaid_id({reactor.id, input}, :input), "\n"]
23+
[node.id, "-->", mermaid_id({reactor.id, input.name}, :input), "\n"]
2424
end)
2525
|> Enum.concat([inner_return_id, "-->", node.id, "\n"])
2626

lib/reactor/step/map/mermaid.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ defmodule Reactor.Step.Map.Mermaid do
2525
links =
2626
reactor.inputs
2727
|> Enum.map(fn input ->
28-
[node.id, "-->", mermaid_id({reactor.id, input}, :input), "\n"]
28+
[node.id, "-->", mermaid_id({reactor.id, input.name}, :input), "\n"]
2929
end)
3030
|> Enum.concat([inner_return_id, "-->", node.id, "\n"])
3131

0 commit comments

Comments
 (0)