Did you challenged a senior developer?
defmodule Example do
def sample(list, opts \\ [skip: true])
# uncomment if empty list is could be passed as an input
def sample([], _opts), do: []
# uncomment if empty list could be a first element
def sample([[] | tail], opts), do: sample(tail, opts)
# uncomment if list could contain only one element list
def sample([list], _opts), do: Enum.map(list, &List.wrap/1)
# in any other case
def sample(list, opts) do
if opts[:skip], do: sample_with_skip(list), else: sample_without_skip(list)
end
# skip empty elements in root list
def sample_with_skip(list) do
for sub_list <- list, reduce: [] do
# skip empty elements in root list
data when sub_list == [] ->
data
# passing a first element of root list as data
[] ->
sub_list
data ->
for sub_data <- data, element <- sub_list do
[element | List.wrap(sub_data)]
end
end
|> Enum.map(&Enum.reverse/1)
end
# alternatively do not skip empty elements in root list
def sample_without_skip(list) do
for sub_list <- list, reduce: [] do
# when element is empty list set data to nil
_data when sub_list == [] ->
nil
# no matter what happens later if data is nil keep it as is
nil ->
nil
# passing a first element of root list as data
[] ->
sub_list
data ->
for sub_data <- data, element <- sub_list do
[element | List.wrap(sub_data)]
end
end
|> case do
nil -> []
list -> Enum.map(list, &Enum.reverse/1)
end
end
end
Pretty much the same as Enum.reduce/3
version. Simply pattern-matching here is not only in function clause, but also in for …, reduce: … clauseend
notation.
However this looks like an art for art's sake
. Just look how simple is raw pattern-matching comparing to 2 other versions of my solution.