Хотя ответ @ Badu технически верен, он [самоуверенный] не полностью идиоматический эликсир, поскольку имеет дублирование кода и использует [опрометчиво] неправильную абстракцию для представления кусков данных.
То, что у вас есть, это буквально список кусков, так что вам, вероятно, нужно: Enum.chunk_while/4
.
chunk_fun = fn
widget, [] ->
{:cont, [widget]}
# ⇓⇓ ⇓⇓ PATTERN MATCH!
%{production_date: pd} = widget, [%{production_date: pd} | _] = prev ->
{:cont, [widget | prev]}
widget, acc ->
{:cont, Enum.reverse(acc), []}
end
after_fun = fn
[] -> {:cont, []}
acc -> {:cont, Enum.reverse(acc), []}
end
widgets = Enum.chunk_while(@widgets, [], chunk_fun, after_fun)
Теперь в widgets
у вас есть куски из @widgets
, сгруппированы по дате.Давайте выведем их:
for [%{production_date: date} | _] = chunk <- widgets do
# output the header with the date
for widget <- chunk do
# render the widget
end
end
Я не тестировал этот код, но он должен работать как есть.