I was pointed here from my own thread Rendering components from a view - #4 by cmo
Enum.intersperse/2
is a great solution
# template.html.heex
<%= for component <- intersperse_widgets(@widgets) %>
<%= component %>
<% end%>
# my_view.ex
def intersperse_widgets(widgets) do
widgets
|> Enum.map(fn widget -> component(&widget_component/1, widget: widget) end)
|> Enum.intersperse(component(&separator_component/1))
end
defp widget_component(assigns) do
~H"""
<div> <%= @widget.id %> </div>
"""
end
defp separator_component(assigns), do: ~H"<hr>"