# paulfioravanti's solution

## to Flatten Array in the Elixir Track

Published at Aug 18 2019 · 0 comments
Instructions
Test suite
Solution

Take a nested list and return a single flattened list with all values except nil/null.

The challenge is to write a function that accepts an arbitrarily-deep nested list-like structure and returns a flattened structure without any nil/null values.

For Example

input: [1,[2,3,null,4],[null],5]

output: [1,2,3,4,5]

## Running tests

Execute the tests with:

``````\$ mix test
``````

### Pending tests

In the test suites, all but the first test have been skipped.

Once you get a test passing, you can unskip the next one by commenting out the relevant `@tag :pending` with a `#` symbol.

For example:

``````# @tag :pending
test "shouting" do
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
end
``````

Or, you can enable all the tests by commenting out the `ExUnit.configure` line in the test suite.

``````# ExUnit.configure exclude: :pending, trace: true
``````

If you're stuck on something, it may help to look at some of the available resources out there where answers might be found.

## Source

Interview Question https://reference.wolfram.com/language/ref/Flatten.html

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### flatten_array_test.exs

``````defmodule FlattenArrayTest do
use ExUnit.Case

test "returns original list if there is nothing to flatten" do
assert FlattenArray.flatten([1, 2, 3]) == [1, 2, 3]
end

@tag :pending
test "flattens an empty nested list" do
assert FlattenArray.flatten([[]]) == []
end

@tag :pending
test "flattens a nested list" do
assert FlattenArray.flatten([1, [2, [3], 4], 5, [6, [7, 8]]]) == [1, 2, 3, 4, 5, 6, 7, 8]
end

@tag :pending
test "removes nil from list" do
assert FlattenArray.flatten([1, nil, 2]) == [1, 2]
end

@tag :pending
test "removes nil from a nested list" do
assert FlattenArray.flatten([1, [2, nil, 4], 5]) == [1, 2, 4, 5]
end

@tag :pending
test "returns an empty list if all values in nested list are nil" do
assert FlattenArray.flatten([nil, [nil], [nil, [nil]]]) == []
end
end``````

### test_helper.exs

``````ExUnit.start()
ExUnit.configure(exclude: :pending, trace: true)``````
``````defmodule FlattenArray do
@doc """
Accept a list and return the list flattened without nil values.

## Examples

iex> FlattenArray.flatten([1, [2], 3, nil])
[1,2,3]

iex> FlattenArray.flatten([nil, nil])
[]

"""

@spec flatten(list) :: list
def flatten(list), do: flatten(list, [])

defp flatten([], acc), do: acc
defp flatten([nil | tail], acc), do: flatten(tail, acc)

acc = flatten(tail, acc)
end

end``````