diff --git a/lib/dry/monads/try.rb b/lib/dry/monads/try.rb index 63ee16c..9f47468 100644 --- a/lib/dry/monads/try.rb +++ b/lib/dry/monads/try.rb @@ -186,7 +186,7 @@ class Error < Try def initialize(exception) super() - @exception = exception + @exception = @value = exception end # @return [String] diff --git a/spec/integration/pattern_matching_spec.rb b/spec/integration/pattern_matching_spec.rb index 2c8bc94..81ff174 100644 --- a/spec/integration/pattern_matching_spec.rb +++ b/spec/integration/pattern_matching_spec.rb @@ -1,6 +1,57 @@ # frozen_string_literal: true RSpec.describe "pattern matching" do + describe "Dry::Monads::Try" do + include Dry::Monads[:try] + + context "Value" do + it "matches on the singleton array of the value when value is not an array" do + expect( + (Value(1) in [1]) + ).to be(true) + end + + it "matches on the value when value is an array" do + expect( + (Value([1]) in [1]) + ).to be(true) + end + + it "matches on the empty array when value is Unit" do + expect( + (Value(Dry::Monads::Unit) in []) + ).to be(true) + end + + it "matches on the value's keys when value acts like a hash" do + expect( + (Value({code: 101, foo: :bar}) in { code: 101 }) + ).to be(true) + end + + it "matches on the empty hash when value doesn't act like a hash" do + expect( + (Value(:foo) in {}) + ).to be(true) + end + end + + context "Error" do + it "matches on the singleton array of the exception" do + exception = StandardError.new("boom") + failure = Try { raise exception } + + expect( + (failure in [exception]) + ).to be(true) + + expect( + (failure in Dry::Monads::Try::Error(exception)) + ).to be(true) + end + end + end + describe "Dry::Monads::Result" do include Dry::Monads[:result]