module Dry::Monads::Do::Mixin

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

Public Instance Methods

bind(monads) click to toggle source

@api public

# File lib/dry/monads/do/mixin.rb, line 46
def bind(monads)
  monads = Do.coerce_to_monad(Array(monads))
  unwrapped = monads.map do |result|
    monad = result.to_monad
    monad.or { Do.halt(monad) }.value!
  end
  monads.size == 1 ? unwrapped[0] : unwrapped
end
call() { || ... } click to toggle source

@api public

# File lib/dry/monads/do/mixin.rb, line 39
def call
  yield
rescue Halt => e
  e.result
end