defmodule ALF.Pipeline do defstruct module: nil, components: [], producer: nil, consumer: nil alias ALF.Components.{Switch, Clone} def stages_to_list(components) do do_stages_to_list(components, []) end defp do_stages_to_list(components, list) do Enum.reduce(components, list, fn stage, found -> found ++ case stage do %Switch{branches: branches} = stage -> [stage] ++ Enum.reduce(branches, [], fn {_key, partition_stages}, inner_found -> inner_found ++ do_stages_to_list(partition_stages, []) end) %Clone{to: pipe_stages} = stage -> [stage] ++ do_stages_to_list(pipe_stages, []) stage -> [stage] end end) end end