У меня есть список дат, которые представляют бронирование для комнаты.Я хочу иметь возможность узнать, где находится первый доступный день в диапазоне дат.
# let us assume today is the 1st Feb
today = #DateTime<2019-02-01 00:00:00Z>
# here are our booked days
booked_days = [
#DateTime<2019-02-08 00:00:00Z>,
#DateTime<2019-02-05 00:00:00Z>,
#DateTime<2019-02-03 00:00:00Z>,
#DateTime<2019-02-02 00:00:00Z>
]
То, что мы хотели бы вернуть, это #DateTime<2019-02-04 00:00:00Z>
, потому что это первая доступная дата.
Я смотрел на что-то подобное, используя Enum.reduce_while
в сочетании с Timex.Interval
, но безуспешно, поскольку reduce_while
, похоже, возвращает интервал после первого вызова.
today = Timex.now() |> Timex.beginning_of_day()
first_available =
Enum.reduce_while(booked_days, today, fn from, until ->
interval = Timex.Interval.new(from: from, until: until)
duration = Timex.Interval.duration(interval, :days)
if duration <= 1,
do: {:cont, from},
else: {:halt, interval}
end)