RosettaCodeData/Task/Set-consolidation/Elixir/set-consolidation.elixir

24 lines
746 B
Plaintext

defmodule RC do
def set_consolidate(sets, result\\[])
def set_consolidate([], result), do: result
def set_consolidate([h|t], result) do
case Enum.find(t, fn set -> not MapSet.disjoint?(h, set) end) do
nil -> set_consolidate(t, [h | result])
set -> set_consolidate([MapSet.union(h, set) | t -- [set]], result)
end
end
end
examples = [[[:A,:B], [:C,:D]],
[[:A,:B], [:B,:D]],
[[:A,:B], [:C,:D], [:D,:B]],
[[:H,:I,:K], [:A,:B], [:C,:D], [:D,:B], [:F,:G,:H]]]
|> Enum.map(fn sets ->
Enum.map(sets, fn set -> MapSet.new(set) end)
end)
Enum.each(examples, fn sets ->
IO.write "#{inspect sets} =>\n\t"
IO.inspect RC.set_consolidate(sets)
end)