Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Flatten an array of arbitrarily nested arrays of integers
- # into a flat array of integers. e.g. [[1,2,[3]],4] -> [1,2,3,4].
- # Implementation
- module ArrayUtils
- class << self
- def flatten_integers(array)
- raise ArgumentError, "Suplied argument is not an array" unless array.is_a?(Array)
- process_all_items(array)
- end
- private
- def process_all_items(array)
- [].tap do |result|
- array.each { |item| result.push(*convert_single_item(item)) }
- end
- end
- def convert_single_item(item)
- if item.is_a?(Array)
- process_all_items(item)
- elsif item.is_a?(Integer)
- item
- else
- raise ArgumentError, "Unexpected array element: #{item.class}"
- end
- end
- end
- end
- # Behaviour Tests
- require 'minitest/autorun'
- require 'minitest/spec'
- describe ArrayUtils do
- it "reises ArgumentError when used with invalid arguments" do
- expect { ArrayUtils.flatten_integers() }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers(1) }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers('string') }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers(nil) }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers([1, nil]) }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers([1, 'string']) }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers([1, 1.1]) }.must_raise(ArgumentError)
- expect { ArrayUtils.flatten_integers([1, 2, ['string']]) }.must_raise(ArgumentError)
- end
- it "works with integer arrays" do
- ArrayUtils.flatten_integers([]).must_equal([])
- ArrayUtils.flatten_integers([1]).must_equal([1])
- ArrayUtils.flatten_integers([1, 2]).must_equal([1, 2])
- ArrayUtils.flatten_integers([1, 2, [3]]).must_equal([1, 2, 3])
- ArrayUtils.flatten_integers([[1, 2, [3]], 4]).must_equal([1, 2, 3, 4])
- end
- end
Add Comment
Please, Sign In to add comment