I want to be able to extract the Nth item of a tuple in a pipeline, without using with
or otherwise breaking up the pipeline. Enum.at
would work perfectly except for the fact that a tuple is not an enum.
Here's a motivating example:
colors = %{red: 1, green: 2, blue: 3}
data = [:red, :red, :blue]
data
|> Enum.map(&Map.fetch(colors, &1))
|> Enum.unzip
This returns {[:ok, :ok, :ok], [1, 1, 3]}
and let's say I just want to extract [1, 1, 3]
(For this specific case I could use fetch!
but for my actual code that doesn't exist.)
I could add on
|> Tuple.to_list
|> Enum.at(1)
Is there a better way of doing this that doesn't require creating a temporary list out of each tuple?
Use Kernel.elem/2
:
iex(1)> {[:ok, :ok, :ok], [1, 1, 3]} |> elem(1)
[1, 1, 3]