У меня есть поток держит перечисление из двух элементов кортежей, такие как:Чанкинг Потока с пользовательской функцией отрывов
[
{:dialogue, %{}},
{:info, %{}},
{:info, %{}},
{:info, %{}},
{:dialogue, %{}},
{:dialogue, %{}},
{:info, %{}}
...
]
И моя конечная цель заключается в кусок объектов таким образом, что каждый блок начинается с {:dialogue, %{}}
кортеж.
Изначально у меня был такой код:
stream
|> Stream.chunk_by(fn {type, _} -> type end) # [[dialogue], [info, info], [dialogue]...]
|> Stream.chunk(2) # [[[dialogue], [info, info, info]], [[dialogue], ...]]
Но вскоре я понял, что это упал, когда было два dialogue
кортежи подряд - пара комков больше не дали ожидаемого результата.
В идеале я хотел бы создать какой-то метод, который работает, как:
chunk_when(list, fn({type, record}) -> type == :dialogue end) |> Enum.to_list
=> [[dialogue, info, info, info], [dialogue], [dialogue, info]...]
Но я застрял на том, как сделать это с помощью модуля Stream.
Должно быть какое-то указание Stream.transform/4
или Stream.resource/3
, что заставило бы его работать, но я не могу понять это.
This question - та же идея, но она работает со списками, а не потоками, которые имеют разные API.
Что произойдет, если первый кортеж в потоке «{: info,% {}}'? Или есть предположение, что первым всегда будет '{: dialog,% {}}'? – nietaki
Yep - вся информация относится к предыдущему диалогу, поэтому перечисление всегда начинается с кортежа 'dialog'. – sevenseacat