Sha256: c05e8e7e3338de6b447f31098c8a3958df6f0b91a0e4a7ba3ac7efd8317c9cf1

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

module Dry
  module Monads
    module Do
      # Do notation as a mixin.
      # You can use it in any place in your code, see examples.
      #
      # @example class-level mixin
      #
      #   class CreateUser
      #     extend Dry::Monads::Do::Mixin
      #     extend Dry::Monads[:result]
      #
      #     def self.run(params)
      #       self.call do
      #         values = bind Validator.validate(params)
      #         user = bind UserRepository.create(values)
      #
      #         Success(user)
      #       end
      #     end
      #   end
      #
      # @example using methods defined on Do
      #
      #   create_user = proc do |params|
      #     Do.() do
      #       values = bind validate(params)
      #       user = bind user_repo.create(values)
      #
      #       Success(user)
      #     end
      #   end
      #
      # @api public
      module Mixin
        # @api public
        def call
          yield
        rescue Halt => e
          e.result
        end

        # @api public
        def bind(monads)
          monads = Do.coerce_to_monad(Array(monads))
          unwrapped = monads.map { |result|
            monad = result.to_monad
            monad.or { Do.halt(monad) }.value!
          }
          monads.size == 1 ? unwrapped[0] : unwrapped
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dry-monads-1.3.1 lib/dry/monads/do/mixin.rb
dry-monads-1.3.0 lib/dry/monads/do/mixin.rb