У меня есть следующие две функции:
defp select_previous_scheduled_price(scheduled_prices, date) do
if length(scheduled_prices) > 1 do
before_prices = Enum.filter(scheduled_prices, &starts_before(&1, date))
if !Enum.empty?(before_prices) do
hd(before_prices)
else
nil
end
else
nil
end
end
defp select_next_scheduled_price(scheduled_prices, date) do
if length(scheduled_prices) >= 1 do
after_prices = Enum.filter(scheduled_prices, &starts_after(&1, date))
if !Enum.empty?(after_prices) do
hd(after_prices)
else
nil
end
else
nil
end
end
Есть два различия: 1. Операторы во второй строке (т. Е. >
против >=
); и 2. Функция, вызванная для фильтрации в третьей строке3 (т. е. &starts_before/2
против &starts_after/2
)
Поскольку различия представляют собой операторы, а не функции и функции, к которым должны применяться как локальные, так и параметризованные значения, Мне не совсем ясно, может ли это быть учтено или нет.
Другими словами, я хотел бы сделать решение таким (только на самом деле функциональным, чего не будет):
defp select_previous_scheduled_price(scheduled_prices, date) do
select_scheduled_price(scheduled_prices, date, >, &starts_before/2)
end
defp select_next_scheduled_price(scheduled_prices, date) do
select_scheduled_price(scheduled_prices, date, >=, &starts_after/2)
end
defp select_scheduled_price(scheduled_prices, date, meets_length_criteria, filter_criteria) do
if meets_length_criteria(scheduled_prices, 1) do
qualified_prices = Enum.filter(scheduled_prices, &filter_criteria(&1, date))
if !Enum.empty?(qualified_prices) do
hd(qualified_prices)
else
nil
end
else
nil
end
end
Есть идеи, как сделать эту работу?
Спасибо!