Skip to content
Sourav Chatterjee edited this page Mar 11, 2019 · 5 revisions

Filtering a Collection with Pattern Matching

iex(33)> test                                   
[ok: %{"a" => "one"}, error: %{"b" => "two"}]
iex(34)> Enum.filter(test, &match?({:ok, _},&1))
[ok: %{"a" => "one"}]
Instead of match 
    test |> Enum.filter(fn
      {:ok, _value} -> true
      _ -> false
    end)

Filter and Map and Extract nth Element of Tuple

iex(43)> test                                                                                  
[ok: %{"a" => "one"}, error: %{"b" => "two"}]
iex(44)> test |> Enum.filter(&match?({:ok, _},&1)) |> Enum.map(&(&1 |> elem(1)))
[%{"a" => "one"}]

Executing Anonymous function in a pipeline

  data 
   |> Enum.map(&elem(&1, 1))
   |> write_poi
   |> (fn
         {:ok, data} -> IO.puts("Wrote #{Enum.count(data)} records succesfully")
         _ -> IO.puts("Failed to write records to File")
       end).()

Extracting Data One wants from JSON Responses. Use Sigils!

  @expected_fields ~w(
    login id avatar_url gravatar_id url html_url followers_url
    following_url gists_url starred_url subscriptions_url
    organizations_url repos_url events_url received_events_url type
    site_admin name company blog location email hireable bio
    public_repos public_gists followers following created_at updated_at
  )

  def process_request_url(url) do
    "https://api.github.com" <> url
  end

  def process_response_body(body) do
    body
    |> Poison.decode!
    |> Map.take(@expected_fields)
    |> Enum.map(fn({k, v}) -> {String.to_atom(k), v} end)
  end
end

Clone this wiki locally