Guest User

Untitled

a guest
Sep 24th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. # Flatten an array of arbitrarily nested arrays of integers
  2. # into a flat array of integers. e.g. [[1,2,[3]],4] -> [1,2,3,4].
  3.  
  4. # Implementation
  5. module ArrayUtils
  6. class << self
  7. def flatten_integers(array)
  8. raise ArgumentError, "Suplied argument is not an array" unless array.is_a?(Array)
  9. process_all_items(array)
  10. end
  11.  
  12. private
  13.  
  14. def process_all_items(array)
  15. [].tap do |result|
  16. array.each { |item| result.push(*convert_single_item(item)) }
  17. end
  18. end
  19.  
  20. def convert_single_item(item)
  21. if item.is_a?(Array)
  22. process_all_items(item)
  23. elsif item.is_a?(Integer)
  24. item
  25. else
  26. raise ArgumentError, "Unexpected array element: #{item.class}"
  27. end
  28. end
  29. end
  30. end
  31.  
  32. # Behaviour Tests
  33. require 'minitest/autorun'
  34. require 'minitest/spec'
  35.  
  36. describe ArrayUtils do
  37. it "reises ArgumentError when used with invalid arguments" do
  38. expect { ArrayUtils.flatten_integers() }.must_raise(ArgumentError)
  39. expect { ArrayUtils.flatten_integers(1) }.must_raise(ArgumentError)
  40. expect { ArrayUtils.flatten_integers('string') }.must_raise(ArgumentError)
  41. expect { ArrayUtils.flatten_integers(nil) }.must_raise(ArgumentError)
  42. expect { ArrayUtils.flatten_integers([1, nil]) }.must_raise(ArgumentError)
  43. expect { ArrayUtils.flatten_integers([1, 'string']) }.must_raise(ArgumentError)
  44. expect { ArrayUtils.flatten_integers([1, 1.1]) }.must_raise(ArgumentError)
  45. expect { ArrayUtils.flatten_integers([1, 2, ['string']]) }.must_raise(ArgumentError)
  46. end
  47.  
  48. it "works with integer arrays" do
  49. ArrayUtils.flatten_integers([]).must_equal([])
  50. ArrayUtils.flatten_integers([1]).must_equal([1])
  51. ArrayUtils.flatten_integers([1, 2]).must_equal([1, 2])
  52. ArrayUtils.flatten_integers([1, 2, [3]]).must_equal([1, 2, 3])
  53. ArrayUtils.flatten_integers([[1, 2, [3]], 4]).must_equal([1, 2, 3, 4])
  54. end
  55. end
Add Comment
Please, Sign In to add comment