Редактировать: неправильно понятый вопрос
Так что, если вы хотите сгенерировать комбинации с использованием рекурсии, я полагаю, вы могли бы передать свои аргументы (камеры, серверы, годы) в виде вложенного списка и рекурсивно построить комбинации (использоватьпервый список (камеры) и создайте список, передав остальные списки (серверы и годы) и т. д.).
Это имеет то преимущество, что вы можете передавать произвольное количество элементов или списков, и этобудет создавать комбинации вместо добавления еще одного уровня Enum.each
, когда вы хотите добавить еще один уровень в URL.
defmodule Test do
def perm(input, acc \\ [])
def perm([], acc), do: acc
def perm([first_arr | rest_arr], acc) do
first_arr
|> Enum.map(fn val ->
perm(rest_arr, [val | acc])
end)
end
def flat([fst | rst]) when is_list(fst) do
case fst do
[fst1 | _rst1] when is_list(fst1) -> flat(fst ++ rst)
_ -> [fst] ++ flat(rst)
end
end
def flat(other), do: other
end
cameras = ["gaol-yard", "gaol-yard-1", "gaol-yard-2"]
years = ["2015", "2016", "2017", "2018", "2019"]
servers = ["seaweedfs_new", "seaweedfs_old", "seaweedfs_oldest"]
# input = [[1,2,3], [:a,:b,:c], [5.0, 6.0, 7.0]]
[cameras, years, servers] \
|> Test.perm() \
|> Test.flat \
|> Enum.map(&Enum.reverse/1)
Это должно сгенерировать что-то вроде
[
["gaol-yard", "2015", "seaweedfs_new"],
["gaol-yard", "2015", "seaweedfs_old"],
["gaol-yard", "2015", "seaweedfs_oldest"],
["gaol-yard", "2016", "seaweedfs_new"],
["gaol-yard", "2016", "seaweedfs_old"],
["gaol-yard", "2016", "seaweedfs_oldest"],
...
"gaol-yard-1", "2015", "seaweedfs_old"],
["gaol-yard-1", "2015", "seaweedfs_oldest"],
["gaol-yard-1", "2016", "seaweedfs_new"],
...
["gaol-yard-2", "2019", "seaweedfs_new"],
["gaol-yard-2", "2019", "seaweedfs_old"],
["gaol-yard-2", "2019", "seaweedfs_oldest"]
]
, которое выможет объединяться в одну строку каждый