alias BeamWeaver.Graph.Command
alias BeamWeaver.Graph.Send
defmodule BeamWeaver.Examples.BranchingWaitingGraph do
use BeamWeaver.Agent
graph do
state do
channel(:items, merge: fn existing, update -> existing ++ List.wrap(update) end)
end
node(:route, fn _state -> %Command{goto: :fanout} end)
node(:fanout, fn _state ->
[%Send{node: :worker, update: %{item: "a"}}, %Send{node: :worker, update: %{item: "b"}}]
end)
node(:worker, fn state -> %{items: [state.item]} end)
edge(start(), :route)
edge(:worker, finish())
end
end
{:ok, %{items: items}} = BeamWeaver.Examples.BranchingWaitingGraph.invoke(%{items: []})
IO.puts(items |> Enum.sort() |> Enum.join(","))