키워드 리스트로 주어지는 와인 리스트를 색으로 필터링한 뒤, 필요한 경우 생산년도와 국가에 따라 추가로 필터링해서 반환하는 코드를 작성하는 문제였다. 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
'호두나무 공방 > Exercism in Elixir' 카테고리의 다른 글
Resistor Color Duo - Exercism in Elixir (0) | 2022.04.13 |
---|---|
Resistor Color - Exercism in Elixir (0) | 2022.04.13 |
Take-A-Number - Exercism in Elixir (0) | 2022.04.11 |
DNA Encoding - Exercism in Elixir (0) | 2022.04.06 |
Name Badge - Exercism in Elixir (0) | 2022.04.06 |