About dry-monads, consider this:
require 'dry-monads' include Dry::Monads::Either::Mixin def call find_by_x .or(find_by_y) .or(create_new) end def find_by_x if @condition Right('x') else Left(nil) end end def find_by_y if @condition Right('y') else Left(nil) end end def create_new p "create_new called" Right('z') end # use case 1: @condition = false call "create_new called" => Right("z") # use case 2: @condition = true call "create_new called" => Right("x")
The results in both use cases are as expected.
What confuses me is that in both cases the
#create_new method was called.
In docs there is a description that
#or works opposite to
#bind. Bind skips execution when Left occurs. Shouldn’t
#or skip execution when Right occurs? Is is a desired behaviour or a bug? Can You help me understand that?