diff --git a/lib/monads/many.rb b/lib/monads/many.rb index f49a5b5..8d1af3e 100644 --- a/lib/monads/many.rb +++ b/lib/monads/many.rb @@ -13,7 +13,7 @@ def initialize(values) def and_then(&block) block = ensure_monadic_result(&block) - Many.new(values.map(&block).flat_map(&:values)) + Many.new values.map(&block).map(&:values).flatten(1) end def respond_to_missing?(method_name, include_private = false) @@ -21,7 +21,11 @@ def respond_to_missing?(method_name, include_private = false) end def self.from_value(value) - Many.new([value]) + if value.respond_to? :each + Many.new(value) + else + Many.new([value]) + end end end end diff --git a/spec/monads/many_spec.rb b/spec/monads/many_spec.rb index bc14795..a5493c0 100644 --- a/spec/monads/many_spec.rb +++ b/spec/monads/many_spec.rb @@ -126,5 +126,21 @@ module Monads end end end + + describe "unpacking nested many values" do + let(:expected_values) { %w(1984 Hamlet Macbeth) } + let(:orwel_books) { [double(:book, title: '1984')] } + let(:shakespeare_books) { [double(:book, title: 'Hamlet'), double(:book, title: 'Macbeth')] } + let(:values) { [double(:orwell, books: orwel_books), double(:shakespeare, books: shakespeare_books)] } + + it { expect(many.books.title.values).to eq expected_values } + end + + describe "respecting deeply nested arrays when unpacking only a few levels" do + let(:expected_values) { [:a, [:b, :c], :d, [:e, :f]] } + let(:values) { [[1, :a], [2, [:b, :c]], [3, :d], [4, [:e, :f]]] } + + it { expect(many.slice(1, 1).values).to eq expected_values } + end end end