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?

2 Answers

Use :

iex(1)> {[:ok, :ok, :ok], [1, 1, 3]} |> elem(1) [1, 1, 3] 
1

Pattern Match can help

{ _status, required_value } = data |> Enum.map(&Map.fetch(colors, &1)) |> Enum.unzip 

You can ignore the _status.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.