호두나무 공방/Exercism in Elixir

Wine Cellar - Exercism in Elixir

2022. 4. 12. 23:12

문제 보기

키워드 리스트로 주어지는 와인 리스트를 색으로 필터링한 뒤, 필요한 경우 생산년도와 국가에 따라 추가로 필터링해서 반환하는 코드를 작성하는 문제였다. Enum.map을 써서 필터링하고 Keyword.values로 값만 가져오는 불필요한 구현을 열심히 했는데, 찾아보니 Keyword.get_values 함수로 한번에 다 할 수 있어서 새삼 좋구나 싶었다. 더해서 옵션(생산년도나 국가)이 없는 경우 리스트를 변경 없이 그대로 반환하기 위해 then을 썼다. 다른 사람들의 답을 보니 기본 제공되는 filter_by_year, filter_by_country에 기본값을 추가한 경우가 좀 있던데, 이번에는 기본 구현을 최대한 안 건드리는 쪽으로 구현했음을 적어둔다.

defmodule WineCellar do
  def explain_colors do
    [
      white: "Fermented without skin contact.",
      red: "Fermented with skin contact using dark-colored grapes.",
      rose: "Fermented with some skin contact, but not enough to qualify as a red wine."
    ]
  end

  def filter(cellar, color, opts \\ []) do
    year = Keyword.get(opts, :year)
    country = Keyword.get(opts, :country)

    cellar
    |> Keyword.get_values(color)
    |> then(fn filtered ->
      if is_nil(year), do: filtered, else: filter_by_year(filtered, year)
    end)
    |> then(fn filtered ->
      if is_nil(country), do: filtered, else: filter_by_country(filtered, country)
    end)
  end

  (기본 제공되는 함수들 생략)
end