You can do it with a sentinel value, since each step of Stream.transform can emit multiple results:
|> Stream.transform(
fn -> 0 end,
fn
{:atom, a}, atom_count when atom_count+1 < wanted_atoms ->
{[a], atom_count+1}
{:atom, a}, _atom_count ->
{[a, :__no_more_atoms], :ok}
{_, v}, atom_count ->
{[v], atom_count}
end,
fn _ -> :ok end
)
|> Stream.take_while(& &1 != :__no_more_atoms)
The transform produces a stream with an extra value on the end when the last wanted atom is seen, then take_while snips it off and terminates the stream.


















