Skip to content

Instantly share code, notes, and snippets.

@minhajuddin
Last active December 26, 2016 09:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minhajuddin/d17e682525141168ee423b9a5180ed56 to your computer and use it in GitHub Desktop.
Save minhajuddin/d17e682525141168ee423b9a5180ed56 to your computer and use it in GitHub Desktop.
Flatten
defmodule Flat do
# [ 1 , 2, 3, [ 1, 2]]
def flatten(list) do
flatten(list, [])
end
def flatten([h|t], acc_list) when is_list(h) do
# this may be expensive!
flatten(h ++ t, acc_list)
end
def flatten([h|t], acc_list) do
flatten(t, [h|acc_list])
end
def flatten([], acc_list) do
Enum.reverse(acc_list)
end
end
ExUnit.start
defmodule FlatTest do
use ExUnit.Case
test "should flatten multiple nested list" do
assert Flat.flatten([1 , 2, 3, [ 11, 12, [:a, :b, [33, 44], :bar], 99], :awesome]) == [1, 2, 3, 11, 12, :a, :b, 33, 44, :bar, 99, :awesome]
end
test "should flatten an already flat list" do
assert Flat.flatten([1 , 2, :awesome]) == [1 , 2, :awesome]
end
test "should flatten nested empty arrays" do
assert Flat.flatten([1 , 2, [[], [], []], :awesome]) == [1 , 2, :awesome]
end
end
class Flatten
def self.flatten(array)
out = []
array.each do |el|
if el.is_a?(Array)
out = out + flatten(el)
else
out << el
end
end
out
end
end
require 'minitest/autorun'
class FlattenTest < Minitest::Test
def test_without_nesting
assert_equal Flatten.flatten([1, 3, 4]), [1, 3, 4]
assert_equal Flatten.flatten([]), []
end
def test_simple_nesting
assert_equal Flatten.flatten([1, 3, [4]]), [1, 3, 4]
assert_equal Flatten.flatten([1, [3], [4]]), [1, 3, 4]
end
def test_deep_nesting
assert_equal Flatten.flatten([1, [3, [5, [4, 20, [44, []]]]], [4]]), [1, 3, 5, 4, 20, 44, 4]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment