I am using the code below to generate room ids:
reservations = [%{rooms: 1},
%{rooms: 2},
%{rooms: 3}]
{reservations_with_room_numbers, _} =
Enum.reduce(reservations, {[], 0}, fn reservation, {acc, offset} ->
upper_limit = offset+reservation.rooms - 1
room_numbers = Enum.to_list(offset..upper_limit)
reservation_with_room_numbers = Map.put(reservation, :room_numbers, room_numbers)
{[reservation_with_room_numbers|acc], upper_limit + 1}
end)
IO.inspect Enum.reverse(reservations_with_room_numbers)
# =>
# [
# %{room_numbers: [0], rooms: 1}
# %{room_numbers: [1, 2], rooms: 2},
# %{room_numbers: [3, 4, 5], rooms: 3},
# ]
The code above seems too complicated for such a simple task, Is there a simpler way to do the same?
System.unique_integer [:monotonic, :positive]
gives out unique integers starting at 1, However there is no way to reset it after the generation is done, so that it starts from 1 for the next call.